diff --git a/docker-compose.yml b/docker-compose.yml index 7893e5386..cfcc9a722 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -273,14 +273,14 @@ services: args: - CACHEBUST environment: - - PUBLIC_URL=http://127.0.0.1:3000 + - PUBLIC_URL=http://127.0.0.1:5173 - REACT_APP_SACH_API_URL=https://sach-server.factly.in - - WDS_SOCKET_HOST=127.0.0.1 + - VITE_WS_HOST=127.0.0.1 - CHOKIDAR_USEPOLLING=true - WATCHPACK_POLLING=true - NODE_ENV=development ports: - - "3000:3000" + - "5173:5173" volumes: - type: bind source: ./studio diff --git a/server/service/route.go b/server/service/route.go index 3f0603c58..e826becd3 100644 --- a/server/service/route.go +++ b/server/service/route.go @@ -44,7 +44,7 @@ func RegisterRoutes() http.Handler { if viper.IsSet("mode") && viper.GetString("mode") == "development" { r.Use(cors.Handler(cors.Options{ - AllowedOrigins: []string{"http://localhost:3000"}, + AllowedOrigins: []string{"http://localhost:3000", "http://localhost:5173"}, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"*"}, ExposedHeaders: []string{"*"}, diff --git a/server/util/scooter.go b/server/util/scooter.go index aaa8c210b..899c6f4f6 100644 --- a/server/util/scooter.go +++ b/server/util/scooter.go @@ -2,6 +2,8 @@ package util import ( "encoding/json" + "errors" + "strings" "github.com/jinzhu/gorm/dialects/postgres" ) @@ -11,20 +13,47 @@ type Description struct { JSON postgres.Jsonb } +func hasKeyCaseInsensitive(data map[string]json.RawMessage, key string) bool { + for k := range data { + if strings.EqualFold(k, key) { + return true + } + } + return false +} + func GetDescriptionHTML(jsonData postgres.Jsonb) (string, error) { + var raw map[string]json.RawMessage + if err := json.Unmarshal(jsonData.RawMessage, &raw); err != nil { + return "", err + } + + if !hasKeyCaseInsensitive(raw, "html") || !hasKeyCaseInsensitive(raw, "json") { + return "", errors.New("missing required fields 'html' or 'json'") + } + var description Description - err := json.Unmarshal(jsonData.RawMessage, &description) - if err != nil { + if err := json.Unmarshal(jsonData.RawMessage, &description); err != nil { return "", err } + return description.HTML, nil } func GetJSONDescription(jsonData postgres.Jsonb) (postgres.Jsonb, error) { + var raw map[string]json.RawMessage + if err := json.Unmarshal(jsonData.RawMessage, &raw); err != nil { + return postgres.Jsonb{}, err + } + + if !hasKeyCaseInsensitive(raw, "html") || !hasKeyCaseInsensitive(raw, "json") { + return postgres.Jsonb{}, errors.New("missing required fields 'html' or 'json'") + } + var description Description - err := json.Unmarshal(jsonData.RawMessage, &description) - if err != nil { + if err := json.Unmarshal(jsonData.RawMessage, &description); err != nil { return postgres.Jsonb{}, err } + return description.JSON, nil } diff --git a/studio/ .dockerignore b/studio/ .dockerignore deleted file mode 100644 index 56e814640..000000000 --- a/studio/ .dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -build -.dockerignore -Dockerfile -Dockerfile.prod \ No newline at end of file diff --git a/studio/.gitignore b/studio/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/studio/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/studio/.npmrc b/studio/.npmrc deleted file mode 100644 index 521a9f7c0..000000000 --- a/studio/.npmrc +++ /dev/null @@ -1 +0,0 @@ -legacy-peer-deps=true diff --git a/studio/.prettierignore b/studio/.prettierignore deleted file mode 100644 index dd87e2d73..000000000 --- a/studio/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -build diff --git a/studio/.prettierrc b/studio/.prettierrc deleted file mode 100644 index 695ba2a48..000000000 --- a/studio/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "printWidth": 100, - "trailingComma": "all", - "tabWidth": 2, - "semi": true, - "singleQuote": true, - "endOfLine": "auto" -} diff --git a/studio/CODE_OF_CONDUCT.md b/studio/CODE_OF_CONDUCT.md deleted file mode 100644 index dca84c156..000000000 --- a/studio/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -- The use of sexualized language or imagery and unwelcome sexual attention or - advances -- Trolling, insulting/derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic - address, without explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at admin@factly.in. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/studio/Dockerfile b/studio/Dockerfile index 8a70058b1..4bd11b229 100644 --- a/studio/Dockerfile +++ b/studio/Dockerfile @@ -1,18 +1,20 @@ -# pull official base image +# Use Node.js LTS version FROM node:18-alpine -# set working directory -ARG CACHEBUST=100 - +# Set working directory WORKDIR /app -# install app dependencies -COPY package.json ./ -COPY package-lock.json ./ +# Copy package files +COPY package.json package-lock.json* ./ + +# Install dependencies RUN npm install --legacy-peer-deps -# add app -COPY . ./ -EXPOSE 3000 -# start app -CMD ["npm", "start"] \ No newline at end of file +# Copy all files +COPY . . + +# Expose Vite's default port +EXPOSE 5173 + +# Start Vite development server with host flag +CMD ["npm", "run", "dev", "--", "--host"] \ No newline at end of file diff --git a/studio/Dockerfile.prod b/studio/Dockerfile.prod index b80e2891e..9d9ae0f33 100644 --- a/studio/Dockerfile.prod +++ b/studio/Dockerfile.prod @@ -12,7 +12,7 @@ RUN npm run build # production environment FROM nginx:stable-alpine -COPY --from=build /app/build /usr/share/nginx/html +COPY --from=build /app/dist /usr/share/nginx/html COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/studio/LICENSE b/studio/LICENSE deleted file mode 100644 index 71ae53bb6..000000000 --- a/studio/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2020 Factly Media & Research - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/studio/README.md b/studio/README.md index 54d1893f5..74872fd4a 100644 --- a/studio/README.md +++ b/studio/README.md @@ -1,31 +1,50 @@ -# Dega Admin Portal - -### Setup: - -Clone the repo: `git clone https://github.com/factly/dega-studio.git`
-Install dependencies: `npm i` - -### To start the development server:
- -`npm start` from the root of the folder
-Opens in [http://localhost:3000](http://localhost:3000) - -### To run tests:
- -`npm test` - -### To generate test coverage:
- -`npm test -- --coverage`
-Generates a `coverage` folder. Open `index.html` in browser. - -### To build code for production:
- -`npm run build`
-Bundles React in production mode and optimizes the build for the best performance. - -**Releasability:** [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=alert_status)](https://sonarcloud.io/dashboard?id=factly_dega-studio) -**Reliability:** [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=factly_dega-studio) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=bugs)](https://sonarcloud.io/dashboard?id=factly_dega-studio) -**Security:** [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=security_rating)](https://sonarcloud.io/dashboard?id=factly_dega-studio) [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=factly_dega-studio) -**Maintainability:** [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=factly_dega-studio) [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=sqale_index)](https://sonarcloud.io/dashboard?id=factly_dega-studio) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=code_smells)](https://sonarcloud.io/dashboard?id=factly_dega-studio) -**Other:** [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=ncloc)](https://sonarcloud.io/dashboard?id=factly_dega-studio) [![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=duplicated_lines_density)](https://sonarcloud.io/dashboard?id=factly_dega-studio) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=factly_dega-studio&metric=coverage)](https://sonarcloud.io/dashboard?id=factly_dega-studio) +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/studio/commitlint.config.js b/studio/commitlint.config.js deleted file mode 100644 index 422b19445..000000000 --- a/studio/commitlint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/studio/components.json b/studio/components.json new file mode 100644 index 000000000..027fe78f0 --- /dev/null +++ b/studio/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/App.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/studio/e2e_tests/.gitignore b/studio/e2e_tests/.gitignore deleted file mode 100644 index f8048ca1a..000000000 --- a/studio/e2e_tests/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules/ -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ diff --git a/studio/e2e_tests/README.md b/studio/e2e_tests/README.md deleted file mode 100644 index c19d362d4..000000000 --- a/studio/e2e_tests/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Dega test cases with Playwright - -## Setting up testing environment for Playwright - -### Pre-requisites - -Before you begin writing test cases with Playwright, ensure you have the following prerequisite: - -- Node.js: Playwright requires Node.js. Download and install the latest version from Node.js official website. - -### Starting the application - -- Execute the following command to install Playwright: - ``` - npm install @playwright/test - ``` -- Execute the following command to run the tests: - ``` - npx playwright test - ``` -- Execute the following command to run a single test file (for example to run a file with name example.spec.js) - - ``` - npx playwright test tests/example.spec.js - ``` - -- Execute the following command to run all the test cases in a particular folder ( Suppose you have a folder named tests in your project directory containing all your test cases ) - - ``` - npx playwright test tests/example.spec.js - ``` - -* Execute the following command to run your tests in headed mode, use the --headed flag. This will give you the ability to visually see how Playwright interacts with the website. - - ``` - npx playwright test tests/example.spec.js --headed - ``` - -* To run the tests in desired speed, add slowmo to the launchOptions in the playwright config file - - ``` - launchOptions: { - slowMo: 2000, - }, - ``` - -### Important keywords - -- Assertions: Statements that check if a condition is true. Playwright uses the expect API for assertions. - -- Headless Mode: Running a browser in headless mode means running without a graphical user interface. This is useful for automated testing. - -- Selectors: Patterns used to select elements on a web page. Playwright supports various selectors like CSS, XPath, and text selectors. - -### Env files to be added - -- Create a `.env` file in the root folder for environment variables (for eg see .env) -- To make environment variables easier to manage, we have .env files. Use dotenv package to read environment variables directly in the configuration file. - - ``` - import dotenv from 'dotenv'; - - // Read from default ".env" file. - dotenv.config(); - ``` diff --git a/studio/e2e_tests/old-1.0.0.tgz b/studio/e2e_tests/old-1.0.0.tgz deleted file mode 100644 index 0891b5783..000000000 Binary files a/studio/e2e_tests/old-1.0.0.tgz and /dev/null differ diff --git a/studio/e2e_tests/package-lock.json b/studio/e2e_tests/package-lock.json deleted file mode 100644 index 22cc8702b..000000000 --- a/studio/e2e_tests/package-lock.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "name": "old", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "old", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "axe-core": "^4.9.1", - "dotenv": "^16.4.5", - "playwright": "^1.44.1" - }, - "devDependencies": { - "@playwright/test": "^1.44.1", - "@types/node": "^20.12.12" - } - }, - "node_modules/@playwright/test": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", - "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", - "dev": true, - "dependencies": { - "playwright": "1.44.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/playwright": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", - "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", - "dependencies": { - "playwright-core": "1.44.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", - "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "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==", - "dev": true - } - }, - "dependencies": { - "@playwright/test": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", - "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", - "dev": true, - "requires": { - "playwright": "1.44.1" - } - }, - "@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==" - }, - "dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "playwright": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", - "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.44.1" - } - }, - "playwright-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", - "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==" - }, - "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==", - "dev": true - } - } -} diff --git a/studio/e2e_tests/package.json b/studio/e2e_tests/package.json deleted file mode 100644 index b9670cceb..000000000 --- a/studio/e2e_tests/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "old", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": {}, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@playwright/test": "^1.44.1", - "@types/node": "^20.12.12" - }, - "dependencies": { - "axe-core": "^4.9.1", - "dotenv": "^16.4.5", - "playwright": "^1.44.1" - } -} diff --git a/studio/e2e_tests/playwright.config.js b/studio/e2e_tests/playwright.config.js deleted file mode 100644 index 25329ec16..000000000 --- a/studio/e2e_tests/playwright.config.js +++ /dev/null @@ -1,80 +0,0 @@ -// @ts-check -const { defineConfig, devices } = require('@playwright/test'); -require('dotenv').config(); - -const isProduction = process.env.NODE_ENV === 'production'; -const isDevelopment = process.env.NODE_ENVI === 'development'; - -/** - * @see https://playwright.dev/docs/test-configuration - */ -module.exports = defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: isDevelopment ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - headless: !isProduction, - trace: 'retain-on-failure', - launchOptions: { - slowMo: 1000, - }, - video: 'retain-on-failure', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - /*{ - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - },*/ - { - name: 'e2e_tests', - testDir: './studio/e2e_tests', - testMatch: /.*.spec.js/, - }, - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // url: 'http://127.0.0.1:3000', - // reuseExistingServer: !process.env.CI, - // }, -}); diff --git a/studio/e2e_tests/state.json b/studio/e2e_tests/state.json deleted file mode 100644 index dbdf54405..000000000 --- a/studio/e2e_tests/state.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "cookies": [ - { - "name": "csrf_token_2d785ea2f6536900108362e9bfff73eef3a32be3921b3abc74b0a990093487c9", - "value": "KQr67xkCHozAtPwFoMDZOYnsrNacsJCEaaw8rJweirk=", - "domain": "127.0.0.1", - "path": "/", - "expires": 1750319998, - "httpOnly": true, - "secure": false, - "sameSite": "Lax" - }, - { - "name": "ory_kratos_session", - "value": "MTcxODc4Mzk5OHxybk1OVWM1Q3Fsenc3enlFT25qTmZIM1otbmRydnpJdkpEdTladzdmN0JHUHJveGlYVGtkcVZDd0ZFMWZDQVg4TXNUMkgzamprNExDeWlSb3FHenVwZ3BiZUlCTW5lQTlrY295aC1id25INVF0b0FGdV9SQXJUWGFBQ0FELWN1VmpjWkduajV2UVE9PXxzRRs_xys9w4_5qeDGvEqMZdZBfOPR4ub5bL03d1DoTw==", - "domain": "127.0.0.1", - "path": "/", - "expires": 1718870398, - "httpOnly": true, - "secure": false, - "sameSite": "Lax" - } - ], - "origins": [ - { - "origin": "http://127.0.0.1:4455", - "localStorage": [ - { - "name": "returnTo", - "value": "http://127.0.0.1:4455/.factly/dega/studio/" - }, - { - "name": "space", - "value": "1" - } - ] - } - ] -} diff --git a/studio/e2e_tests/tests/categories.spec.js b/studio/e2e_tests/tests/categories.spec.js deleted file mode 100644 index be214f87a..000000000 --- a/studio/e2e_tests/tests/categories.spec.js +++ /dev/null @@ -1,310 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}categories?sort=desc&limit=10&page=1`); -}); - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -let createdCategoryName = ''; // Define a global variable to store the created category name -let editedCategoryName = ''; // Define a global variable to store the edited category name - -test.only('should create category successfully', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new category name with the random string into the input field - createdCategoryName = `This is a test category ${randomString}`; - await page.type('#create-category_name', createdCategoryName); - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Category created' - expect(successMessage).toBe('Category created'); -}); - -test.only('should edit a category successfully', async ({ page }) => { - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - editedCategoryName = `This is an edited test category ${randomString}`; - const categorySelector = `text=${createdCategoryName}`; - let categoryFound = false; - let pageIndex = 1; - // Function to check if the category is on the current page - const isCategoryVisible = async () => { - const categoryElements = await page.$$(categorySelector); - return categoryElements.length > 0; - }; - // Loop through pages until the category is found - while (!categoryFound) { - categoryFound = await isCategoryVisible(); - if (!categoryFound) { - // Click the next page button (assuming there's a next page button with the text 'Next') - const nextButton = await page.$('button:has([aria-label="right"])'); - if (!nextButton) { - break; // No more pages to navigate - } - await nextButton.click(); - await page.waitForTimeout(1000); // Wait for the next page to load - pageIndex++; - } - } - if (categoryFound) { - // Click on the category to be edited - await page.click(categorySelector); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Fill in the new category name - const inputSelector = '#create-category_name'; - await page.fill(inputSelector, editedCategoryName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Check if the category name has been updated - const updatedCategory = await page.textContent(`text=${editedCategoryName}`); - expect(updatedCategory).toBe(editedCategoryName); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Category updated' - expect(successMessage).toBe('Category updated'); - } else { - throw new Error(`Category with name "${createdCategoryName}" not found.`); - } -}); - -test.only('Should find search results', async ({ page }) => { - const categoryToSearch = editedCategoryName; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill(searchInputSelector, categoryToSearch); - page.locator(categoryToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the category is visible in the results - const categoryExists = await page.isVisible(`text=${categoryToSearch}`); -}); - -test('Should find no search results', async ({ page }) => { - const categoryToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', categoryToSearch); - page.locator(categoryToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should display "Please enter name!" successfully, when the name input field is empty', async ({ - page, -}) => { - test.setTimeout(90000); - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the new category name into the input field - const categoryName = 'This is a test category'; - await page.type('#create-category_name', categoryName); - // Get the length of the typed text - const deletePressCount = categoryName.length; - // Press the Backspace key multiple times - for (let i = 0; i < deletePressCount; i++) { - await page.keyboard.press('Backspace'); - } - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Wait for the error message to appear - await page.waitForSelector('.ant-form-item-explain-error', { timeout: 80000 }); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the success message is 'Please enter name!' - expect(errorMessage).toBe('Please enter name!'); -}); - -test('should display already exsists successfully', async ({ page }) => { - const categorySelector = 'text=Others'; - const newcategoryName = 'Other'; - await page.click(categorySelector); - await page.click('button:has-text("Expand")'); - const inputSelector = '#create-category_name'; - await page.fill(inputSelector, newcategoryName); - await page.click('button:has-text("Update")'); - page.on('dialog', (dialog) => dialog.accept()); - const successMessage = await page.textContent('.ant-notification-notice-description'); - expect(successMessage).toBe('Entity with same name exists'); -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('when the button is clicked, should scroll to the top of the page', async ({ page }) => { - const categorySelector = 'text=Other'; - await page.click(categorySelector); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - // Find the scroll to top button and click it - const spanElement = page.locator('span[aria-label="vertical-align-top"]'); - // Click on the span element - await spanElement.click(); - // Wait for the scroll action to complete - await page.waitForTimeout(1000); // adjust the timeout based on your scroll animation duration - // Check if the page is scrolled to the top - const scrollPosition = await page.evaluate(() => window.scrollY); - expect(scrollPosition).toBe(0); -}); - -test('should sort categories from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all categories - const categories = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - - // Check if categories are sorted from latest to oldest - const sortedcategories = categories.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - - // Check if the categories are in the correct order - expect(categories).toEqual(sortedcategories); -}); - -test('should sort categories from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - - // Get the text content of all categories - const categories = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - - // Check if categories are sorted from oldest to latest - const sortedcategories = categories.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - - // Check if the categories are in the correct order - expect(categories).toEqual(sortedcategories); -}); - -test('should load the Categories page successfully', async ({ page }) => { - // Locate the header element with the text 'Categories' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'Categories' - await expect(accountLogin).toHaveText('Categories'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}/categories?sort=desc&limit=10&page=NaN`); - // Locate the element that shows 'No data' message - const invalidPage = await page.locator('text=No data'); - // Assert that the 'No data' message is visible - await expect(invalidPage).toBeVisible(); -}); - -test('should persist category data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstcategoryText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the categoriess page - await page.goto(`${process.env.BASE_URL}/categories?sort=desc&limit=10&page=1`); - // Get the text content of the first h3 element again - const newFirstcategoryText = await page.locator('h3').first().textContent(); - // Assert that the category data is the same across sessions - expect(firstcategoryText).toEqual(newFirstcategoryText); -}); - -//Perform this test case only when there are no categories present -test('should display empty state when no categories are present', async ({ page }) => { - // Locate the element that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); diff --git a/studio/e2e_tests/tests/claimants.spec.js b/studio/e2e_tests/tests/claimants.spec.js deleted file mode 100644 index 3ba50808c..000000000 --- a/studio/e2e_tests/tests/claimants.spec.js +++ /dev/null @@ -1,375 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}claimants?sort=desc&limit=10&page=1`); -}); - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -let createdClaimantName = ''; // Define a global variable to store the created claimant name -let editedClaimantName = ''; // Define a global variable to store the edited claimant name - -test('should create claimant successfully', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new claimant name with the random string into the input field - createdClaimantName = `This is a test claimant ${randomString}`; - await page.type('#creat-claimant_name', createdClaimantName); - await page.type('#creat-claimant_tag_line', 'New claimant Line'); // Click on the 'Save' button - await page.click('button:has-text("Submit")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'claimant created' - expect(successMessage).toBe('Claimant created'); -}); - -test('should edit a claimant successfully', async ({ page }) => { - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - editedClaimantName = `This is an edited test claimant ${randomString}`; - const claimantSelector = `text=${createdClaimantName}`; - let claimantFound = false; - let pageIndex = 1; - // Function to check if the claimant is on the current page - const isClaimantVisible = async () => { - const claimantElements = await page.$$(claimantSelector); - return claimantElements.length > 0; - }; - // Loop through pages until the claimant is found - while (!claimantFound) { - claimantFound = await isClaimantVisible(); - if (!claimantFound) { - // Click the next page button (assuming there's a next page button with the text 'Next') - const nextButton = await page.$('button:has([aria-label="right"])'); - if (!nextButton) { - break; // No more pages to navigate - } - await nextButton.click(); - await page.waitForTimeout(1000); // Wait for the next page to load - pageIndex++; - } - } - if (claimantFound) { - // Click on the claimant to be edited - await page.click(claimantSelector); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Fill in the new claimant name - const inputSelector = '#creat-claimant_name'; - await page.fill(inputSelector, editedClaimantName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Check if the claimant name has been updated - const updatedClaimant = await page.textContent(`text=${editedClaimantName}`); - expect(updatedClaimant).toBe(editedClaimantName); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Claimant updated' - expect(successMessage).toBe('Claimant updated'); - } else { - throw new Error(`Claimant with name "${createdClaimantName}" not found.`); - } -}); - -test('Should find search results', async ({ page }) => { - const claimantToSearch = editedClaimantName; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill(searchInputSelector, claimantToSearch); - page.locator(claimantToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the claimant is visible in the results - const claimantExists = await page.isVisible(`text=${claimantToSearch}`); -}); - -test('should delete claimant successfully', async ({ page }) => { - const claimantText = editedClaimantName; - const nextButtonSelector = 'button:has([aria-label="right"])'; - let claimantFound = false; - while (true) { - // Check if the claimant is present on the current page - const rowSelector = `tr:has-text("${claimantText}")`; - - const buttonSelector = 'button:has([aria-label="delete"])'; - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Check if the row with the claimant text is visible - const rowCount = await page.locator(rowSelector).count(); - if (rowCount > 0) { - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click the delete button - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'claimant deleted' - expect(successMessage).toBe('Claimant deleted'); - claimantFound = true; - break; - } - // Check if the "Next" button is available - const nextButtonEnabled = await page.isEnabled(nextButtonSelector); - if (!nextButtonEnabled) { - // If there are no more pages to check, break the loop - break; - } - // Click the "Next" button to go to the next page - await page.click(nextButtonSelector); - } - // Assert that the claimant was found and deleted - expect(claimantFound).toBe(true); -}); - -test('should display "claimant with same name exists" successfully', async ({ page }) => { - // Selector for the claimant element with the text 'Nine' - const claimantSelector = 'text=Nine'; - // New claimant name to be used for testing duplicate name scenario - const newClaimantName = 'One'; - // Click on the claimant element to select it - await page.click(claimantSelector); - // Click on the 'Expand' button to open the details or edit section - await page.click('button:has-text("Expand")'); - // Selector for the claimant name input field - const inputSelector = '#creat-claimant_name'; - // Fill the input field with the new claimant name - await page.fill(inputSelector, newClaimantName); - // Click on the 'Update' button to submit the form - await page.click('button:has-text("Update")'); - // Handle the dialog that appears after clicking 'Update' and accept it - page.on('dialog', (dialog) => dialog.accept()); - // Get the text content of the success message notification - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Verify that the success message is as expected - expect(successMessage).toBe('Entity with same name exists'); -}); - -test('should reset', async ({ page }) => { - await page.click('button:has-text("Create")'); - await page.click('button:has-text("Expand")'); - await page.fill('#creat-claimant_name', 'Kurt'); - await page.click('button:has-text("Reset")'); - - // Verify that the form fields have been reset - const input1Value = await page.$eval('#creat-claimant_name', (input) => input.value); - if (input1Value === '') { - console.log('Form reset test passed'); - } else { - console.error('Form reset test failed'); - } -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('when the button is clicked, should scroll to the top of the page', async ({ page }) => { - const claimantSelector = 'text=Two'; - await page.click(claimantSelector); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - // Find the scroll to top button and click it - const spanElement = page.locator('span[aria-label="vertical-align-top"]'); - // Click on the span element - await spanElement.click(); - // Wait for the scroll action to complete - await page.waitForTimeout(1000); // adjust the timeout based on your scroll animation duration - // Check if the page is scrolled to the top - const scrollPosition = await page.evaluate(() => window.scrollY); - expect(scrollPosition).toBe(0); -}); - -test('should sort claimants from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all claimants - const claimants = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - - // Check if claimants are sorted from latest to oldest - const sortedclaimants = claimants.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - - // Check if the claimants are in the correct order - expect(claimants).toEqual(sortedclaimants); -}); - -test('should sort claimants from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - - // Get the text content of all claimants - const claimants = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - - // Check if claimants are sorted from oldest to latest - const sortedclaimants = claimants.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - - // Check if the claimants are in the correct order - expect(claimants).toEqual(sortedclaimants); -}); - -test('should load the claimants page successfully', async ({ page }) => { - // Locate the header element with the text 'claimants' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'Claimants' - await expect(accountLogin).toHaveText('Claimants'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}claimants?sort=desc&limit=10&page=NaN`); - // Locate the element that shows 'No data' message - const accountLogin = await page.locator('text=No data'); - // Assert that the 'No data' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist claimant data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstclaimantText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the Claimants page - await page.goto(`${process.env.BASE_URL}claimants?sort=desc&limit=10&page=1`); - // Get the text content of the first h3 element again - const newFirstclaimantText = await page.locator('h3').first().textContent(); - // Assert that the claimant data is the same across sessions - expect(firstclaimantText).toEqual(newFirstclaimantText); -}); - -//Perform this test case only when there are no claimants present -test('should display empty state when no claimants are present', async ({ page }) => { - // Locate the element that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); - -test('Should find no search results', async ({ page }) => { - const claimantToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', claimantToSearch); - page.locator(claimantToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should display "Please enter name!" successfully, when the name input field is empty', async ({ - page, -}) => { - test.setTimeout(90000); - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the new claimant name into the input field - const claimantName = 'This is a test claimant'; - await page.type('#creat-claimant_name', claimantName); - // Get the length of the typed text - const deletePressCount = claimantName.length; - // Press the Backspace key multiple times - for (let i = 0; i < deletePressCount; i++) { - await page.keyboard.press('Backspace'); - } - // Click on the 'Submit' button - await page.click('button:has-text("Submit")'); - // Wait for the error message to appear - await page.waitForSelector('.ant-form-item-explain-error', { timeout: 80000 }); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the success message is 'Please enter name!' - expect(errorMessage).toBe('Please enter name!'); -}); diff --git a/studio/e2e_tests/tests/claims.spec.js b/studio/e2e_tests/tests/claims.spec.js deleted file mode 100644 index 2b2a36c20..000000000 --- a/studio/e2e_tests/tests/claims.spec.js +++ /dev/null @@ -1,443 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}claims?sort=desc&limit=10&page=1`); -}); - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -let createdClaimName = ''; -let editedClaimName = ''; - -test('should create claim successfully...', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new claim name with the random string into the input field - const claimName = `This is a test claim ${randomString}`; - createdClaimName = claimName; // Store the created claim name - await page.type('#create-claim_claim', claimName); - await page.locator('div.ant-select-selector').first().click(); - await page.click('div[title="Nine"]'); - await page.locator('div.ant-select-selector').nth(1).click(); - await page.click('div[title="True"]'); - // Click on the date input field using the selector - await page.type('#create-claim_claim_date', '2023-09-09'); - await page.keyboard.press('Enter'); - // Click on the 'Submit' button - await page.click('button:has-text("Submit")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Claim created' - expect(successMessage).toBe('Claim created'); -}); - -test('Should find search results', async ({ page }) => { - const claimToSearch = createdClaimName; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', claimToSearch); - page.locator(claimToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the claim is visible in the results - const claimExists = await page.isVisible(`text=${claimToSearch}`); -}); - -test('should edit a claim successfully...', async ({ page }) => { - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - const claimSelector = `text=${createdClaimName}`; - const newClaimName = `This is a test claim ${randomString}`; - let claimFound = false; - let pageIndex = 1; - // Function to check if the claim is on the current page - const isClaimVisible = async () => { - const claimElements = await page.$$(claimSelector); - return claimElements.length > 0; - }; - // Loop through pages until the claim is found - while (!claimFound) { - claimFound = await isClaimVisible(); - if (!claimFound) { - // Click the next page button (assuming there's a next page button with the text 'Next') - await page.click('button:has([aria-label="right"])'); - await page.waitForTimeout(1000); // Wait for the next page to load - pageIndex++; - } - } - // Click on the claim to be edited - await page.click(claimSelector); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Fill in the new claim name - const inputSelector = '#create-claim_claim'; - await page.fill(inputSelector, newClaimName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Claim updated' - expect(successMessage).toBe('Claim updated'); -}); - -test('should delete a claim successfully', async ({ page }) => { - const claimText = editedClaimName; - const nextButtonSelector = 'button:has([aria-label="right"])'; - let claimFound = false; - while (true) { - // Check if the claim is present on the current page - const rowSelector = `tr:has-text("${claimText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Check if the row with the claim text is visible - const rowCount = await page.locator(rowSelector).count(); - if (rowCount > 0) { - // Click the delete button - await buttonLocator.first().click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Claim deleted' - expect(successMessage).toBe('Claim deleted'); - claimFound = true; - break; - } - // Check if the "Next" button is available - const nextButtonEnabled = await page.isEnabled(nextButtonSelector); - if (!nextButtonEnabled) { - // If there are no more pages to check, break the loop - break; - } - // Click the "Next" button to go to the next page - await page.click(nextButtonSelector); - } - // Assert that the claim was found and deleted - expect(claimFound).toBe(true); -}); - -test('Should find search results based on claimant', async ({ page }) => { - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).first().click(); - // Select the option "Seven" from the dropdown - const optionSelector = '.ant-select-item-option[title="Seven"]'; - await page.locator(optionSelector).click(); - await page.press(dropdownContainerSelector, 'Enter'); - // Wait for all the search results to be visible - const resultsSelector = 'td.ant-table-cell a[href="/.factly/dega/studio/claimants/13/edit"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find no search results based on claimant', async ({ page }) => { - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).first().click(); - // Select the option "Eight" from the dropdown - const optionSelector = '.ant-select-item-option[title="Eight"]'; - await page.locator(optionSelector).click(); - await page.press(dropdownContainerSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('Should find search results based on rating', async ({ page }) => { - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="One"]'; - await page.locator(optionSelector).click(); - await page.press(dropdownContainerSelector, 'Enter'); - // Wait for all the search results to be visible - const resultsSelector = 'td.ant-table-cell a[href="/.factly/dega/studio/claimants/13/edit"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find no search results based on rating successfully', async ({ page }) => { - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="This is a test rating"]'; - await page.locator(optionSelector).click(); - await page.press(dropdownContainerSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('Should find no search results', async ({ page }) => { - const claimToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', claimToSearch); - page.locator(claimToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('when the button is clicked, should scroll to the top of the page', async ({ page }) => { - const claimSelector = 'text=Two'; - await page.click(claimSelector); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - // Find the scroll to top button and click it - const spanElement = page.locator('span[aria-label="vertical-align-top"]'); - // Click on the span element - await spanElement.click(); - // Wait for the scroll action to complete - await page.waitForTimeout(1000); // adjust the timeout based on your scroll animation duration - // Check if the page is scrolled to the top - const scrollPosition = await page.evaluate(() => window.scrollY); - expect(scrollPosition).toBe(0); -}); - -test('should sort claims from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all claims - const claims = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - - // Check if claims are sorted from latest to oldest - const sortedclaims = claims.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - - // Check if the claims are in the correct order - expect(claims).toEqual(sortedclaims); -}); - -test('should sort claims from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - - // Get the text content of all claims - const claims = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - - // Check if claims are sorted from oldest to latest - const sortedclaims = claims.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - - // Check if the claims are in the correct order - expect(claims).toEqual(sortedclaims); -}); - -test('should stay logged in using stored cookies', async ({ page }) => { - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); -}); - -test('should load the claims page successfully', async ({ page }) => { - // Locate the header element with the text 'claims' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'Claims' - await expect(accountLogin).toHaveText('Claims'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}claims?sort=desc&limit=10&page=NaN`); - // Locate the element that shows 'No data' message - const accountLogin = await page.locator('text=No data'); - // Assert that the 'No data' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist claim data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstclaimText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the claims page - await page.goto(`${process.env.BASE_URL}claims?sort=desc&limit=10&page=1`); - // Get the text content of the first h3 element again - const newFirstclaimText = await page.locator('h3').first().textContent(); - // Assert that the claim data is the same across sessions - expect(firstclaimText).toEqual(newFirstclaimText); -}); - -test('should display "Please input the Claim!" successfully, when the respective input fields are empty', async ({ - page, -}) => { - test.setTimeout(90000); - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Enter text into the claim input field - const claimName = 'New claimss'; - await page.type('#create-claim_claim', claimName); - // Get the length of the typed text - const deletePressCount = claimName.length; - // Press the Backspace key multiple times - for (let i = 0; i < deletePressCount; i++) { - await page.keyboard.press('Backspace'); - } - // Click on the 'Submit' button - await page.click('button:has-text("Submit")'); - // Wait for the error message to appear - await page.waitForSelector('.ant-form-item-explain-error', { timeout: 80000 }); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the success message is 'Please input the Claim!' - expect(errorMessage).toBe('Please input the Claim!'); -}); - -test('should display "Please add claimant!" successfully, when the claimant input fields are empty', async ({ - page, -}) => { - test.setTimeout(90000); - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the new claim name into the input field - const claimName = 'Th'; - await page.type('#create-claim_claim', claimName); - // Click on the 'Submit' button - await page.click('button:has-text("Submit")'); - // Wait for the error message to appear - await page.waitForSelector('.ant-form-item-explain-error', { timeout: 80000 }); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the success message is 'Please input the Claim!' - expect(errorMessage).toBe('Please add claimant!'); -}); - -test('should display "Please add rating!" successfully, when the claima input field is empty', async ({ - page, -}) => { - test.setTimeout(90000); - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the new claim name into the input field - const claimName = 'Th'; - await page.type('#create-claim_claim', claimName); - await page.locator('div.ant-select-selector').first().click(); - await page.click('div[title="Nine"]'); - // Click on the 'Submit' button - await page.click('button:has-text("Submit")'); - // Wait for the error message to appear - await page.waitForSelector('.ant-form-item-explain-error', { timeout: 80000 }); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the success message is 'Please add rating!' - expect(errorMessage).toBe('Please add rating!'); -}); diff --git a/studio/e2e_tests/tests/factchecks.spec.js b/studio/e2e_tests/tests/factchecks.spec.js deleted file mode 100644 index 00de0c3be..000000000 --- a/studio/e2e_tests/tests/factchecks.spec.js +++ /dev/null @@ -1,538 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(90000); - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - await page.goto(`${process.env.BASE_URL}fact-checks`); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -test('should create a draft factcheck succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new factcheck name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test factcheck ${randomString}`); - // Type the new factcheck name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - // Locate the 4th div with class 'ant-select-selector' - const selectorDiv = page.locator('div.ant-select-selector').nth(3); - // Click on the located div - await selectorDiv.click(); // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - // Click on the 'Save as Draft' button - await page.click('span:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post added' - expect(successMessage).toBe('Post added'); -}); - -test('should create a ready to publish factcheck succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new factcheck name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test factcheck ${randomString}`); - // Type the new factcheck name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - // Locate the 4th div with class 'ant-select-selector' - const selectorDiv = page.locator('div.ant-select-selector').nth(3); - // Click on the located div - await selectorDiv.click(); // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - // Click on the 'Save as Draft' button - await page.hover('span:has-text("Save")'); - await page.click('button[role="switch"]'); - await page.click('span:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Draft saved & Ready to Publish' - expect(successMessage).toBe('Draft saved & Ready to Publish'); -}); - -test('should publish a post succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new factcheck name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test factcheck ${randomString}`); - // Type the new factcheck name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - // Locate the 4th div with class 'ant-select-selector' - const selectorDiv = page.locator('div.ant-select-selector').nth(3); - // Click on the located div - await selectorDiv.click(); // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - // Click on the 'Publish' button - await page.click('span:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Fact Check Published' - expect(successMessage).toBe('Fact Check Published'); -}); - -test('should delete a published factcheck successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}fact-checks?status=publish`); - const factcheckText = 'efefef'; - //const factcheckDateTime = 'Jun 03, 2024 03:25 PM'; // specify the exact date and time of the factcheck - // Select the row with the required fact-check text and date-time - const rowSelector = `tr:has-text("${factcheckText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post deleted' - expect(successMessage).toBe('Post deleted'); -}); - -test('should delete a factcheck from ready to publish successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}fact-checks?status=ready`); - const factcheckText = 'This is a test factcheck PYaSsrCfVU'; - // Select the row with the required fact-check text - const rowSelector = `tr:has-text("${factcheckText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post deleted' - expect(successMessage).toBe('Post deleted'); -}); - -test('should delete a factcheck from drafts successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}fact-checks?status=draft`); - const factcheckText = 'kjbh'; - // Select the row with the required fact-check text - const rowSelector = `tr:has-text("${factcheckText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post deleted' - expect(successMessage).toBe('Post deleted'); -}); - -test('Should find search results based on tag', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="One"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/factchecks/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find search results based on category', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(2).click(); - // Select the option "One" from the dropdown - // Select the option "Nine" from the dropdown - const optionSelector = '.ant-select-item-option[title="Others"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/factchecks/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find search results based on author', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(3).click(); - // Select the option "One" from the dropdown - // Select the option "Nine" from the dropdown - const optionSelector = '.ant-select-item-option[title="Ramsai Rapole"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/factchecks/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find no search results based on tag', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="This is a test tag a0Xh2oSXTA"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('Should find no search results based on category', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(2).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="jxmixckixmm"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should create a template successfully ', async ({ page }) => { - const factcheckSelector = 'text=jhjrhf'; - // Click on the factcheck to be edited - await page.click(factcheckSelector); - // Click on the 'Templates' button - await page.click('button#template'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Template created' - expect(successMessage).toBe('Template created'); -}); - -test('should save a draft when clicked on a template successfully ', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - const factcheckSelector = 'text=jhjrhf'; - // Click on the factcheck to be edited - await page.click(factcheckSelector); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post added' - expect(successMessage).toBe('Post added'); -}); - -test('should edit a template successfully', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - await page.click('button:has-text("show more")'); - const factcheckSelector = 'div.ant-card-meta-description >> text="jhjrhf"'; - const newfactcheckName = 'One one'; - // Click on the factcheck to be edited - await page.click(factcheckSelector); - // Fill in the new factcheck name - const inputSelector = '#title'; - await page.fill(inputSelector, newfactcheckName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - await page.click('.ant-notification-notice-close'); - // Click on the 'Publish' button - await page.click('button:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Check if "cannot publish factcheck without author" message is displayed - const authorMessageSelector = 'text=cannot publish factcheck without author'; - const isAuthorMessageVisible = await page.isVisible(authorMessageSelector); - if (isAuthorMessageVisible) { - console.log('Author selection required'); - await page.click('.ant-notification-notice-close'); // Close the notification - // Select an author if the message is displayed - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - await page.waitForSelector('div.ant-select-dropdown', { state: 'visible' }); // Ensure dropdown is visible - await page.keyboard.press('Enter'); // Select the first author in the list - await page.click('button:has([aria-label="close"])'); // Close the settings modal - await page.fill(inputSelector, newfactcheckName); - // Click on the 'Publish' button again - await page.click('button:has-text("Publish")'); - page.on('dialog', (dialog) => dialog.accept()); // Handle any dialog that appears by accepting it - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - console.log('Success message received:', successMessage); // Log the success message - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); - } -}); - -test('should open to edit when clicked on template edit button successfully ', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - // Locate the 'edit' buttons and click on the one in the second row, fourth column - const editButtons = page.locator('span[aria-label="edit"]'); - await editButtons.nth(5).click(); -}); - -test('should delete template when clicked on template delete button successfully ', async ({ - page, -}) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - // Locate the 'edit' buttons and click on the one in the second row, fourth column - const editButtons = page.locator('span[aria-label="delete"]'); - await editButtons.nth(5).click(); - await page.click('button:has-text("OK")'); -}); - -test('should load the fact-checks page successfully', async ({ page }) => { - // Locate the header with the text 'fact-checks' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'Fact-checks' - await expect(accountLogin).toHaveText('Fact-checks'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}fact-checkssnskn`); - // Locate the fact-check that shows '404' message - const accountLogin = await page.locator('text=404'); - // Assert that the '404' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist fact-checks data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstTagText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the tags page - await page.goto(`${process.env.BASE_URL}fact-checks`); - // Get the text content of the first h3 element again - const newFirstTagText = await page.locator('h3').first().textContent(); - // Assert that the tag data is the same across sessions - expect(firstTagText).toEqual(newFirstTagText); -}); - -//Perform this test case only when there are no tags present -test('should display empty state when no fact-checks are present', async ({ page }) => { - // Locate the selector that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); - -test('Should find search results', async ({ page }) => { - const factcheckToSearch = 'One'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill(searchInputSelector, factcheckToSearch); - page.locator(factcheckToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the factcheck is visible in the results - const factcheckExists = await page.isVisible(`text=${factcheckToSearch}`); -}); - -test('Should find no search results', async ({ page }) => { - const factcheckToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', factcheckToSearch); - page.locator(factcheckToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('should sort tags from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from latest to oldest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); - -test('should sort tags from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from oldest to latest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); - -test('should show "cannot publish post without author" successfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new factcheck name into the input field - await page.type('#title', 'New factcheck'); - // Type the new factcheck name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - // Click on the 'Save' button - await page.click('button:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the error message text - const errorMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the error message is 'cannot publish post without author' - expect(errorMessage).toBe('cannot publish post without author'); -}); - -test('should show "Please input the title!" succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - await page.click('button:has-text("Publish")'); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the error message is 'Please input the title!' - expect(errorMessage).toBe('Please input the title!'); -}); - -test('should display tippy ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new factcheck name into the input field - await page.type('#title', 'New factcheck'); - // Type the new factcheck name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.press('/'); - await page.isVisible('#tippy-11'); -}); diff --git a/studio/e2e_tests/tests/login.spec.js b/studio/e2e_tests/tests/login.spec.js deleted file mode 100644 index 46e5e65f0..000000000 --- a/studio/e2e_tests/tests/login.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', 'ramsai.rapole@factly.in'); -}); - -test('Button click refreshes the page', async ({ page }) => { - // Get the initial page content (could be a timestamp or any content that changes on refresh) - const initialContent = await page.content(); - // Click the button to refresh the page - await page.click('span[aria-label="close-circle"]'); - // Wait for the page to reload - await page.waitForLoadState('load'); - // Get the content after the refresh - const refreshedContent = await page.content(); - // Check that the content has changed - expect(initialContent).not.toBe(refreshedContent); -}); - -test('should login correctly', async ({ page }) => { - await page.type('#auth_password', 'Wrongpass@123'); - // Click the login button - await page.click('text=Login'); - // Locate the element with the 'h2' tag - const accountLogin = await page.locator('h2'); - // Check that the element is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should fail login correctly', async ({ page }) => { - await page.type('#auth_password', 'Wrongpass@123'); - // Click the login button - await page.click('text=Login'); - // Locate the element containing the specific text message indicating invalid credentials - const accountLogin = await page.locator('text=The provided credentials are invalid.'); - // Assert that the located element is visible on the page - await expect(accountLogin).toBeVisible(); -}); diff --git a/studio/e2e_tests/tests/pages.spec.js b/studio/e2e_tests/tests/pages.spec.js deleted file mode 100644 index 328b101b0..000000000 --- a/studio/e2e_tests/tests/pages.spec.js +++ /dev/null @@ -1,686 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(90000); - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - await page.goto(`${process.env.BASE_URL}pages`); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -test('should create a draft page succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new page name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test page ${randomString}`); - // Type the new page name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - await page.click('button:has([aria-label="down"])'); - // Click on the 'Save as Draft' button - await page.click('span:has-text("Save Draft")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'page added'' - expect(successMessage).toBe('page added'); -}); - -test('should create a ready to publish page succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new page name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test page ${randomString}`); - // Type the new page name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - await page.click('button:has([aria-label="down"])'); - // Click on the 'Ready to Publish' button - await page.click('span:has-text("Ready to Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'page added & Ready to Publish' - expect(successMessage).toBe('page added & Ready to Publish'); -}); - -test('should publish page succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new page name into the input field - await page.type('#title', `This is a test page ${randomString}`); - // Type the new page name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - // Click on the 'Publish' button - await page.click('span:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the error message text - const errorMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(errorMessage).toBe('Article Published'); -}); - -test('should display tippy ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new page name into the input field - await page.type('#title', 'New page'); - // Type the new page name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.press('/'); - await page.isVisible('#tippy-11'); -}); - -test('should delete a published page successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=publish`); - const pageText = 'ndscn'; - //const pageDateTime = 'Jun 03, 2024 03:25 PM'; // specify the exact date and time of the page - // Select the row with the required fact-check text and date-time - const rowSelector = `tr:has-text("${pageText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'page deleted' - expect(successMessage).toBe('page deleted'); -}); - -test('should delete a page from ready to publish successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=ready`); - const pageText = 'Onel'; - // Select the row with the required fact-check text - const rowSelector = `tr:has-text("${pageText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'page deleted' - expect(successMessage).toBe('page deleted'); -}); - -test('should delete a page from drafts successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=draft`); - const pageText = 'asax'; - // Select the row with the required fact-check text - const rowSelector = `tr:has-text("${pageText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'page deleted' - expect(successMessage).toBe('page deleted'); -}); - -test('should edit a published page successfully ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=publish`); - const randomString = getRandomString(10); // Adjust the length as needed - const pageSelector = 'text=dkndkm'; - const newpageName = `This is a test page ${randomString}`; - // Click on the page to be edited - await page.click(pageSelector); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the pagename has been updated - const updatedpage = await page.textContent(`text=${newpageName}`); - expect(updatedpage).toBe(newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a ready to publish page successfully ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=ready`); - const randomString = getRandomString(10); // Adjust the length as needed - const pageSelector = 'text=cddc'; - const newpageName = `This is a test page ${randomString}`; - // Click on the page to be edited - await page.click(pageSelector); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the pagename has been updated - const updatedpage = await page.textContent(`text=${newpageName}`); - expect(updatedpage).toBe(newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a draft page successfully ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=draft`); - const randomString = getRandomString(10); // Adjust the length as needed - const pageSelector = 'text=cddc'; - const newpageName = `This is a test page ${randomString}`; - // Click on the page to be edited - await page.click(pageSelector); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the pagename has been updated - const updatedpage = await page.textContent(`text=${newpageName}`); - expect(updatedpage).toBe(newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a published page successfully from the shortcut edit button ', async ({ - page, -}) => { - await page.goto(`${process.env.BASE_URL}pages?status=publish`); - const randomString = getRandomString(10); // Adjust the length as needed - const pageName = 'dkndkm'; - const newpageName = `This is a test page ${randomString}`; - const rowSelector = `tr:has-text("${pageName}")`; - const buttonSelector = - 'button.ant-btn.css-dev-only-do-not-override-1cn9vqe.ant-btn-default.ant-btn-lg.ant-btn-icon-only'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - await buttonLocator.first().click(); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the pagename has been updated - const updatedpage = await page.textContent(`text=${newpageName}`); - expect(updatedpage).toBe(newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a ready to publish page successfully from the shortcut edit button ', async ({ - page, -}) => { - await page.goto(`${process.env.BASE_URL}pages?status=ready`); - const randomString = getRandomString(10); // Adjust the length as needed - const pageName = 'jxks'; - const newpageName = `This is a test page ${randomString}`; - const rowSelector = `tr:has-text("${pageName}")`; - const buttonSelector = - 'button.ant-btn.css-dev-only-do-not-override-1cn9vqe.ant-btn-default.ant-btn-lg.ant-btn-icon-only'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - await buttonLocator.first().click(); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the pagename has been updated - const updatedpage = await page.textContent(`text=${newpageName}`); - expect(updatedpage).toBe(newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Draft saved & Ready to Publish' - expect(successMessage).toBe('Draft saved & Ready to Publish'); -}); - -test('should edit a draft page successfully from the shortcut edit button ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}pages?status=draft`); - const randomString = getRandomString(10); // Adjust the length as needed - const pageName = 'skis'; - const newpageName = `This is a test page ${randomString}`; - const rowSelector = `tr:has-text("${pageName}")`; - const buttonSelector = - 'button.ant-btn.css-dev-only-do-not-override-1cn9vqe.ant-btn-default.ant-btn-lg.ant-btn-icon-only'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - await buttonLocator.first().click(); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the pagename has been updated - const updatedpage = await page.textContent(`text=${newpageName}`); - expect(updatedpage).toBe(newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Draft Saved' - expect(successMessage).toBe('Draft Saved'); -}); - -test('Should find search results based on tag', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="One"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/pages/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find search results based on category', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(2).click(); - // Select the option "One" from the dropdown - // Select the option "Nine" from the dropdown - const optionSelector = '.ant-select-item-option[title="nkxnckxn"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/pages/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find search results based on author', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(3).click(); - // Select the option "One" from the dropdown - // Select the option "Nine" from the dropdown - const optionSelector = '.ant-select-item-option[title="Ramsai Rapole"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/pages/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find no search results based on tag', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="This is a test tag a0Xh2oSXTA"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('Should find no search results based on category', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(2).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="jxmixckixmm"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('Should find search results', async ({ page }) => { - const pageToSearch = 'new page'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill(searchInputSelector, pageToSearch); - page.locator(pageToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the page is visible in the results - const pageExists = await page.isVisible(`text=${pageToSearch}`); -}); - -test('Should find no search results', async ({ page }) => { - const pageToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', pageToSearch); - page.locator(pageToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should show "cannot publish page without author" successfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new page name into the input field - await page.type('#title', 'New page'); - // Type the new page name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - // Click on the 'Save' button - await page.click('button:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the error message text - const errorMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the error message is 'cannot publish page without author' - expect(errorMessage).toBe('cannot publish page without author'); -}); - -test('should show "Please input the title!" succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - await page.click('button:has-text("Publish")'); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the error message is 'Please input the title!' - expect(errorMessage).toBe('Please input the title!'); -}); - -test('should create a template successfully ', async ({ page }) => { - const pageSelector = 'text=One'; - // Click on the page to be edited - await page.click(pageSelector); - // Click on the 'Templates' button - await page.click('button#template'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Template created' - expect(successMessage).toBe('Template created'); -}); - -test('should save a draft when clicked on a template successfully ', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - const pageSelector = 'text=One'; - // Click on the page to be edited - await page.click(pageSelector); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'page added' - expect(successMessage).toBe('page added'); -}); - -test('should edit a template successfully', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - await page.click('button:has-text("show more")'); - const pageSelector = 'div.ant-card-meta-description >> text="One"'; - const newpageName = 'One one'; - // Click on the page to be edited - await page.click(pageSelector); - // Fill in the new page name - const inputSelector = '#title'; - await page.fill(inputSelector, newpageName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - await page.click('.ant-notification-notice-close'); - // Click on the 'Publish' button - await page.click('button:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Check if "cannot publish page without author" message is displayed - const authorMessageSelector = 'text=cannot publish page without author'; - const isAuthorMessageVisible = await page.isVisible(authorMessageSelector); - if (isAuthorMessageVisible) { - console.log('Author selection required'); - await page.click('.ant-notification-notice-close'); // Close the notification - // Select an author if the message is displayed - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - await page.waitForSelector('div.ant-select-dropdown', { state: 'visible' }); // Ensure dropdown is visible - await page.keyboard.press('Enter'); // Select the first author in the list - await page.click('button:has([aria-label="close"])'); // Close the settings modal - await page.fill(inputSelector, newpageName); - // Click on the 'Publish' button again - await page.click('button:has-text("Publish")'); - page.on('dialog', (dialog) => dialog.accept()); // Handle any dialog that appears by accepting it - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - console.log('Success message received:', successMessage); // Log the success message - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); - } -}); - -test('should open to edit when clicked on template edit button successfully ', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - // Locate the 'edit' buttons and click on the one in the second row, fourth column - const editButtons = page.locator('span[aria-label="edit"]'); - await editButtons.nth(5).click(); -}); - -test('should delete template when clicked on template delete button successfully ', async ({ - page, -}) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - // Locate the 'edit' buttons and click on the one in the second row, fourth column - const editButtons = page.locator('span[aria-label="delete"]'); - await editButtons.nth(5).click(); - await page.click('button:has-text("OK")'); -}); - -test('should load the pages page successfully', async ({ page }) => { - // Locate the header pagewith the text 'pages' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'pages' - await expect(accountLogin).toHaveText('pages'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}pages-`); - // Locate the pagethat shows '404' message - const accountLogin = await page.locator('text=404'); - // Assert that the '404' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist pages data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstTagText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the tags page - await page.goto(`${process.env.BASE_URL}pages`); - // Get the text content of the first h3 element again - const newFirstTagText = await page.locator('h3').first().textContent(); - // Assert that the tag data is the same across sessions - expect(firstTagText).toEqual(newFirstTagText); -}); - -//Perform this test case only when there are no tags present -test('should display empty state when no pages are present', async ({ page }) => { - // Locate the selector that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('should sort tags from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from latest to oldest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); - -test('should sort tags from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from oldest to latest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); diff --git a/studio/e2e_tests/tests/posts.spec.js b/studio/e2e_tests/tests/posts.spec.js deleted file mode 100644 index 362afe747..000000000 --- a/studio/e2e_tests/tests/posts.spec.js +++ /dev/null @@ -1,697 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}tags?sort=desc&limit=10&page=1`); -}); - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -test('should create a draft post succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new post name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test post ${randomString}`); - // Type the new post name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - await page.click('button:has([aria-label="down"])'); - // Click on the 'Save as Draft' button - await page.click('span:has-text("Save Draft")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post added'' - expect(successMessage).toBe('Post added'); -}); - -test('should create a ready to publish post succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new post name into the input field - const randomString = getRandomString(10); // Adjust the length as needed - await page.type('#title', `This is a test post ${randomString}`); - // Type the new post name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - await page.click('button:has([aria-label="down"])'); - // Click on the 'Ready to Publish' button - await page.click('span:has-text("Ready to Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post added & Ready to Publish' - expect(successMessage).toBe('Post added & Ready to Publish'); -}); - -test('should publish post succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new post name into the input field - await page.type('#title', `This is a test post ${randomString}`); - // Type the new post name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - // Wait for the dropdown list to appear and populate - await page.keyboard.press('Enter'); - await page.click('button:has([aria-label="close"])'); - // Click on the 'Publish' button - await page.click('span:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the error message text - const errorMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(errorMessage).toBe('Article Published'); -}); - -test('should display tippy ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new post name into the input field - await page.type('#title', 'New Post'); - // Type the new post name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.press('/'); - await page.isVisible('#tippy-11'); -}); - -test('should delete a published post successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=publish`); - const postText = 'ndscn'; - //const postDateTime = 'Jun 03, 2024 03:25 PM'; // specify the exact date and time of the post - // Select the row with the required fact-check text and date-time - const rowSelector = `tr:has-text("${postText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post deleted' - expect(successMessage).toBe('Post deleted'); -}); - -test('should delete a post from ready to publish successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=ready`); - const postText = 'Onel'; - // Select the row with the required fact-check text - const rowSelector = `tr:has-text("${postText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post deleted' - expect(successMessage).toBe('Post deleted'); -}); - -test('should delete a post from drafts successfully', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=draft`); - const postText = 'asax'; - // Select the row with the required fact-check text - const rowSelector = `tr:has-text("${postText}")`; - const buttonSelector = 'button:has([aria-label="delete"])'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Click on the Fact-check to be deleted - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post deleted' - expect(successMessage).toBe('Post deleted'); -}); - -test('should edit a published post successfully ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=publish`); - const randomString = getRandomString(10); // Adjust the length as needed - const postSelector = 'text=dkndkm'; - const newPostName = `This is a test post ${randomString}`; - // Click on the post to be edited - await page.click(postSelector); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the postname has been updated - const updatedpost = await page.textContent(`text=${newPostName}`); - expect(updatedpost).toBe(newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a ready to publish post successfully ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=ready`); - const randomString = getRandomString(10); // Adjust the length as needed - const postSelector = 'text=cddc'; - const newPostName = `This is a test post ${randomString}`; - // Click on the post to be edited - await page.click(postSelector); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the postname has been updated - const updatedpost = await page.textContent(`text=${newPostName}`); - expect(updatedpost).toBe(newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a draft post successfully ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=draft`); - const randomString = getRandomString(10); // Adjust the length as needed - const postSelector = 'text=cddc'; - const newPostName = `This is a test post ${randomString}`; - // Click on the post to be edited - await page.click(postSelector); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the postname has been updated - const updatedpost = await page.textContent(`text=${newPostName}`); - expect(updatedpost).toBe(newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a published post successfully from the shortcut edit button ', async ({ - page, -}) => { - await page.goto(`${process.env.BASE_URL}posts?status=publish`); - const randomString = getRandomString(10); // Adjust the length as needed - const postName = 'dkndkm'; - const newPostName = `This is a test post ${randomString}`; - const rowSelector = `tr:has-text("${postName}")`; - const buttonSelector = - 'button.ant-btn.css-dev-only-do-not-override-1cn9vqe.ant-btn-default.ant-btn-lg.ant-btn-icon-only'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - await buttonLocator.first().click(); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the postname has been updated - const updatedpost = await page.textContent(`text=${newPostName}`); - expect(updatedpost).toBe(newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); -}); - -test('should edit a ready to publish post successfully from the shortcut edit button ', async ({ - page, -}) => { - await page.goto(`${process.env.BASE_URL}posts?status=ready`); - const randomString = getRandomString(10); // Adjust the length as needed - const postName = 'jxks'; - const newPostName = `This is a test post ${randomString}`; - const rowSelector = `tr:has-text("${postName}")`; - const buttonSelector = - 'button.ant-btn.css-dev-only-do-not-override-1cn9vqe.ant-btn-default.ant-btn-lg.ant-btn-icon-only'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - await buttonLocator.first().click(); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the postname has been updated - const updatedpost = await page.textContent(`text=${newPostName}`); - expect(updatedpost).toBe(newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Draft saved & Ready to Publish' - expect(successMessage).toBe('Draft saved & Ready to Publish'); -}); - -test('should edit a draft post successfully from the shortcut edit button ', async ({ page }) => { - await page.goto(`${process.env.BASE_URL}posts?status=draft`); - const randomString = getRandomString(10); // Adjust the length as needed - const postName = 'skis'; - const newPostName = `This is a test post ${randomString}`; - const rowSelector = `tr:has-text("${postName}")`; - const buttonSelector = - 'button.ant-btn.css-dev-only-do-not-override-1cn9vqe.ant-btn-default.ant-btn-lg.ant-btn-icon-only'; - // Find the button within the specific row and click it - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - await buttonLocator.first().click(); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the postname has been updated - const updatedpost = await page.textContent(`text=${newPostName}`); - expect(updatedpost).toBe(newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Draft Saved' - expect(successMessage).toBe('Draft Saved'); -}); - -test('Should find search results based on tag', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="One"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/posts/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find search results based on category', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(2).click(); - // Select the option "One" from the dropdown - // Select the option "Nine" from the dropdown - const optionSelector = '.ant-select-item-option[title="nkxnckxn"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/posts/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find search results based on author', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(3).click(); - // Select the option "One" from the dropdown - // Select the option "Nine" from the dropdown - const optionSelector = '.ant-select-item-option[title="Ramsai Rapole"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Wait for all the search results to be visible - const resultsSelector = - 'tbody.ant-table-tbody tr.ant-table-row td.ant-table-cell a[href*="/.factly/dega/studio/posts/"]'; - const results = page.locator(resultsSelector); - const count = await results.count(); - for (let i = 0; i < count; i++) { - await expect(results.nth(i)).toBeVisible(); - } -}); - -test('Should find no search results based on tag', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(1).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="This is a test tag a0Xh2oSXTA"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('Should find no search results based on category', async ({ page }) => { - await page.click('span:has-text("More Filters ")'); - // Locate the specific dropdown using a more specific selector - const dropdownContainerSelector = '.ant-form-item-control-input-content'; - const dropdownSelector = `${dropdownContainerSelector} .ant-select-selector`; - // Click on the dropdown to open it - await page.locator(dropdownSelector).nth(2).click(); - // Select the option "One" from the dropdown - const optionSelector = '.ant-select-item-option[title="jxmixckixmm"]'; - await page.waitForSelector(optionSelector); - await page.locator(optionSelector).click(); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should create a template successfully ', async ({ page }) => { - const postSelector = 'text=One'; - // Click on the post to be edited - await page.click(postSelector); - // Click on the 'Templates' button - await page.click('button#template'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Template created' - expect(successMessage).toBe('Template created'); -}); - -test('should save a draft when clicked on a template successfully ', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - const postSelector = 'text=One'; - // Click on the post to be edited - await page.click(postSelector); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Post added' - expect(successMessage).toBe('Post added'); -}); - -test('should edit a template successfully', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - await page.click('button:has-text("show more")'); - const postSelector = 'div.ant-card-meta-description >> text="One"'; - const newPostName = 'One one'; - // Click on the post to be edited - await page.click(postSelector); - // Fill in the new post name - const inputSelector = '#title'; - await page.fill(inputSelector, newPostName); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - await page.click('.ant-notification-notice-close'); - // Click on the 'Publish' button - await page.click('button:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Check if "cannot publish post without author" message is displayed - const authorMessageSelector = 'text=cannot publish post without author'; - const isAuthorMessageVisible = await page.isVisible(authorMessageSelector); - if (isAuthorMessageVisible) { - console.log('Author selection required'); - await page.click('.ant-notification-notice-close'); // Close the notification - // Select an author if the message is displayed - await page.click('button:has([aria-label="setting"])'); - await page.click('div.ant-select-selector'); - await page.waitForSelector('div.ant-select-dropdown', { state: 'visible' }); // Ensure dropdown is visible - await page.keyboard.press('Enter'); // Select the first author in the list - await page.click('button:has([aria-label="close"])'); // Close the settings modal - await page.fill(inputSelector, newPostName); - // Click on the 'Publish' button again - await page.click('button:has-text("Publish")'); - page.on('dialog', (dialog) => dialog.accept()); // Handle any dialog that appears by accepting it - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - console.log('Success message received:', successMessage); // Log the success message - // Assert that the success message is 'Article Published' - expect(successMessage).toBe('Article Published'); - } -}); - -test('Should find search results', async ({ page }) => { - const postToSearch = 'new post'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill(searchInputSelector, postToSearch); - page.locator(postToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the post is visible in the results - const postExists = await page.isVisible(`text=${postToSearch}`); -}); - -test('Should find no search results', async ({ page }) => { - const postToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', postToSearch); - page.locator(postToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should show "cannot publish post without author" successfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Type the new post name into the input field - await page.type('#title', 'New Post'); - // Type the new post name into the input block - await page.click('p.is-empty.is-editor-empty'); - await page.keyboard.type('Sub title'); - // Click on the 'Save' button - await page.click('button:has-text("Publish")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the error message text - const errorMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the error message is 'cannot publish post without author' - expect(errorMessage).toBe('cannot publish post without author'); -}); - -test('should show "Please input the title!" succesfully ', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - await page.click('button:has-text("Publish")'); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the error message is 'Please input the title!' - expect(errorMessage).toBe('Please input the title!'); -}); - -test('should open to edit when clicked on template edit button successfully ', async ({ page }) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - // Locate the 'edit' buttons and click on the one in the second row, fourth column - const editButtons = page.locator('span[aria-label="edit"]'); - await editButtons.nth(5).click(); -}); - -test('should delete template when clicked on template delete button successfully ', async ({ - page, -}) => { - // Click on the 'Templates' button - await page.click('span:has-text("Templates")'); - // Click on the 'Show more' button - await page.click('button:has-text("Show more")'); - // Locate the 'edit' buttons and click on the one in the second row, fourth column - const editButtons = page.locator('span[aria-label="delete"]'); - await editButtons.nth(5).click(); - await page.click('button:has-text("OK")'); -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('should sort tags from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from latest to oldest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); - -test('should load the posts page successfully', async ({ page }) => { - // Locate the header postwith the text 'posts' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'posts' - await expect(accountLogin).toHaveText('Posts'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}posts-`); - // Locate the postthat shows '404' message - const accountLogin = await page.locator('text=404'); - // Assert that the '404' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist posts data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstTagText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the tags page - await page.goto(`${process.env.BASE_URL}`); - // Get the text content of the first h3 element again - const newFirstTagText = await page.locator('h3').first().textContent(); - // Assert that the tag data is the same across sessions - expect(firstTagText).toEqual(newFirstTagText); -}); - -//Perform this test case only when there are no tags present -test('should display empty state when no posts are present', async ({ page }) => { - // Locate the selector that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); - -test('should sort tags from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from oldest to latest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); diff --git a/studio/e2e_tests/tests/randomfunc.js b/studio/e2e_tests/tests/randomfunc.js deleted file mode 100644 index 9bb5d2757..000000000 --- a/studio/e2e_tests/tests/randomfunc.js +++ /dev/null @@ -1,9 +0,0 @@ -// Helper function to generate a random string using JavaScript's Math.random -export function getRandomString(length) { - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - let result = ''; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * characters.length)); - } - return result; -} diff --git a/studio/e2e_tests/tests/ratings.spec.js b/studio/e2e_tests/tests/ratings.spec.js deleted file mode 100644 index 028ec165b..000000000 --- a/studio/e2e_tests/tests/ratings.spec.js +++ /dev/null @@ -1,254 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}ratings?sort=desc&limit=10&page=1`); -}); - -let createdRatingName = ''; -let editedRatingName = ''; - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -test.only('should create rating successfully', async ({ page }) => { - // Click on the 'New Rating' button - await page.click('button:has-text("New Rating")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new rating name with the random string into the input field - createdRatingName = `This is a test rating ${randomString}`; - await page.type('#creat-rating_name', createdRatingName); - await page.type('#creat-rating_numeric_value', '5'); - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Rating created' - expect(successMessage).toBe('Rating created'); -}); - -test.only('should edit a ratings name successfully', async ({ page }) => { - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - const editedRatingName = `This is an edited rating name ${randomString}`; - // Click on the rating to be edited - await page.click(`text=${createdRatingName}`); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Fill in the new rating name - const inputSelector = '#creat-rating_name'; - await page.fill(inputSelector, editedRatingName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'rating updated' - expect(successMessage).toBe('Rating updated'); -}); - -test.only('should delete rating successfully', async ({ page }) => { - const ratingText = editedRatingName; - const nextButtonSelector = 'button:has([aria-label="right"])'; - let ratingFound = false; - while (true) { - // Check if the rating is present on the current page - const rowSelector = `tr:has-text("${ratingText}")`; - - const buttonSelector = 'button:has([aria-label="delete"])'; - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Check if the row with the rating text is visible - const rowCount = await page.locator(rowSelector).count(); - if (rowCount > 0) { - // Click the delete button - await buttonLocator.first().click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - ratingFound = true; - break; - } - // Check if the "Next" button is available - const nextButtonEnabled = await page.isEnabled(nextButtonSelector); - if (!nextButtonEnabled) { - // If there are no more pages to check, break the loop - break; - } - // Click the "Next" button to go to the next page - await page.click(nextButtonSelector); - } - // Assert that the rating was found and deleted - expect(ratingFound).toBe(true); -}); - -test('should edit a ratings value successfully ', async ({ page }) => { - const ratingSelector = 'text=Trues'; - const newRatingValue = '6'; - // Click on the rating to be edited - await page.click(ratingSelector); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Fill in the new rating name - const inputSelector = '#creat-rating_numeric_value'; - await page.fill(inputSelector, newRatingValue); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Check if the rating name has been updated - await page.isVisible(`text=True`); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'rating updated' - expect(successMessage).toBe('Rating updated'); -}); - -test('should display "rating with same name already exists" successfully', async ({ page }) => { - // Click on the 'New Rating' button - await page.click('button:has-text("New Rating")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the rating name which already exists and its value into the input fields - await page.type('#creat-rating_name', 'Trues'); - await page.type('#creat-rating_numeric_value', '3'); - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - page.on('dialog', (dialog) => dialog.accept()); - const successMessage = await page.textContent('.ant-notification-notice-description'); - expect(successMessage).toBe('Entity with same name exists'); -}); - -test('should display "rating with same numeric value exists" successfully', async ({ page }) => { - // Click on the 'New Rating' button - await page.click('button:has-text("New Rating")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new rating name with the random string into the input field - const ratingName = `This is a test rating ${randomString}`; - await page.type('#creat-rating_name', ratingName); - await page.type('#creat-rating_numeric_value', '3'); - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'rating with same numeric value exists' - expect(successMessage).toBe('rating with same numeric value exists'); -}); - -test('should load the ratings page successfully', async ({ page }) => { - // Locate the header element with the text 'ratings' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'Ratings' - await expect(accountLogin).toHaveText('Ratings'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}ratings?page=NaN`); - // Locate the element that shows 'No data' message - const accountLogin = await page.locator('text=No data'); - // Assert that the 'No data' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist ratings data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstratingText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the ratings page - await page.goto(`${process.env.BASE_URL}ratings?page=1`); - // Get the text content of the first h3 element again - const newFirstratingText = await page.locator('h3').first().textContent(); - // Assert that the rating data is the same across sessions - expect(firstratingText).toEqual(newFirstratingText); -}); - -//Perform this test case only when there are no ratings present -test('should display empty state when no ratings are present', async ({ page }) => { - // Locate the element that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); - -test('should check for the numeric value input field up and down functionality successfully', async ({ - page, -}) => { - // Click on the 'New Rating' button - await page.click('button:has-text("New Rating")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the rating name into the input field - const ratingName = 'This is a test rating'; - let ratingValue = 5; // starting value - await page.type('#creat-rating_name', ratingName); - // Focus on the rating value input field - const ratingInput = await page.$('#creat-rating_numeric_value'); - await ratingInput.focus(); - await page.type('#creat-rating_numeric_value', ratingValue.toString()); - // Press the 'Up' key to increment the rating value - await page.keyboard.press('ArrowUp'); - ratingValue += 1; - // Press the 'Down' key to decrement the rating value - await page.keyboard.press('ArrowDown'); - ratingValue -= 1; - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Rating created' - expect(successMessage).toBe('Rating created'); -}); - -test('when the button is clicked, should scroll to the top of the page', async ({ page }) => { - const ratingSelector = 'text=Trues'; - await page.click(ratingSelector); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - // Find the scroll to top button and click it - const spanElement = page.locator('span[aria-label="vertical-align-top"]'); - // Click on the span element - await spanElement.click(); - // Wait for the scroll action to complete - await page.waitForTimeout(1000); // adjust the timeout based on your scroll animation duration - // Check if the page is scrolled to the top - const scrollPosition = await page.evaluate(() => window.scrollY); - expect(scrollPosition).toBe(0); -}); diff --git a/studio/e2e_tests/tests/tags.spec.js b/studio/e2e_tests/tests/tags.spec.js deleted file mode 100644 index a75febbe6..000000000 --- a/studio/e2e_tests/tests/tags.spec.js +++ /dev/null @@ -1,376 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}tags?sort=desc&limit=10&page=1`); -}); - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); - -let createdTagName = ''; // Define a global variable to store the created tag name -let editedTagName = ''; // Define a global variable to store the edited tag name - -test.only('should create tag successfully', async ({ page }) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - // Type the new tag name with the random string into the input field - createdTagName = `This is a test tag ${randomString}`; - await page.type('#create-tag_name', createdTagName); - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Tag created' - expect(successMessage).toBe('Tag created'); -}); - -test('should edit a tag successfully', async ({ page }) => { - // Generate a random string - const randomString = getRandomString(10); // Adjust the length as needed - editedTagName = `This is an edited test tag ${randomString}`; - const tagSelector = `text=${createdTagName}`; - let tagFound = false; - let pageIndex = 1; - // Function to check if the tag is on the current page - const isTagVisible = async () => { - const tagElements = await page.$$(tagSelector); - return tagElements.length > 0; - }; - // Loop through pages until the tag is found - while (!tagFound) { - tagFound = await isTagVisible(); - if (!tagFound) { - // Click the next page button (assuming there's a next page button with the text 'Next') - const nextButton = await page.$('button:has([aria-label="right"])'); - if (!nextButton) { - break; // No more pages to navigate - } - await nextButton.click(); - await page.waitForTimeout(1000); // Wait for the next page to load - pageIndex++; - } - } - if (tagFound) { - // Click on the tag to be edited - await page.click(tagSelector); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Fill in the new tag name - const inputSelector = '#create-tag_name'; - await page.fill(inputSelector, editedTagName); - // Click on the 'Update' button - await page.click('button:has-text("Update")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Check if the tag name has been updated - const updatedTag = await page.textContent(`text=${editedTagName}`); - expect(updatedTag).toBe(editedTagName); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Tag updated' - expect(successMessage).toBe('Tag updated'); - } else { - throw new Error(`Tag with name "${createdTagName}" not found.`); - } -}); - -test('Should find search results', async ({ page }) => { - const tagToSearch = editedTagName; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill(searchInputSelector, tagToSearch); - page.locator(tagToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that the tag is visible in the results - const tagExists = await page.isVisible(`text=${tagToSearch}`); -}); - -test('should display "tag already exists" successfully', async ({ page }) => { - // Define the selector for the tag to be clicked - const tagName = editedTagName; - // Define the new tag name to be entered - const newTagName = editedTagName; - // Click the tag to create a new entry - await page.click(`text=${tagName}`); - // Click the button to expand the form - await page.click('button:has-text("Expand")'); - // Define the selector for the input field where the tag name will be entered - const inputSelector = '#create-tag_name'; - await page.click(inputSelector); - // Get the length of the typed text - const deletePressCount = tagName.length; - // Press the Backspace key multiple times - for (let i = 0; i < deletePressCount; i++) { - await page.keyboard.press('Backspace'); - } - // Fill the input field with the new tag name - await page.fill(inputSelector, newTagName); - // Click the button to update/create the tag - await page.click('button:has-text("Update")'); - // Handle the dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message displayed in the notification - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message matches the expected text - expect(successMessage).toBe('Entity with same name exists'); -}); - -test('should delete tag successfully', async ({ page }) => { - const tagText = editedTagName; - const nextButtonSelector = 'button:has([aria-label="right"])'; - let tagFound = false; - while (true) { - // Check if the tag is present on the current page - const rowSelector = `tr:has-text("${tagText}")`; - - const buttonSelector = 'button:has([aria-label="delete"])'; - const buttonLocator = page.locator(`${rowSelector} ${buttonSelector}`); - // Check if the row with the tag text is visible - const rowCount = await page.locator(rowSelector).count(); - if (rowCount > 0) { - // Ensure the button is available before clicking - await buttonLocator.waitFor({ state: 'visible' }); - // Click the delete button - await buttonLocator.click(); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - // Get the success message text - const successMessage = await page.textContent('.ant-notification-notice-description'); - // Assert that the success message is 'Tag deleted' - expect(successMessage).toBe('Tag deleted'); - tagFound = true; - break; - } - // Check if the "Next" button is available - const nextButtonEnabled = await page.isEnabled(nextButtonSelector); - if (!nextButtonEnabled) { - // If there are no more pages to check, break the loop - break; - } - // Click the "Next" button to go to the next page - await page.click(nextButtonSelector); - } - // Assert that the tag was found and deleted - expect(tagFound).toBe(true); -}); - -test('should load the tags page successfully', async ({ page }) => { - // Locate the header element with the text 'Tags' - const accountLogin = await page.locator('h3'); - // Assert that the header has the text 'Tags' - await expect(accountLogin).toHaveText('Tags'); -}); - -test('should handle invalid URL parameters gracefully', async ({ page }) => { - // Navigate to the URL with invalid parameters - await page.goto(`${process.env.BASE_URL}tags?sort=desc&limit=10&page=NaN`); - // Locate the element that shows 'No data' message - const accountLogin = await page.locator('text=No data'); - // Assert that the 'No data' message is visible - await expect(accountLogin).toBeVisible(); -}); - -test('should persist tag data across sessions', async ({ page, context }) => { - // Get the text content of the first h3 element - const firstTagText = await page.locator('h3').first().textContent(); - // Open a new page in the same context - await context.newPage(); - // Navigate to the tags page - await page.goto(`${process.env.BASE_URL}tags?sort=desc&limit=10&page=1`); - // Get the text content of the first h3 element again - const newFirstTagText = await page.locator('h3').first().textContent(); - // Assert that the tag data is the same across sessions - expect(firstTagText).toEqual(newFirstTagText); -}); - -test('should display "Please enter name!" successfully, when the name input field is empty', async ({ - page, -}) => { - // Click on the 'Create' button - await page.click('button:has-text("Create")'); - // Click on the 'Expand' button - await page.click('button:has-text("Expand")'); - // Type the new tag name into the input field - const tagName = 'This is a test tag'; - await page.type('#create-tag_name', tagName); - // Get the length of the typed text - const deletePressCount = tagName.length; - // Press the Backspace key multiple times - for (let i = 0; i < deletePressCount; i++) { - await page.keyboard.press('Backspace'); - } - // Click on the 'Save' button - await page.click('button:has-text("Save")'); - // Wait for the error message to appear - await page.waitForSelector('.ant-form-item-explain-error', { timeout: 80000 }); - // Get the error message text - const errorMessage = await page.textContent('.ant-form-item-explain-error'); - // Assert that the success message is 'Please enter name!' - expect(errorMessage).toBe('Please enter name!'); -}); - -test('should remove alert box when x is clicked successfully', async ({ page }) => { - const tagText = 'Twelve'; - const tagSelector = `text=${tagText}`; - // Click on the delete button for the tag - await page.click('button:has([aria-label="delete"])'); - // Click on the 'OK' button in the confirmation dialog - await page.click('button:has-text("OK")'); - // Handle any dialog that appears by accepting it - page.on('dialog', (dialog) => dialog.accept()); - await page.click('.ant-notification-notice-close'); - // Locate the element that shows 'Tag deleted' message - const accountLogin = await page.locator('text=Tag deleted'); - // Assert that the 'No data' message is visible - await expect(accountLogin).not.toBeVisible(); -}); - -test('when the button is clicked, should scroll to the top of the page', async ({ page }) => { - const tagSelector = 'text=Nine'; - await page.click(tagSelector); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - await page.click('button:has-text("Expand")'); - // Find the scroll to top button and click it - const spanElement = page.locator('span[aria-label="vertical-align-top"]'); - // Click on the span element - await spanElement.click(); - // Wait for the scroll action to complete - await page.waitForTimeout(1000); // adjust the timeout based on your scroll animation duration - // Check if the page is scrolled to the top - const scrollPosition = await page.evaluate(() => window.scrollY); - expect(scrollPosition).toBe(0); -}); - -//Perform this test case only when there are no tags present -test('should display empty state when no tags are present', async ({ page }) => { - // Locate the element that represents the empty state image - const emptyStateMessage = await page.locator('.ant-empty-image'); - // Assert that the empty state image is visible - await expect(emptyStateMessage).toBeVisible(); -}); - -test('Should find no search results', async ({ page }) => { - const tagToSearch = 'Zero'; - const searchInputSelector = '#filters_q'; - // Click the search button - await page.click('button:has([aria-label="search"])'); - // Enter the search query - await page.fill('#filters_q', tagToSearch); - page.locator(tagToSearch); - // Press 'Enter' to search - await page.press(searchInputSelector, 'Enter'); - // Verify that 'No data' is visible - const accountLogin = await page.locator('text=No data'); - await expect(accountLogin).toBeVisible(); -}); - -test('should navigate to the next page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain('page=2'); -}); - -test('should navigate to the previous page', async ({ page }) => { - // Click the button to navigate to the next page - await page.click('button:has([aria-label="right"])'); - // Click the button to navigate back to the previous page - await page.click('button:has([aria-label="left"])'); - // Verify that the URL contains 'page=1' - expect(page.url()).toContain('page=1'); -}); - -test('should navigate to the selected page', async ({ page }) => { - const pageNumber = 2; // You can set this to any number dynamically - // Click the button to navigate to the next page - await page.click(`.ant-pagination-item-${pageNumber}`); - // Verify that the URL contains 'page=2' - expect(page.url()).toContain(`page=${pageNumber}`); -}); - -test('should sort tags from latest to oldest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from latest to oldest - await page.click('.ant-select-item[title="Latest"]'); - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from latest to oldest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(b) - getTime(a); - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); - -test('should sort tags from oldest to latest', async ({ page }) => { - // Click on the sorting dropdown - await page.click('#filters_sort', { force: true }); - // Click on the option for sorting from oldest to latest - await page.click('.ant-select-item[title="Old"]'); // Adjust the title as needed if "Old" means oldest - // Get the text content of all tags - const tags = await page.$$eval('.ant-table-tbody tr', (rows) => { - return rows.map((row) => row.textContent.trim()); - }); - // Check if tags are sorted from oldest to latest - const sortedtags = tags.slice().sort((a, b) => { - // Extract timestamp from the row content and compare - const getTime = (str) => { - const match = str.match(/Created At:\s*(.+)/); - if (match) { - return new Date(match[1]).getTime(); - } - return 0; - }; - return getTime(a) - getTime(b); // Sorting in ascending order - }); - // Check if the tags are in the correct order - expect(tags).toEqual(sortedtags); -}); diff --git a/studio/e2e_tests/tests/test.spec.js b/studio/e2e_tests/tests/test.spec.js deleted file mode 100644 index bcbd79980..000000000 --- a/studio/e2e_tests/tests/test.spec.js +++ /dev/null @@ -1,33 +0,0 @@ -// Import necessary modules from Playwright -import { test, expect } from '@playwright/test'; -import dotenv from 'dotenv'; -import { getRandomString } from './randomfunc.js'; -// Read from default ".env" file. -dotenv.config(); - -// This beforeEach hook runs before each test, setting up the test environment -test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - // Load session cookies from the file - await page - .context() - .addCookies(JSON.parse(require('fs').readFileSync('state.json', 'utf8')).cookies); - // Navigate to a page that requires login - await page.goto(`${process.env.BASE_URL}`); - // Verify the user is still logged in - expect(await page.isVisible('text="Dashboard"')).toBeTruthy(); - await page.goto(`${process.env.BASE_URL}posts`); -}); - -test('login', async ({ page }) => { - // Navigate to the login page - await page.goto(`${process.env.BASE_URL}`); - // Fill in the email and password fields - await page.type('#auth_email', `${process.env.AUTH_EMAIL}`); - await page.type('#auth_password', `${process.env.AUTH_PASSWORD}`); - // Click the login button - await page.click('text=Login'); - // Save session cookies to a file - const cookies = await page.context().cookies(); - await page.context().storageState({ path: 'state.json' }); -}); diff --git a/studio/eslint.config.js b/studio/eslint.config.js new file mode 100644 index 000000000..dc5773ed4 --- /dev/null +++ b/studio/eslint.config.js @@ -0,0 +1,31 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { ignores: ["dist"] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ["**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "off", + "no-unused-vars": "off", + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, + } +); diff --git a/studio/index.html b/studio/index.html new file mode 100644 index 000000000..f6055b789 --- /dev/null +++ b/studio/index.html @@ -0,0 +1,13 @@ + + + + + + + Dega + + +
+ + + diff --git a/studio/package-lock.json b/studio/package-lock.json index ea8cd0589..a59dfd2f7 100644 --- a/studio/package-lock.json +++ b/studio/package-lock.json @@ -1,95 +1,106 @@ { - "name": "gateway", - "version": "0.3.0", + "name": "studio-shadcn", + "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "gateway", - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "@ant-design/icons": "^4.2.1", - "@ant-design/pro-layout": "^7.2.6", - "@editorjs/editorjs": "^2.18.0", - "@editorjs/header": "^2.5.0", - "@editorjs/list": "^1.5.0", - "@editorjs/paragraph": "^2.7.0", - "@editorjs/quote": "^2.3.0", - "@editorjs/raw": "^2.1.2", - "@editorjs/table": "^1.2.2", - "@factly/scooter-claim": "^0.0.45", - "@factly/scooter-code-block": "^0.0.45", - "@factly/scooter-core": "^0.0.45", - "@factly/scooter-embed": "^0.0.45", - "@factly/scooter-table": "^0.0.45", - "@monaco-editor/react": "4.4.6", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.5.0", - "@testing-library/user-event": "^7.2.1", - "@uppy/google-drive": "^3.5.0", - "@uppy/image-editor": "^2.4.0", - "ajv": "^8.17.1", - "antd": "^5.0.4", - "axios": "^0.21.1", - "dayjs": "^1.11.6", - "deep-equal": "^2.0.3", - "dotenv": "^16.4.5", - "jest-sonar-reporter": "^2.0.0", - "monaco-editor": "^0.25.2", - "playwright": "^1.44.1", + "name": "studio-shadcn", + "version": "0.0.0", + "dependencies": { + "@factly/scooter-claim": "^0.0.48", + "@factly/scooter-code-block": "^0.0.48", + "@factly/scooter-core": "^0.0.48", + "@factly/scooter-embed": "^0.0.48", + "@factly/scooter-table": "^0.0.48", + "@hookform/resolvers": "^4.1.0", + "@monaco-editor/react": "^4.7.0", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-tooltip": "^1.1.8", + "@redux-devtools/extension": "^3.3.0", + "@reduxjs/toolkit": "^2.5.1", + "@tailwindcss/vite": "^4.0.17", + "@uppy/aws-s3": "^4.2.3", + "@uppy/core": "^4.4.2", + "@uppy/dashboard": "^4.3.2", + "@uppy/drag-drop": "^4.1.1", + "@uppy/file-input": "^4.1.1", + "@uppy/google-drive": "^4.3.1", + "@uppy/image-editor": "^3.3.1", + "@uppy/progress-bar": "^4.2.1", + "@uppy/react": "^4.2.1", + "@uppy/url": "^4.2.2", + "axios": "^1.7.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "date-fns": "^4.1.0", + "dayjs": "^1.11.13", + "deep-equal": "^2.2.3", + "deps": "^1.0.0", + "lucide-react": "^0.475.0", + "next-themes": "^0.4.6", "qrcode.react": "^4.2.0", - "react": "^18.2.0", + "react": "^19.0.0", "react-color": "^2.19.3", - "react-dom": "^18.2.0", + "react-day-picker": "^8.10.1", + "react-dayjs": "^0.3.2", + "react-dom": "^19.0.0", "react-helmet": "^6.1.0", - "react-redux": "^7.2.0", - "react-router-dom": "^6.9.0", - "react-scripts": "^5.0.1", - "redux": "^4.0.5", - "redux-devtools-extension": "^2.13.8", - "redux-thunk": "^2.3.0" + "react-hook-form": "^7.54.2", + "react-redux": "^9.2.0", + "react-router-dom": "^7.1.5", + "redux": "^5.0.1", + "reselect": "^5.1.1", + "sonner": "^2.0.3", + "tailwind-merge": "^3.0.1", + "tailwindcss": "^4.0.17", + "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", + "zod": "^3.24.2" }, "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@commitlint/cli": "^9.1.1", - "@commitlint/config-conventional": "^9.1.1", - "@editorjs/code": "^2.6.0", - "@editorjs/delimiter": "^1.2.0", - "@editorjs/inline-code": "^1.3.1", - "@editorjs/marker": "^1.2.2", - "@playwright/test": "^1.44.1", - "cz-conventional-changelog": "^3.3.0", - "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.2", - "enzyme-to-json": "^3.5.0", - "eslint": "^8.46.0", - "husky": "^4.2.5", - "lint-staged": "^10.2.11", - "prettier": "2.0.5", - "react-test-renderer": "^16.13.1", - "redux-mock-store": "^1.5.4", - "semantic-release": "^17.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@eslint/js": "^9.19.0", + "@types/deep-equal": "^1.0.4", + "@types/node": "^22.13.4", + "@types/qrcode.react": "^1.0.5", + "@types/react": "^19.0.10", + "@types/react-color": "^3.0.13", + "@types/react-dom": "^19.0.3", + "@types/react-helmet": "^6.1.11", + "@types/tailwindcss": "^3.0.11", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.19.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.18", + "globals": "^15.14.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.22.0", + "vite": "^6.1.0", + "vite-plugin-svgr": "^4.3.0" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -98,239 +109,11 @@ "node": ">=6.0.0" } }, - "node_modules/@ant-design/colors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", - "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.0" - } - }, - "node_modules/@ant-design/cssinjs": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.22.1.tgz", - "integrity": "sha512-SLuXM4wiEE1blOx94iXrkOgseMZHzdr4ngdFu3VVDq6AOWh7rlwqTkMAtJho3EsBF6x/eUGOtK53VZXGQG7+sQ==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "@emotion/hash": "^0.8.0", - "@emotion/unitless": "^0.7.5", - "classnames": "^2.3.1", - "csstype": "^3.1.3", - "rc-util": "^5.35.0", - "stylis": "^4.3.4" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/cssinjs-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", - "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.0", - "@babel/runtime": "^7.23.2", - "rc-util": "^5.38.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@ant-design/fast-color": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", - "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", - "dependencies": { - "@babel/runtime": "^7.24.7" - }, - "engines": { - "node": ">=8.x" - } - }, - "node_modules/@ant-design/icons": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.3.tgz", - "integrity": "sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==", - "dependencies": { - "@ant-design/colors": "^6.0.0", - "@ant-design/icons-svg": "^4.3.0", - "@babel/runtime": "^7.11.2", - "classnames": "^2.2.6", - "lodash": "^4.17.15", - "rc-util": "^5.9.4" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/icons-svg": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" - }, - "node_modules/@ant-design/pro-layout": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.21.2.tgz", - "integrity": "sha512-dtqap5YNDrxUWxhi43QJQSv1JLHYPCV4/h4cFM10HNiX/86Cxw37DiCOMdIM/ZwWk619BiwN7CJNgL5Q8obrAQ==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.2", - "@ant-design/pro-utils": "2.16.2", - "@babel/runtime": "^7.18.0", - "@umijs/route-utils": "^4.0.0", - "@umijs/use-params": "^1.0.9", - "classnames": "^2.3.2", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "omit.js": "^2.0.2", - "path-to-regexp": "8.0.0", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.0.6", - "swr": "^2.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-layout/node_modules/@ant-design/colors": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", - "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", - "dependencies": { - "@ctrl/tinycolor": "^3.6.1" - } - }, - "node_modules/@ant-design/pro-layout/node_modules/@ant-design/icons": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.5.2.tgz", - "integrity": "sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-provider": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.15.2.tgz", - "integrity": "sha512-7WSJcjYIuLwco1YiiSgEEJnrqvg7x/YZap8pxOChRnyNh9S3HuV1D5HTc18kfHTpWqZWTAUcS66b0kMP96uKrw==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@babel/runtime": "^7.18.0", - "@ctrl/tinycolor": "^3.4.0", - "dayjs": "^1.11.10", - "rc-util": "^5.0.1", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-utils": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.16.2.tgz", - "integrity": "sha512-ama73ZSzz9O6Qz6DvHd6cnyUA3vI7N+AAl5BV5plijujtnXpNC8KJMXl9jOI1K7QuUVJgJIKbZ2DVm8LnBcTAQ==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.2", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-util": "^5.0.6", - "safe-stable-stringify": "^2.4.3", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-utils/node_modules/@ant-design/colors": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", - "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", - "dependencies": { - "@ctrl/tinycolor": "^3.6.1" - } - }, - "node_modules/@ant-design/pro-utils/node_modules/@ant-design/icons": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.5.2.tgz", - "integrity": "sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/react-slick": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", - "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", - "dependencies": { - "@babel/runtime": "^7.10.4", - "classnames": "^2.2.5", - "json2mq": "^0.2.0", - "resize-observer-polyfill": "^1.5.1", - "throttle-debounce": "^5.0.0" - }, - "peerDependencies": { - "react": ">=16.9.0" - } - }, - "node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -341,28 +124,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -377,38 +164,15 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz", - "integrity": "sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -417,23 +181,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -443,86 +198,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "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.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "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.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", - "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-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -535,6 +216,8 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -547,65 +230,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -614,6 +244,8 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -622,6 +254,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -630,41 +263,34 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -673,25 +299,28 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -699,24624 +328,7381 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "node_modules/@babel/runtime": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "node_modules/@babel/traverse": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "node_modules/@babel/types": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", - "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@eslint/js": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", + "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" - }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "node_modules/@factly/scooter-bubble-menu": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-bubble-menu/-/scooter-bubble-menu-0.0.48.tgz", + "integrity": "sha512-4raBcUIixqi3NG6Ef2qF1SsD03qQwkS7Vqo6Bzoec8FTIwcvw6RJZTJfRtQWH96CDv59GN4mHJcgfur2eYlNPg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-image": "0.0.48", + "@factly/scooter-shared-utils": "0.0.48", + "@factly/scooter-ui": "0.0.48", + "@tiptap/pm": "2.3.1", + "@tiptap/react": "2.0.4", + "classnames": "2.5.1", + "react-icons": "^4.7.1", + "tippy.js": "6.3.7" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "node_modules/@factly/scooter-bubble-menu/node_modules/@remirror/core-constants": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", + "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==", + "license": "MIT" + }, + "node_modules/@factly/scooter-bubble-menu/node_modules/@tiptap/pm": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz", + "integrity": "sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.3.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.5", + "prosemirror-trailing-node": "^2.0.7", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "node_modules/@factly/scooter-bubble-menu/node_modules/prosemirror-trailing-node": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz", + "integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@remirror/core-constants": "^2.0.2", + "escape-string-regexp": "^4.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "node_modules/@factly/scooter-claim": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-claim/-/scooter-claim-0.0.48.tgz", + "integrity": "sha512-+tsvw/Yqm0Jd4cgQhrED/tEDwyy52SJoDYW4p6NCZ2X9x7BP9nNjIJPR6iHgnAyOdxkocExqBqXpxvNHlECtoQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-ui": "0.0.48", + "@tiptap/core": "2.3.1", + "@tiptap/react": "2.0.4", + "react-icons": "^4.7.1", + "react-paginate": "8.2.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "node_modules/@factly/scooter-code-block": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-code-block/-/scooter-code-block-0.0.48.tgz", + "integrity": "sha512-9n0nStVzQcCmd6/59Qx9haFr0xgmXnhwMzAdVc5nCLxigyJ6y7azRcB0zhMJ52GxFE/9xehRzW1VfVRQkhV7fg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@tiptap/extension-code-block-lowlight": "2.3.1", + "@tiptap/react": "2.0.4", + "lowlight": "2.9.0", + "react-icons": "4.12.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "node_modules/@factly/scooter-core": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-core/-/scooter-core-0.0.48.tgz", + "integrity": "sha512-8pzIIsWuNDNSl4BEiRXfykS8nbO13K1mDKk0//gk4Cp93ppuU/Ywln4urQ0+D65xT7rd3FHTwXtHOEzKB/KzxQ==", + "dependencies": { + "@factly/scooter-bubble-menu": "0.0.48", + "@factly/scooter-fixed-menu": "0.0.48", + "@factly/scooter-shared-utils": "0.0.48", + "@factly/scooter-slash-commands": "0.0.48", + "@factly/scooter-ui": "0.0.48", + "@storybook/addons": "6.5.16", + "@storybook/theming": "6.5.16", + "@tiptap/core": "2.3.1", + "@tiptap/extension-character-count": "2.3.1", + "@tiptap/extension-color": "2.3.1", + "@tiptap/extension-document": "2.3.1", + "@tiptap/extension-heading": "2.3.1", + "@tiptap/extension-highlight": "2.3.1", + "@tiptap/extension-link": "2.3.1", + "@tiptap/extension-subscript": "2.3.1", + "@tiptap/extension-superscript": "2.3.1", + "@tiptap/extension-text-align": "2.3.1", + "@tiptap/extension-text-style": "2.3.1", + "@tiptap/extension-typography": "2.3.1", + "@tiptap/extension-underline": "2.3.1", + "@tiptap/pm": "^2.0.0-beta.218", + "@tiptap/react": "2.0.4", + "@tiptap/starter-kit": "2.3.1", + "classnames": "2.5.1", + "dangerously-set-html-content": "1.1.0", + "dompurify": "3.1.2", + "lodash.isplainobject": "4.0.6", + "react-icons": "4.12.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "node_modules/@factly/scooter-embed": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-embed/-/scooter-embed-0.0.48.tgz", + "integrity": "sha512-SO46+D5OihYj/BHh5xXzCsSJyc6eNnIXWYSJKmVrblfjSzAeyjbNfH2MkBG8eLgq2IeMBZMF6U4qq5KSVNn7Ug==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-shared-utils": "0.0.48", + "@factly/scooter-ui": "0.0.48", + "@tiptap/core": "2.3.1", + "@tiptap/react": "2.0.4", + "axios": "1.6.8", + "dangerously-set-html-content": "1.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", - "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", + "node_modules/@factly/scooter-embed/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-flow": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@factly/scooter-fixed-menu": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-fixed-menu/-/scooter-fixed-menu-0.0.48.tgz", + "integrity": "sha512-aRijiWryEI4wVtsycX/NHUAJ/9df6ZQZ17kl/X5WAz/hSwXGAzrs60Qh4FgbFAFFVlULsm1kZRYfwLP0Ln8TAA==", + "dependencies": { + "@factly/scooter-bubble-menu": "0.0.48", + "@factly/scooter-image": "0.0.48", + "@factly/scooter-shared-utils": "0.0.48", + "@factly/scooter-ui": "0.0.48", + "classnames": "2.5.1", + "react-icons": "4.12.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "node_modules/@factly/scooter-image": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-image/-/scooter-image-0.0.48.tgz", + "integrity": "sha512-G7Q/HxztVodV9jk50YwjOAd2yjUvEsoA468rSPQ3/d6mLUDOFk/R++JXSljO6rNT7D2VgzRMIycNRct8ee2ssA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-shared-utils": "0.0.48", + "@factly/scooter-ui": "0.0.48", + "@tiptap/core": "2.3.1", + "@tiptap/extension-image": "2.3.1", + "@uppy/aws-s3": "3.6.2", + "@uppy/core": "3.11.0", + "@uppy/dashboard": "^3.3.1", + "@uppy/drag-drop": "^3.0.1", + "@uppy/file-input": "^3.0.1", + "@uppy/progress-bar": "^3.0.1", + "@uppy/react": "3.3.1", + "@uppy/status-bar": "^3.0.1", + "@uppy/url": "3.6.1", + "axios": "1.6.8", + "classnames": "2.5.1", + "react-icons": "4.12.0", + "react-masonry-infinite": "1.2.2", + "react-paginate": "8.2.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "node_modules/@factly/scooter-image/node_modules/@uppy/aws-s3": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@uppy/aws-s3/-/aws-s3-3.6.2.tgz", + "integrity": "sha512-pXXSfJbPLR9tmmLFckKU3lyp7Zx4AVvamH/Y5MU2WHKj8TQMrGeM0/M/nXn8SIa7roYEaskY6dVYT/DcHLdO9A==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/aws-s3-multipart": "^3.10.2", + "@uppy/companion-client": "^3.7.2", + "@uppy/utils": "^5.7.2", + "@uppy/xhr-upload": "^3.6.2", + "nanoid": "^4.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.9.1" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "node_modules/@factly/scooter-image/node_modules/@uppy/companion-client": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.2.tgz", + "integrity": "sha512-WLjZ0Y6Fe7lzwU1YPvvQ/YqooejcgIZkT2TC39xr+QQ7Y1FwJECsyUdlKwgi1ee8TNpjoCrj3Q1Hjel/+p0VhA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.9.0", + "namespace-emitter": "^2.0.1", + "p-retry": "^6.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.13.1" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "node_modules/@factly/scooter-image/node_modules/@uppy/core": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.11.0.tgz", + "integrity": "sha512-sqQEvAvZRC3Pq/qqAptLPYj4VVb5HAUqLHuUevnI1MevZUAnn1iYIvddSXDAdpNbtwUvOZlEx06UfRAo6C0dIQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@transloadit/prettier-bytes": "^0.3.0", + "@uppy/store-default": "^3.2.2", + "@uppy/utils": "^5.9.0", + "lodash": "^4.17.21", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^4.0.0", + "preact": "^10.5.13" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "node_modules/@factly/scooter-image/node_modules/@uppy/dashboard": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.9.1.tgz", + "integrity": "sha512-zZp+5Dwqu1jUdAZEu0Os2kC/8bF3cdrkve8CYEwqP/12yjNe8PF+XUQKF1RCYITjDE4hPSXcTh0MWw6t2LONuw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/informer": "^3.1.0", + "@uppy/provider-views": "^3.13.0", + "@uppy/status-bar": "^3.3.3", + "@uppy/thumbnail-generator": "^3.1.0", + "@uppy/utils": "^5.9.0", + "classnames": "^2.2.6", + "is-shallow-equal": "^1.0.1", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "nanoid": "^4.0.0", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.13.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "node_modules/@factly/scooter-image/node_modules/@uppy/drag-drop": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-3.1.1.tgz", + "integrity": "sha512-ujUBswJ/Acvg1UQUPtfWO6PekPzFgQAEtDW7yxsi81wy1/WNIYjY36bxKVpM/cz5PjmWOTWoqdjBQa4LIJCdyw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.9.0", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.13.1" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "node_modules/@factly/scooter-image/node_modules/@uppy/file-input": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-3.1.2.tgz", + "integrity": "sha512-IgZhK3EfO2bEqmEwpqfo3N9k8OxV2pmuGdKU4IuwJFv3Q1s1F6ceSDhWX8ivtVXlDvnbJIkqZbZjnvWwJxfjng==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.9.0", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.11.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "node_modules/@factly/scooter-image/node_modules/@uppy/informer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.1.0.tgz", + "integrity": "sha512-vmpTLqzSLmZSuIVDZV0o19yXVqyTh5/uCbKUEiyfBhR726kQiuYQLP/ZHaKcvW3c1ESQGbNg53iNHbFBqF681w==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.7.4", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.9.3" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "node_modules/@factly/scooter-image/node_modules/@uppy/progress-bar": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-3.1.1.tgz", + "integrity": "sha512-c7Wcv6/gvrdxICnZUaU/cZG6wUtS0V/GYGssGFQ6OW84h0smuzGGA+KOh9zKqr6HBHxgKRxmCDtrlTlSSvAuQQ==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.7.5", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.10.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "node_modules/@factly/scooter-image/node_modules/@uppy/provider-views": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.13.0.tgz", + "integrity": "sha512-Z2oI88A+GC2zIPk8beoeFN/miHKkhtF58mYjvb5miGCMMZM7p7LRj98sgb5OOdKsGrfeiuTavtgL424BvcVd8w==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.9.0", + "classnames": "^2.2.6", + "nanoid": "^4.0.0", + "p-queue": "^7.3.4", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@uppy/core": "^3.13.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "node_modules/@factly/scooter-image/node_modules/@uppy/react": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@uppy/react/-/react-3.3.1.tgz", + "integrity": "sha512-9BTbWgix4Ob4HyaT2+PJWSLfCCJRqyozDQRREMOBTGL0aVwLlcXyXEZZFyI/LMA0Cstt86rO0xVPAW9ugNepDw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.9.0", + "prop-types": "^15.6.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/core": "^3.11.0", + "@uppy/dashboard": "^3.8.2", + "@uppy/drag-drop": "^3.1.0", + "@uppy/file-input": "^3.1.2", + "@uppy/progress-bar": "^3.1.1", + "@uppy/status-bar": "^3.3.2", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@uppy/dashboard": { + "optional": true + }, + "@uppy/drag-drop": { + "optional": true + }, + "@uppy/file-input": { + "optional": true + }, + "@uppy/progress-bar": { + "optional": true + }, + "@uppy/status-bar": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "node_modules/@factly/scooter-image/node_modules/@uppy/status-bar": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.3.3.tgz", + "integrity": "sha512-TCcnBjTDbq/AmnGOcWbCpQNsv05Z6Y36zdmTCt/xNe2/gTVAYAzGRoGOrkeb6jf/E4AAi25VyOolSqL2ibB8Kw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/utils": "^5.9.0", + "classnames": "^2.2.6", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.11.2" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@factly/scooter-image/node_modules/@uppy/store-default": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.2.2.tgz", + "integrity": "sha512-OiSgT++Jj4nLK0N9WTeod3UNjCH81OXE5BcMJCd9oWzl2d0xPNq2T/E9Y6O72XVd+6Y7+tf5vZlPElutfMB3KQ==", + "license": "MIT" }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "node_modules/@factly/scooter-image/node_modules/@uppy/thumbnail-generator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.1.0.tgz", + "integrity": "sha512-tDKK/cukC0CrM0F/OlHFmvpGGUq+Db4YfakhIGPKtT7ZO8aWOiIu5JIvaYUnKRxGq3RGsk4zhkxYXuoxVzzsGA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/utils": "^5.7.5", + "exifr": "^7.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.10.0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "node_modules/@factly/scooter-image/node_modules/@uppy/url": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@uppy/url/-/url-3.6.1.tgz", + "integrity": "sha512-EqnhNSHv7HYY8T9pQ3Cc7/SlSs1eD9rIoNd0GH7axPrJiR1KNwinN3EKnipIlUQgKvjpmrqAdPpHzkAyUVQqDw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@uppy/companion-client": "^3.8.1", + "@uppy/utils": "^5.9.0", + "nanoid": "^4.0.0", + "preact": "^10.5.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@uppy/core": "^3.11.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "node_modules/@factly/scooter-image/node_modules/@uppy/utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.9.0.tgz", + "integrity": "sha512-9Ubddd3orCOLYjf0KobwgJ+aTrABSxk9t4X/QdM4qJHVZuMIftkaMplrViRUO+kvIBCXEZDIP2AmS060siDNGw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "lodash": "^4.17.21", + "preact": "^10.5.13" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "node_modules/@factly/scooter-image/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "node_modules/@factly/scooter-image/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^14 || ^16 || >=18" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "node_modules/@factly/scooter-image/node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, + "node_modules/@factly/scooter-image/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", - "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "node_modules/@factly/scooter-shared-utils": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-shared-utils/-/scooter-shared-utils-0.0.48.tgz", + "integrity": "sha512-4H6qL6weChGth2f1De93PkROZtLS6gwcnhjmpDc+IAmWjc6WRbT5wRlxJZbc6KVcWe33U1d2s1uduksv28O/kQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@tiptap/core": "2.3.1", + "@tiptap/pm": "2.3.1", + "highlight.js": "11.9.0", + "ramda": "0.28.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "node_modules/@factly/scooter-shared-utils/node_modules/@remirror/core-constants": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", + "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==", + "license": "MIT" + }, + "node_modules/@factly/scooter-shared-utils/node_modules/@tiptap/pm": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz", + "integrity": "sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ==", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.3.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.5", + "prosemirror-trailing-node": "^2.0.7", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "node_modules/@factly/scooter-shared-utils/node_modules/prosemirror-trailing-node": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz", + "integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@remirror/core-constants": "^2.0.2", + "escape-string-regexp": "^4.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "node_modules/@factly/scooter-slash-commands": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-slash-commands/-/scooter-slash-commands-0.0.48.tgz", + "integrity": "sha512-QbVq1ZQ/lwKdpgJQy2qvaGyH6k29NO49n/kGYKX/AwAeNcxMYeHMqYQX+y0DeqKYy+D2qmoYgte9P6z2qHyJKQ==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-shared-utils": "0.0.48", + "@tippyjs/react": "4.2.6", + "@tiptap/core": "2.3.1", + "@tiptap/pm": "2.3.1", + "@tiptap/react": "2.0.4", + "@tiptap/suggestion": "2.3.1", + "classnames": "2.5.1", + "react-icons": "4.12.0", + "tippy.js": "6.3.7" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "node_modules/@factly/scooter-slash-commands/node_modules/@remirror/core-constants": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", + "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==", + "license": "MIT" + }, + "node_modules/@factly/scooter-slash-commands/node_modules/@tiptap/pm": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz", + "integrity": "sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.3.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.5", + "prosemirror-trailing-node": "^2.0.7", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "node_modules/@factly/scooter-slash-commands/node_modules/prosemirror-trailing-node": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz", + "integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" + "@remirror/core-constants": "^2.0.2", + "escape-string-regexp": "^4.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "node_modules/@factly/scooter-table": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-table/-/scooter-table-0.0.48.tgz", + "integrity": "sha512-cNLJfxfW42u8v6dMJW9+CPPcgWvbtKx0Psb/xav2GjsOUCcSB+stYRfT6TTLumMoK7cdOE50kUiHzJfDlFR/xA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-table-cell": "0.0.41", + "@factly/scooter-table-head-cell": "0.0.41", + "@factly/scooter-table-row": "0.0.41" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@factly/scooter-shared-utils": "0.0.48", + "@tiptap/core": "2.3.1", + "@tiptap/pm": "2.3.1", + "markdown-it": "14.1.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, + "node_modules/@factly/scooter-table-cell": { + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/@factly/scooter-table-cell/-/scooter-table-cell-0.0.41.tgz", + "integrity": "sha512-1zGrY4T4YX4yHPgwa2Td95x59NHEelWK6UjxqgKLTraMn36SA6/R7YS8vvXj63BsoOGqsh/lOE13KI4yEIha7g==", "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@factly/scooter-shared-utils": "0.0.41", + "@tiptap/core": "2.0.1", + "@tiptap/pm": "2.0.1" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, + "node_modules/@factly/scooter-table-head-cell": { + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/@factly/scooter-table-head-cell/-/scooter-table-head-cell-0.0.41.tgz", + "integrity": "sha512-EVSwza05ND2sJ3NrWxpYQRFvGCRbP6WNECtkA3pVqt5dNb5ii6d4TBdhDezVVeGKqGmAsvRBNmDLpYjL+juXaw==", "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@factly/scooter-shared-utils": "0.0.41", + "@tiptap/core": "2.0.1", + "@tiptap/pm": "2.0.1" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, + "node_modules/@factly/scooter-table-row": { + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/@factly/scooter-table-row/-/scooter-table-row-0.0.41.tgz", + "integrity": "sha512-ce3FsXKDb3FTCyj27wWghBRauwYJOE8aZgUdCZRoqFdqT9T33MwsMX6HH7K8WzJqTHuwqNLnLjDNBu3O6vL/lg==", "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@tiptap/core": "2.0.1" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "node_modules/@factly/scooter-ui": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@factly/scooter-ui/-/scooter-ui-0.0.48.tgz", + "integrity": "sha512-b1Yv6hXXxkuidnz+iXbZb07ayx9UYj3Hv0EIPto2Uy4hmQCRUrM3MWOVzBdIeTGOd0gEAJvuGWThLma5B0QvxQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@factly/scooter-shared-utils": "0.0.48", + "@tippyjs/react": "4.2.6", + "classnames": "2.5.1", + "prop-types": "15.8.1", + "ramda": "0.28.0", + "react-dom": "18.2.0", + "react-hotkeys-hook": "4.5.0", + "react-icons": "4.12.0", + "react-popper": "2.3.0", + "react-router-dom": "6.10.0", + "tippy.js": "6.3.7" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.0.0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "node_modules/@factly/scooter-ui/node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18.2.0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "node_modules/@factly/scooter-ui/node_modules/react-router": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", + "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@remix-run/router": "1.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "node_modules/@factly/scooter-ui/node_modules/react-router-dom": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", + "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@remix-run/router": "1.5.0", + "react-router": "6.10.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "node_modules/@factly/scooter-ui/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "loose-envify": "^1.1.0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" }, - "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "node_modules/@hookform/resolvers": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-4.1.2.tgz", + "integrity": "sha512-wl6H9c9wLOZMJAqGLEVKzbCkxJuV+BYuLFZFCQtCwMe0b3qQk4kUBd/ZAj13SwcSqcx86rCgSCyngQfmA6DOWg==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react-hook-form": "^7.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "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": ">=18.18.0" } }, - "node_modules/@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" - }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" + "node": ">=18.18" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", - "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "node": ">=12.22" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "node": ">=18.18" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@codexteam/icons": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.3.3.tgz", - "integrity": "sha512-cp7mkZPgmBuSxigTm3Vb+DtVHYeX7qXfQd7o05vcLD8Ag5WvRlol2QSn5P10k0CDAJwmkH9nQGQLBycErS9lsQ==" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" + "node_modules/@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "license": "MIT", + "peerDependencies": { + "react": "*" } }, - "node_modules/@commitlint/cli": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-9.1.2.tgz", - "integrity": "sha512-ctRrrPqjZ8r4Vc4FXpPaScEpkPwfvB0Us3NK2SD2AnLwXGMxOLFTabDmNySU1Xc40ud2CmJsaV8lpavvzs8ZZA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.9.6", - "@commitlint/format": "^9.1.2", - "@commitlint/lint": "^9.1.2", - "@commitlint/load": "^9.1.2", - "@commitlint/read": "^9.1.2", - "chalk": "4.1.0", - "core-js": "^3.6.1", - "get-stdin": "7.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^15.1.0" - }, - "bin": { - "commitlint": "cli.js" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=v8.17.0" + "node": ">=6.0.0" } }, - "node_modules/@commitlint/config-conventional": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-9.1.2.tgz", - "integrity": "sha512-2zfnsrBJuCNJEKMEmltYlCUEoQNE4anvEBI/SYEuiB1JYXYaELijobDBpqhUVjh5NEpprNTY16oMZat6ewnxOg==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "conventional-changelog-conventionalcommits": "4.3.0" - }, + "license": "MIT", "engines": { - "node": ">=v8.17.0" + "node": ">=6.0.0" } }, - "node_modules/@commitlint/ensure": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-9.1.2.tgz", - "integrity": "sha512-hwQICwpNSTsZgj/1/SdPvYAzhwjwgCJI4vLbT879+Jc+AJ6sj2bUDGw/F89vzgKz1VnaMm4D65bNhoWhG3pdhQ==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "dependencies": { - "@commitlint/types": "^9.1.2", - "lodash": "^4.17.19" - }, + "license": "MIT", "engines": { - "node": ">=v8.17.0" + "node": ">=6.0.0" } }, - "node_modules/@commitlint/execute-rule": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-9.1.2.tgz", - "integrity": "sha512-NGbeo0KCVYo1yj9vVPFHv6RGFpIF6wcQxpFYUKGIzZVV9Vz1WyiKS689JXa99Dt1aN0cZlEJJLnTNDIgYls0Vg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, - "engines": { - "node": ">=v8.17.0" - } + "license": "MIT" }, - "node_modules/@commitlint/format": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-9.1.2.tgz", - "integrity": "sha512-+ZWTOSGEU6dbn3NRh1q7sY5K5QLiSs7E2uSzuYnWHXcQk8nlTvnE0ibwMCQxdKLaOTZiN57fHM/7M9Re2gsRuw==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^9.1.2", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=v8.17.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@commitlint/is-ignored": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-9.1.2.tgz", - "integrity": "sha512-423W/+Ro+Cc8cg81+t9gds1EscMZNjnGT31nKDvxVxJxXiXQsYYoFEQbU+nfUrRGQsUikEgEJ3ppVGr1linvcQ==", - "dev": true, + "node_modules/@monaco-editor/loader": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", + "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", + "license": "MIT", "dependencies": { - "@commitlint/types": "^9.1.2", - "semver": "7.3.2" - }, - "engines": { - "node": ">=v8.17.0" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "state-local": "^1.0.6" } }, - "node_modules/@commitlint/lint": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-9.1.2.tgz", - "integrity": "sha512-XvggqHZ4XSTKOgzJhCzz52cWRRO57QQnEviwGj0qnD4jdwC+8h2u9LNZwoa2tGAuaNM3nSm//wNK7FRZhgiiFA==", - "dev": true, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^9.1.2", - "@commitlint/parse": "^9.1.2", - "@commitlint/rules": "^9.1.2", - "@commitlint/types": "^9.1.2" + "@monaco-editor/loader": "^1.5.0" }, - "engines": { - "node": ">=v8.17.0" + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@commitlint/load": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-9.1.2.tgz", - "integrity": "sha512-FPL82xBuF7J3EJ57kLVoligQP4BFRwrknooP+vNT787AXmQ/Fddc/iYYwHwy67pNkk5N++/51UyDl/CqiHb6nA==", - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { - "@commitlint/execute-rule": "^9.1.2", - "@commitlint/resolve-extends": "^9.1.2", - "@commitlint/types": "^9.1.2", - "chalk": "4.1.0", - "cosmiconfig": "^6.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=v8.17.0" + "node": ">= 8" } }, - "node_modules/@commitlint/message": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-9.1.2.tgz", - "integrity": "sha512-ndlx5z7bPVLG347oYJUHuQ41eTcsw+aUYT1ZwQyci0Duy2atpuoeeSw9SuM1PjufzRCpb6ExzFEgGzcCRKAJsg==", - "dev": true, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { - "node": ">=v8.17.0" + "node": ">= 8" } }, - "node_modules/@commitlint/parse": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-9.1.2.tgz", - "integrity": "sha512-d+/VYbkotctW+lzDpus/R6xTerOqFQkW1myH+3PwnqYSE6JU/uHT4MlZNGJBv8pX9SPlR66t6X9puFobqtezEw==", - "dev": true, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-parser": "^3.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=v8.17.0" + "node": ">= 8" } }, - "node_modules/@commitlint/read": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-9.1.2.tgz", - "integrity": "sha512-C2sNBQOqeQXMxpWtRnXYKYB3D9yuybPtQNY/P67A6o8XH/UMHkFaUTyIx1KRgu0IG0yTTItRt46FGnsMWLotvA==", - "dev": true, - "dependencies": { - "@commitlint/top-level": "^9.1.2", - "fs-extra": "^8.1.0", - "git-raw-commits": "^2.0.0" - }, - "engines": { - "node": ">=v8.17.0" + "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" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-9.1.2.tgz", - "integrity": "sha512-HcoL+qFGmWEu9VM4fY0HI+VzF4yHcg3x+9Hx6pYFZ+r2wLbnKs964y0v68oyMO/mS/46MVoLNXZGR8U3adpadg==", - "dev": true, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.3.tgz", + "integrity": "sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==", + "license": "MIT", "dependencies": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collapsible": "1.1.3", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0" }, - "engines": { - "node": ">=v8.17.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@commitlint/rules": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-9.1.2.tgz", - "integrity": "sha512-1vecFuzqVqjiT57ocXq1bL8V6GEF1NZs3BR0dQzObaqHftImIxBVII299gasckTkcuxNc8M+7XxZyKxUthukpQ==", - "dev": true, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.6.tgz", + "integrity": "sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ==", + "license": "MIT", "dependencies": { - "@commitlint/ensure": "^9.1.2", - "@commitlint/message": "^9.1.2", - "@commitlint/to-lines": "^9.1.2", - "@commitlint/types": "^9.1.2" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dialog": "1.1.6", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2" }, - "engines": { - "node": ">=v8.17.0" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-9.1.2.tgz", - "integrity": "sha512-o4zWcMf9EnzA3MOqx01780SgrKq5hqDJmUBPk30g6an0XcDuDy3OSZHHTJFdzsg4V9FjC4OY44sFeK7GN7NaxQ==", - "dev": true, - "engines": { - "node": ">=v8.17.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@commitlint/top-level": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-9.1.2.tgz", - "integrity": "sha512-KMPP5xVePcz3B1dKqcZdU4FZBVOkT+bG3ip4RQX2TeCJoomMkTjd0utALs7rpTGLID6BXbwwXepZCZJREjR/Bw==", - "dev": true, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz", + "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==", + "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "@radix-ui/react-primitive": "2.0.2" }, - "engines": { - "node": ">=v8.17.0" - } - }, - "node_modules/@commitlint/types": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-9.1.2.tgz", - "integrity": "sha512-r3fwVbVH+M8W0qYlBBZFsUwKe6NT5qvz+EmU7sr8VeN1cQ63z+3cfXyTo7WGGEMEgKiT0jboNAK3b1FZp8k9LQ==", - "dev": true, - "engines": { - "node": ">=v8.17.0" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/normalize.css": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", - "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==" - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.3.tgz", + "integrity": "sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.4.tgz", + "integrity": "sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.3.tgz", + "integrity": "sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "node_modules/@radix-ui/react-collection": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz", + "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2" }, - "engines": { - "node": "^12 || ^14 || >=16" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz", + "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz", + "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz", + "integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.6", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "license": "MIT", "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz", + "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "node_modules/@radix-ui/react-label": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz", + "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { - "postcss": "^8.3" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "node_modules/@radix-ui/react-menu": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz", + "integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "node_modules/@radix-ui/react-popover": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.6.tgz", + "integrity": "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "node_modules/@radix-ui/react-popper": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz", + "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" }, - "engines": { - "node": "^14 || >=16" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node_modules/@radix-ui/react-portal": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz", + "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/code": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@editorjs/code/-/code-2.9.3.tgz", - "integrity": "sha512-nXUrK3CjhpubvShYtcbkpZ9SU15IYwmJOsWZrlWYSzy9unZBRQthii6eABndsCtODzzV0yiSKmTp00RQkFow3Q==", - "dev": true, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.3.2" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/delimiter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@editorjs/delimiter/-/delimiter-1.4.2.tgz", - "integrity": "sha512-S8q2LpeYdYkVShLp7K8c4HLthDHBevLw+sT+iO0+SH0oMvFmld9SUon3DFzMQ2gG07EOdZGRZ958+sVxyvFjZw==", - "dev": true, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.3.2" + "@radix-ui/react-slot": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/dom": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@editorjs/dom/-/dom-0.0.5.tgz", - "integrity": "sha512-SZ78Gwpkp3EUhjBIp0lSojeQ35V9acF8SubJsMeOH/vlOUE40GOnvvwWZnF05lO7bIB0dOHhhJy4N7IIAWxP2w==", + "node_modules/@radix-ui/react-radio-group": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.3.tgz", + "integrity": "sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA==", + "license": "MIT", "dependencies": { - "@editorjs/helpers": "^0.0.4" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/editorjs": { - "version": "2.30.7", - "resolved": "https://registry.npmjs.org/@editorjs/editorjs/-/editorjs-2.30.7.tgz", - "integrity": "sha512-FfdeUqrgcKWC+Cy2GW6Dxup6s2TaRKokR4FL+HKXshu6h9Y//rrx4SQkURgkZOCSbV77t9btbmAXdFXWGB+diw==" - }, - "node_modules/@editorjs/header": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@editorjs/header/-/header-2.8.8.tgz", - "integrity": "sha512-bsMSs34u2hoi0UBuRoc5EGWXIFzJiwYgkFUYQGVm63y5FU+s8zPBmVx5Ip2sw1xgs0fqfDROqmteMvvmbCy62w==", + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz", + "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.0.5", - "@editorjs/editorjs": "^2.29.1" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/header/node_modules/@codexteam/icons": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.0.5.tgz", - "integrity": "sha512-s6H2KXhLz2rgbMZSkRm8dsMJvyUNZsEjxobBEg9ztdrb1B2H3pEzY6iTwI4XUPJWJ3c3qRKwV4TrO3J5jUdoQA==" - }, - "node_modules/@editorjs/helpers": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@editorjs/helpers/-/helpers-0.0.4.tgz", - "integrity": "sha512-ieg3dzo2m1/ELze/RMNADiAiC5amXxIlVXoJ5vvXITOu/p/dPsrF+Oi3h5gBYvtGk9vg5LJUSG5YWU0tBUO1tw==" - }, - "node_modules/@editorjs/inline-code": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@editorjs/inline-code/-/inline-code-1.5.1.tgz", - "integrity": "sha512-XvKpqw9y1bOYgyuVUHGDuu7KlNWCYIXD5uU1Lpc4s4LJ8VN4TjWFGKJ3sS+LR7zzasWe8hu2ffR1JC6MHIS0EQ==", - "dev": true, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.3.tgz", + "integrity": "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.3.2" + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/list": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@editorjs/list/-/list-1.10.0.tgz", - "integrity": "sha512-zXCHaNcIscpefnteBOS3x+98f/qBgEVsv+OvtKoTDZipMNqck2uVG+X2qMQr8xcwtJrj9ySX54lUac9FDlAHnA==", + "node_modules/@radix-ui/react-select": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz", + "integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.0.4" + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/list/node_modules/@codexteam/icons": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.0.4.tgz", - "integrity": "sha512-V8N/TY2TGyas4wLrPIFq7bcow68b3gu8DfDt1+rrHPtXxcexadKauRJL6eQgfG7Z0LCrN4boLRawR4S9gjIh/Q==" - }, - "node_modules/@editorjs/marker": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@editorjs/marker/-/marker-1.4.0.tgz", - "integrity": "sha512-5ipEXfL44jTTRzgNp/p/YjMO7jT08S5z4V8qA3FFJTfdhKgQyM3mvP1zpdYKw47ZZpVWMCncvk5Nto3BxihEtg==", - "dev": true, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz", + "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.0.5" + "@radix-ui/react-primitive": "2.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/marker/node_modules/@codexteam/icons": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.0.5.tgz", - "integrity": "sha512-s6H2KXhLz2rgbMZSkRm8dsMJvyUNZsEjxobBEg9ztdrb1B2H3pEzY6iTwI4XUPJWJ3c3qRKwV4TrO3J5jUdoQA==", - "dev": true - }, - "node_modules/@editorjs/paragraph": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@editorjs/paragraph/-/paragraph-2.11.7.tgz", - "integrity": "sha512-qD6bbWvRc4VvP0mXDOm+hOhzzhUYR9ZjcAvgCuKWcCbUMpCvhVF1s8NX40zdjekPi6JEnuHTamCncTrSzVsVhw==", + "node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.0.4" + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@editorjs/paragraph/node_modules/@codexteam/icons": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.0.4.tgz", - "integrity": "sha512-V8N/TY2TGyas4wLrPIFq7bcow68b3gu8DfDt1+rrHPtXxcexadKauRJL6eQgfG7Z0LCrN4boLRawR4S9gjIh/Q==" - }, - "node_modules/@editorjs/quote": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/@editorjs/quote/-/quote-2.7.6.tgz", - "integrity": "sha512-D01KUMSDj2r+6Z+xjDkQqI+y6URpeHCvj0+P4pah+GtkG040lWjFb2H4pgHFXuol2cbfyAoraYSw85fuPheCvw==", + "node_modules/@radix-ui/react-switch": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.3.tgz", + "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.3.2", - "@editorjs/dom": "^0.0.5" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/raw": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@editorjs/raw/-/raw-2.5.1.tgz", - "integrity": "sha512-h7CjXtfSTe4Bj1CL84ch5NW0q0CdrlWsLzQ/kbaFTgx914CzKz4Ug+xgdvytVO1dd1QzB5/HCW0ic1VxtgkhMQ==", + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz", + "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==", + "license": "MIT", "dependencies": { - "@codexteam/icons": "^0.0.4" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@editorjs/raw/node_modules/@codexteam/icons": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@codexteam/icons/-/icons-0.0.4.tgz", - "integrity": "sha512-V8N/TY2TGyas4wLrPIFq7bcow68b3gu8DfDt1+rrHPtXxcexadKauRJL6eQgfG7Z0LCrN4boLRawR4S9gjIh/Q==" - }, - "node_modules/@editorjs/table": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@editorjs/table/-/table-1.3.0.tgz", - "integrity": "sha512-3/gr7IkjsYuECndCpcBSKzZQHos7C9QU1ach8avyVbXB3VLAa1RyGjgocu0Ct4d02HdxirrYZ7+vP1Na+s04GQ==" - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz", + "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==", + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "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" + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "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" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@factly/scooter-bubble-menu": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-bubble-menu/-/scooter-bubble-menu-0.0.45.tgz", - "integrity": "sha512-40th0D6444q58rgBSLtbhlWbvpnPC/Vo68H0L67iGcucEr8oIHYJ+/j3MU+UY5DT0ozXiai0/jysWmMZ3A+Umg==", - "dependencies": { - "@factly/scooter-image": "0.0.45", - "@factly/scooter-shared-utils": "0.0.45", - "@factly/scooter-ui": "0.0.45", - "@tiptap/pm": "2.3.1", - "@tiptap/react": "2.0.4", - "classnames": "2.5.1", - "react-icons": "^4.7.1", - "tippy.js": "6.3.7" - }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@factly/scooter-bubble-menu/node_modules/@remirror/core-constants": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", - "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==" - }, - "node_modules/@factly/scooter-bubble-menu/node_modules/@tiptap/pm": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz", - "integrity": "sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ==", - "dependencies": { - "prosemirror-changeset": "^2.2.1", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.5.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.3.2", - "prosemirror-inputrules": "^1.3.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.12.0", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.19.4", - "prosemirror-schema-basic": "^1.2.2", - "prosemirror-schema-list": "^1.3.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.3.5", - "prosemirror-trailing-node": "^2.0.7", - "prosemirror-transform": "^1.8.0", - "prosemirror-view": "^1.32.7" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@factly/scooter-bubble-menu/node_modules/prosemirror-trailing-node": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz", - "integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==", + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", "dependencies": { - "@remirror/core-constants": "^2.0.2", - "escape-string-regexp": "^4.0.0" + "@radix-ui/rect": "1.1.0" }, "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, - "node_modules/@factly/scooter-claim": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-claim/-/scooter-claim-0.0.45.tgz", - "integrity": "sha512-qcTpGUL9Sh/1iFcQd/5i9wjJPigoZeuo6BoUS6rqV0jvbAhn2jY6evDoWinYEgmXN/ZaL6tmWlkf0mqDZJrk1A==", - "dependencies": { - "@factly/scooter-ui": "0.0.45", - "@tiptap/core": "2.3.1", - "@tiptap/react": "2.0.4", - "react-icons": "^4.7.1", - "react-paginate": "8.2.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "peerDependencies": { - "react": "^18.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@factly/scooter-code-block": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-code-block/-/scooter-code-block-0.0.45.tgz", - "integrity": "sha512-Mvayd2cfcHQKH/x/wg2rls1T48HVctUCw9hpBpr1HHRZ+z57Lrf0dE0tvTzKLejFHGvqWxQxUAu/nU21yxa53Q==", + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", "dependencies": { - "@tiptap/extension-code-block-lowlight": "2.3.1", - "@tiptap/react": "2.0.4", - "lowlight": "2.9.0", - "react-icons": "4.12.0" + "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@factly/scooter-core": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-core/-/scooter-core-0.0.45.tgz", - "integrity": "sha512-rNmKBQh/Lt+/Ea9O2yUF1ow+I2fJgsb1NxVpbTr0x6NlYTKgxfGG+jyRMHVO3YzOn7WofgR9xI0/HLuImoCh9g==", - "dependencies": { - "@factly/scooter-bubble-menu": "0.0.45", - "@factly/scooter-fixed-menu": "0.0.45", - "@factly/scooter-shared-utils": "0.0.45", - "@factly/scooter-slash-commands": "0.0.45", - "@factly/scooter-ui": "0.0.45", - "@storybook/addons": "6.5.16", - "@storybook/theming": "6.5.16", - "@tiptap/core": "2.3.1", - "@tiptap/extension-character-count": "2.3.1", - "@tiptap/extension-color": "2.3.1", - "@tiptap/extension-document": "2.3.1", - "@tiptap/extension-heading": "2.3.1", - "@tiptap/extension-highlight": "2.3.1", - "@tiptap/extension-link": "2.3.1", - "@tiptap/extension-subscript": "2.3.1", - "@tiptap/extension-superscript": "2.3.1", - "@tiptap/extension-text-align": "2.3.1", - "@tiptap/extension-text-style": "2.3.1", - "@tiptap/extension-typography": "2.3.1", - "@tiptap/extension-underline": "2.3.1", - "@tiptap/pm": "^2.0.0-beta.218", - "@tiptap/react": "2.0.4", - "@tiptap/starter-kit": "2.3.1", - "classnames": "2.5.1", - "dangerously-set-html-content": "1.1.0", - "dompurify": "3.1.2", - "lodash.isplainobject": "4.0.6", - "react-icons": "4.12.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "peerDependencies": { - "react": "^18.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@factly/scooter-embed": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-embed/-/scooter-embed-0.0.45.tgz", - "integrity": "sha512-TLV7koik7SEOWzejRiUrRGrRFT8p0JMjiVtc1PcQcEGbCFha0Z39n4YTsm4l9zRskj1SPB7727nJKT0kjrEucA==", + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz", + "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==", + "license": "MIT", "dependencies": { - "@factly/scooter-shared-utils": "0.0.45", - "@factly/scooter-ui": "0.0.45", - "@tiptap/core": "2.3.1", - "@tiptap/react": "2.0.4", - "axios": "1.6.8", - "dangerously-set-html-content": "1.1.0" + "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { - "react": "^18.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@factly/scooter-embed/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" }, - "node_modules/@factly/scooter-embed/node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "node_modules/@redux-devtools/extension": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz", + "integrity": "sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==", + "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@factly/scooter-fixed-menu": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-fixed-menu/-/scooter-fixed-menu-0.0.45.tgz", - "integrity": "sha512-ss7M9IkL/hcF90lEPKLGfEoAKakBpYcZPO0y8YOR1O4R0jkjauBH5kH5n/8mzmvMXXYGQqijLtnjjE799NlqzQ==", - "dependencies": { - "@factly/scooter-bubble-menu": "0.0.45", - "@factly/scooter-image": "0.0.45", - "@factly/scooter-shared-utils": "0.0.45", - "@factly/scooter-ui": "0.0.45", - "classnames": "2.5.1", - "react-icons": "4.12.0" + "@babel/runtime": "^7.23.2", + "immutable": "^4.3.4" }, "peerDependencies": { - "react": "^18.0.0" + "redux": "^3.1.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@factly/scooter-image": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-image/-/scooter-image-0.0.45.tgz", - "integrity": "sha512-JBwZSILZhHt+Xmf7Zaqaf0obsmN7CQSWjZ4ZRPW5q1yhP8T1z61yNTnNIhOkssQD3aCrpxiatc3tQ/J9UJTplA==", + "node_modules/@reduxjs/toolkit": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.6.0.tgz", + "integrity": "sha512-mWJCYpewLRyTuuzRSEC/IwIBBkYg2dKtQas8mty5MaV2iXzcmicS3gW554FDeOvLnY3x13NIk8MB1e8wHO7rqQ==", + "license": "MIT", "dependencies": { - "@factly/scooter-shared-utils": "0.0.45", - "@factly/scooter-ui": "0.0.45", - "@tiptap/core": "2.3.1", - "@tiptap/extension-image": "2.3.1", - "@uppy/aws-s3": "3.6.2", - "@uppy/core": "3.11.0", - "@uppy/dashboard": "^3.3.1", - "@uppy/drag-drop": "^3.0.1", - "@uppy/file-input": "^3.0.1", - "@uppy/progress-bar": "^3.0.1", - "@uppy/react": "3.3.1", - "@uppy/status-bar": "^3.0.1", - "@uppy/url": "3.6.1", - "axios": "1.6.8", - "classnames": "2.5.1", - "react-icons": "4.12.0", - "react-masonry-infinite": "1.2.2", - "react-paginate": "8.2.0" + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } } }, - "node_modules/@factly/scooter-image/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "license": "MIT" }, - "node_modules/@factly/scooter-image/node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, + "node_modules/@remix-run/router": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", + "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=14" } }, - "node_modules/@factly/scooter-shared-utils": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-shared-utils/-/scooter-shared-utils-0.0.45.tgz", - "integrity": "sha512-rnB4+GlpEi92OqV36gj5wSRd6eaVJC6CJALwN8Tr13pJakw/rLEvFULMiE9rADpWfj7Vtr4G/hpFFSCmXEClRg==", + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@tiptap/core": "2.3.1", - "@tiptap/pm": "2.3.1", - "highlight.js": "11.9.0", - "ramda": "0.28.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": "^18.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@factly/scooter-shared-utils/node_modules/@remirror/core-constants": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", - "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==" + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/@factly/scooter-shared-utils/node_modules/@tiptap/pm": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz", - "integrity": "sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ==", - "dependencies": { - "prosemirror-changeset": "^2.2.1", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.5.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.3.2", - "prosemirror-inputrules": "^1.3.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.12.0", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.19.4", - "prosemirror-schema-basic": "^1.2.2", - "prosemirror-schema-list": "^1.3.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.3.5", - "prosemirror-trailing-node": "^2.0.7", - "prosemirror-transform": "^1.8.0", - "prosemirror-view": "^1.32.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@factly/scooter-shared-utils/node_modules/prosemirror-trailing-node": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz", - "integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==", - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, - "node_modules/@factly/scooter-slash-commands": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-slash-commands/-/scooter-slash-commands-0.0.45.tgz", - "integrity": "sha512-X8gfYL7YOWQwJQQKN8yP38V4BTryqzmb7a8SKOHNPTiY7xhQyq8L2nZk9IixzBSck6yWMGJAge2EMuNcwT3/ew==", - "dependencies": { - "@factly/scooter-shared-utils": "0.0.45", - "@tippyjs/react": "4.2.6", - "@tiptap/core": "2.3.1", - "@tiptap/pm": "2.3.1", - "@tiptap/react": "2.0.4", - "@tiptap/suggestion": "2.3.1", - "classnames": "2.5.1", - "react-icons": "4.12.0", - "tippy.js": "6.3.7" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@factly/scooter-slash-commands/node_modules/@remirror/core-constants": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", - "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==" - }, - "node_modules/@factly/scooter-slash-commands/node_modules/@tiptap/pm": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz", - "integrity": "sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ==", - "dependencies": { - "prosemirror-changeset": "^2.2.1", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.5.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.3.2", - "prosemirror-inputrules": "^1.3.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.12.0", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.19.4", - "prosemirror-schema-basic": "^1.2.2", - "prosemirror-schema-list": "^1.3.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.3.5", - "prosemirror-trailing-node": "^2.0.7", - "prosemirror-transform": "^1.8.0", - "prosemirror-view": "^1.32.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@factly/scooter-slash-commands/node_modules/prosemirror-trailing-node": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.9.tgz", - "integrity": "sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==", - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, - "node_modules/@factly/scooter-table": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-table/-/scooter-table-0.0.45.tgz", - "integrity": "sha512-SIConp9aaqCkD2mpfEa4zu+OqpfjGw6UZDtGJcnz2MLF1Oa8ZT90CqEmU7vC8mWsCe+I+lsfuYWQoiJE8HHCHQ==", - "dependencies": { - "@factly/scooter-table-cell": "0.0.41", - "@factly/scooter-table-head-cell": "0.0.41", - "@factly/scooter-table-row": "0.0.41" - }, - "peerDependencies": { - "@factly/scooter-shared-utils": "0.0.45", - "@tiptap/core": "2.3.1", - "@tiptap/pm": "2.3.1", - "markdown-it": "14.1.0" - } - }, - "node_modules/@factly/scooter-table-cell": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@factly/scooter-table-cell/-/scooter-table-cell-0.0.41.tgz", - "integrity": "sha512-1zGrY4T4YX4yHPgwa2Td95x59NHEelWK6UjxqgKLTraMn36SA6/R7YS8vvXj63BsoOGqsh/lOE13KI4yEIha7g==", - "peerDependencies": { - "@factly/scooter-shared-utils": "0.0.41", - "@tiptap/core": "2.0.1", - "@tiptap/pm": "2.0.1" - } - }, - "node_modules/@factly/scooter-table-head-cell": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@factly/scooter-table-head-cell/-/scooter-table-head-cell-0.0.41.tgz", - "integrity": "sha512-EVSwza05ND2sJ3NrWxpYQRFvGCRbP6WNECtkA3pVqt5dNb5ii6d4TBdhDezVVeGKqGmAsvRBNmDLpYjL+juXaw==", - "peerDependencies": { - "@factly/scooter-shared-utils": "0.0.41", - "@tiptap/core": "2.0.1", - "@tiptap/pm": "2.0.1" - } - }, - "node_modules/@factly/scooter-table-row": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@factly/scooter-table-row/-/scooter-table-row-0.0.41.tgz", - "integrity": "sha512-ce3FsXKDb3FTCyj27wWghBRauwYJOE8aZgUdCZRoqFdqT9T33MwsMX6HH7K8WzJqTHuwqNLnLjDNBu3O6vL/lg==", - "peerDependencies": { - "@tiptap/core": "2.0.1" - } - }, - "node_modules/@factly/scooter-ui": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@factly/scooter-ui/-/scooter-ui-0.0.45.tgz", - "integrity": "sha512-ZlJBNyHXkeKkJSEmS/f+iFY2kEb1UYlJ7elAFYzus2rJty/rjJHK1V+rxlBRvbGpAlDfjRO9mkRXmk2Hnu9WPw==", - "dependencies": { - "@factly/scooter-shared-utils": "0.0.45", - "@tippyjs/react": "4.2.6", - "classnames": "2.5.1", - "prop-types": "15.8.1", - "ramda": "0.28.0", - "react-dom": "18.2.0", - "react-hotkeys-hook": "4.5.0", - "react-icons": "4.12.0", - "react-popper": "2.3.0", - "react-router-dom": "6.10.0", - "tippy.js": "6.3.7" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@factly/scooter-ui/node_modules/@remix-run/router": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", - "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@factly/scooter-ui/node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/@factly/scooter-ui/node_modules/react-router": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", - "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", - "dependencies": { - "@remix-run/router": "1.5.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@factly/scooter-ui/node_modules/react-router-dom": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", - "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", - "dependencies": { - "@remix-run/router": "1.5.0", - "react-router": "6.10.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" - }, - "node_modules/@icons/material": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", - "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "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/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/transform/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "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", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.4.6.tgz", - "integrity": "sha512-Gr3uz3LYf33wlFE3eRnta4RxP5FSNxiIV9ENn2D2/rN8KgGAD8ecvcITRtsbbyuOuNkwbuHYxfeaz2Vr+CtyFA==", - "dependencies": { - "@monaco-editor/loader": "^1.3.2", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", - "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", - "dev": true, - "dependencies": { - "playwright": "1.49.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", - "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", - "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/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "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==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rc-component/async-validator": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", - "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", - "dependencies": { - "@babel/runtime": "^7.24.4" - }, - "engines": { - "node": ">=14.x" - } - }, - "node_modules/@rc-component/color-picker": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", - "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", - "dependencies": { - "@ant-design/fast-color": "^2.0.6", - "@babel/runtime": "^7.23.6", - "classnames": "^2.2.6", - "rc-util": "^5.38.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/context": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", - "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "rc-util": "^5.27.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/mini-decimal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", - "dependencies": { - "@babel/runtime": "^7.18.0" - }, - "engines": { - "node": ">=8.x" - } - }, - "node_modules/@rc-component/mutate-observer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", - "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/portal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/qrcode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", - "dependencies": { - "@babel/runtime": "^7.24.7", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/tour": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", - "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/portal": "^1.0.0-9", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/trigger": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz", - "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@rc-component/portal": "^1.1.0", - "classnames": "^2.3.2", - "rc-motion": "^2.0.0", - "rc-resize-observer": "^1.3.1", - "rc-util": "^5.44.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@remirror/core-constants": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", - "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==" - }, - "node_modules/@remix-run/router": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", - "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==" - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", - "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.7", - "debug": "^4.0.0", - "import-from": "^3.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "semantic-release": ">=16.0.0 <18.0.0" - } - }, - "node_modules/@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true - }, - "node_modules/@semantic-release/github": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.3.tgz", - "integrity": "sha512-lWjIVDLal+EQBzy697ayUNN8MoBpp+jYIyW2luOdqn5XBH4d9bQGfTnjuLyzARZBHejqh932HVjiH/j4+R7VHw==", - "dev": true, - "dependencies": { - "@octokit/rest": "^18.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^2.4.3", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "semantic-release": ">=16.0.0 <18.0.0" - } - }, - "node_modules/@semantic-release/github/node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@semantic-release/github/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/github/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@semantic-release/github/node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/github/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@semantic-release/npm": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.1.3.tgz", - "integrity": "sha512-x52kQ/jR09WjuWdaTEHgQCvZYMOTx68WnS+TZ4fya5ZAJw4oRtJETtrvUw10FdfM28d/keInQdc66R1Gw5+OEQ==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^7.0.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^4.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=10.19" - }, - "peerDependencies": { - "semantic-release": ">=16.0.0 <18.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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/@semantic-release/npm/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/npm/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.3.tgz", - "integrity": "sha512-hMZyddr0u99OvM2SxVOIelHzly+PP3sYtJ8XOLHdMp8mrluN5/lpeTnIO27oeCYdupY/ndoGfvrqDjHqkSyhVg==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^4.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^3.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "semantic-release": ">=15.8.0 <18.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sheerun/mutationobserver-shim": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", - "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@storybook/addons": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.16.tgz", - "integrity": "sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==", - "dependencies": { - "@storybook/api": "6.5.16", - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/theming": "6.5.16", - "@types/webpack-env": "^1.16.0", - "core-js": "^3.8.2", - "global": "^4.4.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/addons/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/@storybook/api": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", - "integrity": "sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==", - "dependencies": { - "@storybook/channels": "6.5.16", - "@storybook/client-logger": "6.5.16", - "@storybook/core-events": "6.5.16", - "@storybook/csf": "0.0.2--canary.4566f4d.1", - "@storybook/router": "6.5.16", - "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.5.16", - "core-js": "^3.8.2", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "store2": "^2.12.0", - "telejson": "^6.0.8", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/api/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/@storybook/channels": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", - "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", - "dependencies": { - "core-js": "^3.8.2", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/client-logger": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", - "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", - "dependencies": { - "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-events": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", - "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", - "dependencies": { - "core-js": "^3.8.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/csf": { - "version": "0.0.2--canary.4566f4d.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", - "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@storybook/router": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", - "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/router/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/@storybook/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", - "dependencies": { - "core-js": "^3.6.5", - "find-up": "^4.1.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/theming": { - "version": "6.5.16", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", - "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", - "dependencies": { - "@storybook/client-logger": "6.5.16", - "core-js": "^3.8.2", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/theming/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@testing-library/dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz", - "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==", - "dependencies": { - "@babel/runtime": "^7.8.4", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.12.1", - "aria-query": "^4.0.2", - "dom-accessibility-api": "^0.3.0", - "pretty-format": "^25.1.0", - "wait-for-expect": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@testing-library/dom/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@testing-library/dom/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", - "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", - "dependencies": { - "@babel/runtime": "^7.5.1", - "chalk": "^2.4.1", - "css": "^2.2.3", - "css.escape": "^1.5.1", - "jest-diff": "^24.0.0", - "jest-matcher-utils": "^24.0.0", - "lodash": "^4.17.11", - "pretty-format": "^24.0.0", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@testing-library/jest-dom/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@testing-library/react": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz", - "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==", - "dependencies": { - "@babel/runtime": "^7.8.4", - "@testing-library/dom": "^6.15.0", - "@types/testing-library__react": "^9.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@testing-library/user-event": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", - "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==", - "peerDependencies": { - "@testing-library/dom": ">=5" - } - }, - "node_modules/@tippyjs/react": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", - "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", - "dependencies": { - "tippy.js": "^6.3.1" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@tiptap/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.3.1.tgz", - "integrity": "sha512-ycpQlmczAOc05TgB5sc3RUTEEBXAVmS8MR9PqQzg96qidaRfVkgE+2w4k7t83PMHl2duC0MGqOCy96pLYwSpeg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-blockquote": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.4.tgz", - "integrity": "sha512-4JSwAM3B92YWvGzu/Vd5rovPrCGwLSaSLD5rxcLyfxLSrTDQd3n7lp78pzVgGhunVECzaGF5A0ByWWpEyS0a3w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.4.tgz", - "integrity": "sha512-SdO4oFQKaERCGfwOc1CLYQRtThENam2KWfWmvpsymknokt5qYzU57ft0SE1HQV9vVYEzZ9HrWIgv2xrgu0g9kg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.4.tgz", - "integrity": "sha512-GVtZwJaQyLBptMsmDtYl5GEobd1Uu7C9sc9Z+PdXwMuxmFfg+j07bCKCj5JJj/tjgXCSLVxWdTlDHxNrgzQHjw==", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.4.tgz", - "integrity": "sha512-JVwDPgOBYRU2ivaadOh4IaQYXQEiSw6sB36KT/bwqJF2GnEvLiMwptdRMn9Uuh6xYR3imjIZtV6uZAoneZdd6g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-character-count": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.3.1.tgz", - "integrity": "sha512-9aYj1K7uejPm+U0kaviECC+p0bWhIo2ld2x9FFvw4RJF7UlULAz8kiS55WhHBpLiv6OdAIuQH8SwVDLNac5/yQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.4.tgz", - "integrity": "sha512-Vj/N0nbSQiV1o7X7pRySK9Fu72Dd266gm27TSlsts6IwJu5MklFvz7ezJUWoLjt2wmCV8/U/USmk/39ic9qjvg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.4.tgz", - "integrity": "sha512-qS4jnbJqghNMT2+B+GQ807ATgqkL9OQ//NlL+ZwVSe+DPDduNA9B6IB9SrWENDfOnzekpi7kcEcm+RenELARRQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-code-block-lowlight": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.3.1.tgz", - "integrity": "sha512-cITugRxTy2/HM2csvjpAnCYBp1Z+A+dXLpNic1QzcXvTTjxTw7V4dtOE7ymmiMHlsAOKQLeWkkgc6W0pPES6IA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/extension-code-block": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-color": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.3.1.tgz", - "integrity": "sha512-a127akyS3nMbcLKzZ02l/rHUP5BlCmbma6vYJNjRk6Srd1DlhXCIynMZJr7Bzgngq9KNLGQha2uxbPr7me3xAA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/extension-text-style": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.3.1.tgz", - "integrity": "sha512-uWYbzAV95JnetFBduWRI9n2QbQfmznQ7I6XzfZxuTAO2KcWGvHPBS7F00COO9Y67FZAPMbuQ1njtCJK0nClOPw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.4.tgz", - "integrity": "sha512-0XEM/yNLaMc/sZlYOau7XpHyYiHT9LwXUe7kmze/L8eowIa/iLvmRbcnUd3rtlZ7x7wooE6UO9c7OtlREg4ZBw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.4.tgz", - "integrity": "sha512-K2MDiu6CwQ7+Jr6g1Lh3Tuxm1L6SefSHMpQO0UW3aRGwgEV5pjlrztnBFX4K9b7MNuQ4dJGCUK9u8Cv7Xss0qg==", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.4.tgz", - "integrity": "sha512-KbJfoaqTZePpkWAN+klpK5j0UVtELxN7H5B0J556/UCB/rnq+OsdEFHPks2Ss9TidqWzRUqcxUE50UZ7b8h7Ug==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-hard-break": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.4.tgz", - "integrity": "sha512-nW9wubW1A/CO2Ssn9wNMP08tR9Oarg9VUGzJ5qNuz38DDNyntE1SyDS+XStkeMq5nKqJ3YKhukyAJH/PiRq4Mg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-heading": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.3.1.tgz", - "integrity": "sha512-epdIrg1xpuk5ApnNyM/NJO1dhVZgD7kDPem6QH4fug5UJtCueze942yNzUhCuvckmIegfdferAb1p4ug4674ig==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-highlight": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.3.1.tgz", - "integrity": "sha512-BWetu1jqHVsl6bZMaZM8VZYtHC6JBM2CRgI7R8GnKKDM8aSxK0P7CHCZLs4dGwOPlFVjE/nCjwdKd+GUUkeaQg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-history": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.4.tgz", - "integrity": "sha512-fg6BNxbpMMtgKaiNI/GLcCzkxIQMwSYBhO9LA0CxLvmsWGU+My4r9W3DK6HwNoRJ9+6OleDPSLo1P73fbSTtEA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.4.tgz", - "integrity": "sha512-s9ycm/BOGoW3L0Epnj541vdngHbFbMM488HoODd1CmVSw1C+wBWFgsukgqKjlyE3VGfZXuSb1ur9zinW0RiLJQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-image": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.3.1.tgz", - "integrity": "sha512-3RhVBySQA2LbftWhtZ0p2Mqf9lihNAYs3uQ3iyaB+BYViQiHyVpui09Wny0BwNy0oV6ryUWjBifko2Z1AZgANw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-italic": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.4.tgz", - "integrity": "sha512-8MIQ+wsbyxNCZDCFTVTOXrS2AvFyOhtlBNgVU2+6r6xnJV4AcfEA3qclysqrjOlL117ped/nzDeoB0AeX0CI+Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-link": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.3.1.tgz", - "integrity": "sha512-VE54iLwWcPldqZl7a4E/pmGD7waCWS//VT8jxTuFUroTouIzT+OjB9DQAXMkrRiaz+na3I8Jie1yBE+zYB0gvQ==", - "dependencies": { - "linkifyjs": "^4.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-list-item": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.4.tgz", - "integrity": "sha512-8K3WUD5fPyw2poQKnJGGm7zlfeIbpld92+SRF4M9wkp95EzvgexTlodvxlrL3i8zKXcQQVyExWA8kCcGPFb9bA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.4.tgz", - "integrity": "sha512-NaeEu+qFG2O0emc8WlwOM7DKNKOaqHWuNkuKrrmQzslgL+UQSEGlGMo6NEJ5sLLckPBDpIa0MuRm30407JE+cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-paragraph": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.4.tgz", - "integrity": "sha512-SRNVhT8OXqjpZtcyuOtofbtOpXXFrQrjqqCc/yXebda//2SfUTOvB16Lss77vQOWi6xr7TF1mZuowJgSTkcczw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-strike": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.4.tgz", - "integrity": "sha512-OibipsomFpOJWTPVX/z4Z53HgwDA93lE/loHGa+ONJfML1dO6Zd6UTwzaVO1/g8WOwRgwkYu/6JnhxLKRlP8Lg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-subscript": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.3.1.tgz", - "integrity": "sha512-fTe7/U/1iteoa/cci0Ya7KLuf5VFTrthizzCoWiUiv08C2AJSHTLEURtljmiZ6iA37P8l6FvgzS/ZXTOZ/1o2A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-superscript": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.3.1.tgz", - "integrity": "sha512-xAFgiW39zlHhzoyrcdiLTqmE/jRexJof7jhChCxHTt5DqOZxWS+1JPcn47XY+Ho0W0CpqiO5JuhO3i/5gs5Llw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-text": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.4.tgz", - "integrity": "sha512-wPdVxCHrIS9S+8n08lgyyqRZPj9FBbyLlFt74/lV5yBC3LOorq1VKdjrTskmaj4jud7ImXoKDyBddAYTHdJ1xw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-text-align": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.3.1.tgz", - "integrity": "sha512-EhV8xuCKdy0abZNALW0AwgqK3KeFzUFmRiKETTkfZb9Y2Jqz8HVGJT8EAAIMfEMkO9AaRMoGRIDMCx3vQsiJlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-text-style": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.3.1.tgz", - "integrity": "sha512-eXtuf3AqcOv28BM0dO4lbBNnvM1fo4WWuT+/s1YV5Ovex3T5OS7PsPuR/9p5AD4NuX9QvNrV+eM02mcNzaTBWw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-typography": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-2.3.1.tgz", - "integrity": "sha512-7TWpU2nvCqz1RGldnsocviUvMpzBqm6zowV0+ecRaXSBI/bDui5tK5kf6fhYrxtb4WF2vGF9C6Wr4tF7Mx8OIw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-underline": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.3.1.tgz", - "integrity": "sha512-xgLGr7bM5OAKagUKdL5dWxJHgwEp2fk3D5XCVUBwqgeOZtOFteoqPzb/2617w7qrP+9oM9zRjw6z27hM8YxyvQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/pm": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.4.tgz", - "integrity": "sha512-pZ4NEkRtYoDLe0spARvXZ1N3hNv/5u6vfPdPtEbmNpoOSjSNqDC1kVM+qJY0iaCYpxbxcv7cxn3kBumcFLQpJQ==", - "dependencies": { - "prosemirror-changeset": "^2.2.1", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.4.1", - "prosemirror-inputrules": "^1.4.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.1", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.23.0", - "prosemirror-schema-basic": "^1.2.3", - "prosemirror-schema-list": "^1.4.1", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.1", - "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.37.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/react": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.0.4.tgz", - "integrity": "sha512-NcrZL4Tu3+1Xfj/us5AOD7+kJhwYo2XViOB2iRRnfwS80PUtiLWDis6o3ngMGot/jBWzaMn4gofXnMWHtFdIAw==", - "dependencies": { - "@tiptap/extension-bubble-menu": "^2.0.4", - "@tiptap/extension-floating-menu": "^2.0.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.3.1.tgz", - "integrity": "sha512-VGk1o5y5f2ZHKkvP2WNj8BH7FGak0d0cjxQiXP1n5w8eS0vFnTkCz3JbCPM+KTKobsBmxd2vSC3ElgP9E9d2xw==", - "dependencies": { - "@tiptap/core": "^2.3.1", - "@tiptap/extension-blockquote": "^2.3.1", - "@tiptap/extension-bold": "^2.3.1", - "@tiptap/extension-bullet-list": "^2.3.1", - "@tiptap/extension-code": "^2.3.1", - "@tiptap/extension-code-block": "^2.3.1", - "@tiptap/extension-document": "^2.3.1", - "@tiptap/extension-dropcursor": "^2.3.1", - "@tiptap/extension-gapcursor": "^2.3.1", - "@tiptap/extension-hard-break": "^2.3.1", - "@tiptap/extension-heading": "^2.3.1", - "@tiptap/extension-history": "^2.3.1", - "@tiptap/extension-horizontal-rule": "^2.3.1", - "@tiptap/extension-italic": "^2.3.1", - "@tiptap/extension-list-item": "^2.3.1", - "@tiptap/extension-ordered-list": "^2.3.1", - "@tiptap/extension-paragraph": "^2.3.1", - "@tiptap/extension-strike": "^2.3.1", - "@tiptap/extension-text": "^2.3.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/suggestion": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.3.1.tgz", - "integrity": "sha512-hfUIsC80QivPH833rlqh3x1RCOat2mE0SzR6m2Z1ZNZ86N5BrYDU8e8p81gR//4SlNBJ7BZGVWN3DXj+aAKs2A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@transloadit/prettier-bytes": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz", - "integrity": "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==" - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "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", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cheerio": { - "version": "0.22.35", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.35.tgz", - "integrity": "sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "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": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/is-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.3.tgz", - "integrity": "sha512-/CLhCW79JUeLKznI6mbVieGbl4QU5Hfn+6udw1YHZoofASjbQ5zaP5LzAUZYDpRYEjS4/P+DhEgyJ/PQmGGTWw==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - }, - "node_modules/@types/q": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" - }, - "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", - "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz", - "integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/react-redux": { - "version": "7.1.34", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", - "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "node_modules/@types/testing-library__dom": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz", - "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==", - "dependencies": { - "pretty-format": "^24.3.0" - } - }, - "node_modules/@types/testing-library__react": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz", - "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==", - "dependencies": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*", - "pretty-format": "^25.1.0" - } - }, - "node_modules/@types/testing-library__react/node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@types/testing-library__react/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/testing-library__react/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/testing-library__react/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/testing-library__react/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/@types/webpack-env": { - "version": "1.18.5", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.5.tgz", - "integrity": "sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==" - }, - "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@umijs/route-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@umijs/route-utils/-/route-utils-4.0.1.tgz", - "integrity": "sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==" - }, - "node_modules/@umijs/use-params": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@umijs/use-params/-/use-params-1.0.9.tgz", - "integrity": "sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==" - }, - "node_modules/@uppy/aws-s3": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@uppy/aws-s3/-/aws-s3-3.6.2.tgz", - "integrity": "sha512-pXXSfJbPLR9tmmLFckKU3lyp7Zx4AVvamH/Y5MU2WHKj8TQMrGeM0/M/nXn8SIa7roYEaskY6dVYT/DcHLdO9A==", - "dependencies": { - "@uppy/aws-s3-multipart": "^3.10.2", - "@uppy/companion-client": "^3.7.2", - "@uppy/utils": "^5.7.2", - "@uppy/xhr-upload": "^3.6.2", - "nanoid": "^4.0.0" - }, - "peerDependencies": { - "@uppy/core": "^3.9.1" - } - }, - "node_modules/@uppy/aws-s3-multipart": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@uppy/aws-s3-multipart/-/aws-s3-multipart-3.12.0.tgz", - "integrity": "sha512-l6/TlRjde/mP4LMFWdJIRBEUUceYXtAiNAHukfyzM3VbY3/+YrEJTAchsa4DrqAiyToJJu6b+xxvL2H46cDs3Q==", - "deprecated": "Use @uppy/aws-s3 instead.", - "dependencies": { - "@uppy/companion-client": "^3.8.1", - "@uppy/utils": "^5.9.0" - }, - "peerDependencies": { - "@uppy/core": "^3.12.0" - } - }, - "node_modules/@uppy/companion-client": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.2.tgz", - "integrity": "sha512-WLjZ0Y6Fe7lzwU1YPvvQ/YqooejcgIZkT2TC39xr+QQ7Y1FwJECsyUdlKwgi1ee8TNpjoCrj3Q1Hjel/+p0VhA==", - "dependencies": { - "@uppy/utils": "^5.9.0", - "namespace-emitter": "^2.0.1", - "p-retry": "^6.1.0" - }, - "peerDependencies": { - "@uppy/core": "^3.13.1" - } - }, - "node_modules/@uppy/core": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.11.0.tgz", - "integrity": "sha512-sqQEvAvZRC3Pq/qqAptLPYj4VVb5HAUqLHuUevnI1MevZUAnn1iYIvddSXDAdpNbtwUvOZlEx06UfRAo6C0dIQ==", - "dependencies": { - "@transloadit/prettier-bytes": "^0.3.0", - "@uppy/store-default": "^3.2.2", - "@uppy/utils": "^5.9.0", - "lodash": "^4.17.21", - "mime-match": "^1.0.2", - "namespace-emitter": "^2.0.1", - "nanoid": "^4.0.0", - "preact": "^10.5.13" - } - }, - "node_modules/@uppy/dashboard": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.9.1.tgz", - "integrity": "sha512-zZp+5Dwqu1jUdAZEu0Os2kC/8bF3cdrkve8CYEwqP/12yjNe8PF+XUQKF1RCYITjDE4hPSXcTh0MWw6t2LONuw==", - "dependencies": { - "@transloadit/prettier-bytes": "^0.3.4", - "@uppy/informer": "^3.1.0", - "@uppy/provider-views": "^3.13.0", - "@uppy/status-bar": "^3.3.3", - "@uppy/thumbnail-generator": "^3.1.0", - "@uppy/utils": "^5.9.0", - "classnames": "^2.2.6", - "is-shallow-equal": "^1.0.1", - "lodash": "^4.17.21", - "memoize-one": "^6.0.0", - "nanoid": "^4.0.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.13.0" - } - }, - "node_modules/@uppy/drag-drop": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-3.1.1.tgz", - "integrity": "sha512-ujUBswJ/Acvg1UQUPtfWO6PekPzFgQAEtDW7yxsi81wy1/WNIYjY36bxKVpM/cz5PjmWOTWoqdjBQa4LIJCdyw==", - "dependencies": { - "@uppy/utils": "^5.9.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.13.1" - } - }, - "node_modules/@uppy/file-input": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-3.1.2.tgz", - "integrity": "sha512-IgZhK3EfO2bEqmEwpqfo3N9k8OxV2pmuGdKU4IuwJFv3Q1s1F6ceSDhWX8ivtVXlDvnbJIkqZbZjnvWwJxfjng==", - "dependencies": { - "@uppy/utils": "^5.9.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.11.0" - } - }, - "node_modules/@uppy/google-drive": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@uppy/google-drive/-/google-drive-3.6.0.tgz", - "integrity": "sha512-7Db98dJW/7ajvKUjJxQbL7D5MarJHG7T958jZhmy0jRugx19r9HqBcM88bsIn+A3ljmnrqzb9IfsRwTZ2W6D5A==", - "dependencies": { - "@uppy/companion-client": "^3.8.1", - "@uppy/provider-views": "^3.13.0", - "@uppy/utils": "^5.9.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.13.0" - } - }, - "node_modules/@uppy/image-editor": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@uppy/image-editor/-/image-editor-2.4.6.tgz", - "integrity": "sha512-uQ8k4pUSsYBv6ZBoICwKq3M1DqiKg6AFM/nbvxL/q5KpRkRTszzPvP4hyvjY2zDLLf/NlK3E45N2IcWraV87dQ==", - "dependencies": { - "@uppy/utils": "^5.9.0", - "cropperjs": "1.5.7", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.11.3" - } - }, - "node_modules/@uppy/informer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.1.0.tgz", - "integrity": "sha512-vmpTLqzSLmZSuIVDZV0o19yXVqyTh5/uCbKUEiyfBhR726kQiuYQLP/ZHaKcvW3c1ESQGbNg53iNHbFBqF681w==", - "dependencies": { - "@uppy/utils": "^5.7.4", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.9.3" - } - }, - "node_modules/@uppy/progress-bar": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-3.1.1.tgz", - "integrity": "sha512-c7Wcv6/gvrdxICnZUaU/cZG6wUtS0V/GYGssGFQ6OW84h0smuzGGA+KOh9zKqr6HBHxgKRxmCDtrlTlSSvAuQQ==", - "dependencies": { - "@uppy/utils": "^5.7.5", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.10.0" - } - }, - "node_modules/@uppy/provider-views": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.13.0.tgz", - "integrity": "sha512-Z2oI88A+GC2zIPk8beoeFN/miHKkhtF58mYjvb5miGCMMZM7p7LRj98sgb5OOdKsGrfeiuTavtgL424BvcVd8w==", - "dependencies": { - "@uppy/utils": "^5.9.0", - "classnames": "^2.2.6", - "nanoid": "^4.0.0", - "p-queue": "^7.3.4", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.13.0" - } - }, - "node_modules/@uppy/react": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@uppy/react/-/react-3.3.1.tgz", - "integrity": "sha512-9BTbWgix4Ob4HyaT2+PJWSLfCCJRqyozDQRREMOBTGL0aVwLlcXyXEZZFyI/LMA0Cstt86rO0xVPAW9ugNepDw==", - "dependencies": { - "@uppy/utils": "^5.9.0", - "prop-types": "^15.6.1" - }, - "peerDependencies": { - "@uppy/core": "^3.11.0", - "@uppy/dashboard": "^3.8.2", - "@uppy/drag-drop": "^3.1.0", - "@uppy/file-input": "^3.1.2", - "@uppy/progress-bar": "^3.1.1", - "@uppy/status-bar": "^3.3.2", - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@uppy/dashboard": { - "optional": true - }, - "@uppy/drag-drop": { - "optional": true - }, - "@uppy/file-input": { - "optional": true - }, - "@uppy/progress-bar": { - "optional": true - }, - "@uppy/status-bar": { - "optional": true - } - } - }, - "node_modules/@uppy/status-bar": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.3.3.tgz", - "integrity": "sha512-TCcnBjTDbq/AmnGOcWbCpQNsv05Z6Y36zdmTCt/xNe2/gTVAYAzGRoGOrkeb6jf/E4AAi25VyOolSqL2ibB8Kw==", - "dependencies": { - "@transloadit/prettier-bytes": "^0.3.4", - "@uppy/utils": "^5.9.0", - "classnames": "^2.2.6", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.11.2" - } - }, - "node_modules/@uppy/store-default": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.2.2.tgz", - "integrity": "sha512-OiSgT++Jj4nLK0N9WTeod3UNjCH81OXE5BcMJCd9oWzl2d0xPNq2T/E9Y6O72XVd+6Y7+tf5vZlPElutfMB3KQ==" - }, - "node_modules/@uppy/thumbnail-generator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.1.0.tgz", - "integrity": "sha512-tDKK/cukC0CrM0F/OlHFmvpGGUq+Db4YfakhIGPKtT7ZO8aWOiIu5JIvaYUnKRxGq3RGsk4zhkxYXuoxVzzsGA==", - "dependencies": { - "@uppy/utils": "^5.7.5", - "exifr": "^7.0.0" - }, - "peerDependencies": { - "@uppy/core": "^3.10.0" - } - }, - "node_modules/@uppy/url": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@uppy/url/-/url-3.6.1.tgz", - "integrity": "sha512-EqnhNSHv7HYY8T9pQ3Cc7/SlSs1eD9rIoNd0GH7axPrJiR1KNwinN3EKnipIlUQgKvjpmrqAdPpHzkAyUVQqDw==", - "dependencies": { - "@uppy/companion-client": "^3.8.1", - "@uppy/utils": "^5.9.0", - "nanoid": "^4.0.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.11.0" - } - }, - "node_modules/@uppy/utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.9.0.tgz", - "integrity": "sha512-9Ubddd3orCOLYjf0KobwgJ+aTrABSxk9t4X/QdM4qJHVZuMIftkaMplrViRUO+kvIBCXEZDIP2AmS060siDNGw==", - "dependencies": { - "lodash": "^4.17.21", - "preact": "^10.5.13" - } - }, - "node_modules/@uppy/xhr-upload": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-3.6.8.tgz", - "integrity": "sha512-zr3OHrIdo08jmCqTYKS0C7o3E0XQpjtZI40wmB6VvXYzu4x/aZankG9QqKxLiY0n8KbZ9aCIvO8loxBGoL7Kaw==", - "dependencies": { - "@uppy/companion-client": "^3.8.1", - "@uppy/utils": "^5.9.0" - }, - "peerDependencies": { - "@uppy/core": "^3.13.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", - "deprecated": "This package has been renamed to 'prop-types-tools'", - "dev": true, - "dependencies": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.13.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", - "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "node_modules/antd": { - "version": "5.22.6", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.22.6.tgz", - "integrity": "sha512-ZYURSV3FR8qQgbfpa554thlO07L6PeHwhAM0wmxnobOBogND/HqSnTU+UZTqT2b2y9MxSfAIu5Xn1uEM9UpceQ==", - "dependencies": { - "@ant-design/colors": "^7.1.0", - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/cssinjs-utils": "^1.1.3", - "@ant-design/icons": "^5.5.2", - "@ant-design/react-slick": "~1.1.2", - "@babel/runtime": "^7.25.7", - "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~2.0.1", - "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/qrcode": "~1.0.0", - "@rc-component/tour": "~1.15.1", - "@rc-component/trigger": "^2.2.6", - "classnames": "^2.5.1", - "copy-to-clipboard": "^3.3.3", - "dayjs": "^1.11.11", - "rc-cascader": "~3.30.0", - "rc-checkbox": "~3.3.0", - "rc-collapse": "~3.9.0", - "rc-dialog": "~9.6.0", - "rc-drawer": "~7.2.0", - "rc-dropdown": "~4.2.1", - "rc-field-form": "~2.7.0", - "rc-image": "~7.11.0", - "rc-input": "~1.6.4", - "rc-input-number": "~9.3.0", - "rc-mentions": "~2.17.0", - "rc-menu": "~9.16.0", - "rc-motion": "^2.9.5", - "rc-notification": "~5.6.2", - "rc-pagination": "~5.0.0", - "rc-picker": "~4.8.3", - "rc-progress": "~4.0.0", - "rc-rate": "~2.13.0", - "rc-resize-observer": "^1.4.3", - "rc-segmented": "~2.5.0", - "rc-select": "~14.16.4", - "rc-slider": "~11.1.7", - "rc-steps": "~6.0.1", - "rc-switch": "~4.1.0", - "rc-table": "~7.49.0", - "rc-tabs": "~15.4.0", - "rc-textarea": "~1.8.2", - "rc-tooltip": "~6.2.1", - "rc-tree": "~5.10.1", - "rc-tree-select": "~5.24.5", - "rc-upload": "~4.8.1", - "rc-util": "^5.44.2", - "scroll-into-view-if-needed": "^3.1.0", - "throttle-debounce": "^5.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ant-design" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/antd/node_modules/@ant-design/colors": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", - "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", - "dependencies": { - "@ctrl/tinycolor": "^3.6.1" - } - }, - "node_modules/antd/node_modules/@ant-design/icons": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.5.2.tgz", - "integrity": "sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "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", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.filter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", - "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.find": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.3.tgz", - "integrity": "sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "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", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "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", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", - "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "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.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "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" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "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", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "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.10.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", - "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-jest/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/babel-jest/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/babel-loader": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", - "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.4", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/babel-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/babel-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "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": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", - "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.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "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==" - }, - "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==", - "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" - } - ] - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bfj": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", - "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", - "dependencies": { - "bluebird": "^3.7.2", - "check-types": "^11.2.3", - "hoopy": "^0.1.4", - "jsonpath": "^1.1.1", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "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.13.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", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/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==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bricks.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/bricks.js/-/bricks.js-1.8.0.tgz", - "integrity": "sha512-XJsIGxoixpMDo/KoLXR+uQizFVGWNAQy1lLoIwXKxm6/Zpd9QQLSUd0otybbK7wjqX23ZvCXFxnIw+uCXJHo0A==", - "dependencies": { - "knot.js": "^1.1.5" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", - "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" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", - "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" - } - ] - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-types": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" - }, - "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", - "dev": true, - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=18.17" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" - }, - "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==" - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/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==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/coa/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/commitizen": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", - "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", - "dev": true, - "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commitizen/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "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/commitizen/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/commitizen/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compute-scroll-into-view": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", - "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz", - "integrity": "sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg==", - "dev": true, - "dependencies": { - "compare-func": "^1.3.1", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits/node_modules/compare-func": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", - "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^3.0.0" - } - }, - "node_modules/conventional-changelog-conventionalcommits/node_modules/dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha512-k4ELWeEU3uCcwub7+dWydqQBRjAjkV9L33HjVRG5Xo2QybI6ja/v+4W73SRi8ubCqJz0l9XsTP1NbewfyqaSlw==", - "dev": true, - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/conventional-changelog-conventionalcommits/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", - "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", - "dev": true - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", - "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", - "dependencies": { - "browserslist": "^4.24.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", - "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "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/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "node_modules/cropperjs": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.5.7.tgz", - "integrity": "sha512-sGj+G/ofKh+f6A4BtXLJwtcKJgMUsXYVUubfTo9grERiDGXncttefmue/fyQFvn8wfdyoD1KhDRYLfjkJFl0yw==" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "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/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/cssdb": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", - "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", - "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/cz-conventional-changelog/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==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cz-conventional-changelog/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/dangerously-set-html-content": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dangerously-set-html-content/-/dangerously-set-html-content-1.1.0.tgz", - "integrity": "sha512-kUHpnYZ9EgT6BKUEgrgccg17Pa0YdI9MlWdDYeu49HIXYONCxZpKr6Tj24q+LwFmbmtL3IJ1Rvj+aaTTzFOepg==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/data-urls/node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "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==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "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", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "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", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "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": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "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", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz", - "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "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/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.2.tgz", - "integrity": "sha512-hLGGBI1tw5N8qTELr3blKjAML/LY4ANxksbS612UiJyDfyf/2D092Pvm+S7pmeTGJRqvlJkFzBoHBQKgQlOQVg==" - }, - "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", - "dev": true, - "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/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==" - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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/env-ci/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/enzyme": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", - "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", - "dev": true, - "dependencies": { - "array.prototype.flat": "^1.2.3", - "cheerio": "^1.0.0-rc.3", - "enzyme-shallow-equal": "^1.0.1", - "function.prototype.name": "^1.1.2", - "has": "^1.0.3", - "html-element-map": "^1.2.0", - "is-boolean-object": "^1.0.1", - "is-callable": "^1.1.5", - "is-number-object": "^1.0.4", - "is-regex": "^1.0.5", - "is-string": "^1.0.5", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1", - "object.values": "^1.1.1", - "raf": "^3.4.1", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.2.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/enzyme-adapter-react-16": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.8.tgz", - "integrity": "sha512-uYGC31eGZBp5nGsr4nKhZKvxGQjyHGjS06BJsUlWgE29/hvnpgCsT1BJvnnyny7N3GIIVyxZ4O9GChr6hy2WQA==", - "dev": true, - "dependencies": { - "enzyme-adapter-utils": "^1.14.2", - "enzyme-shallow-equal": "^1.0.7", - "hasown": "^2.0.0", - "object.assign": "^4.1.5", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "react-is": "^16.13.1", - "react-test-renderer": "^16.0.0-0", - "semver": "^5.7.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "enzyme": "^3.0.0", - "react": "^16.0.0-0", - "react-dom": "^16.0.0-0" - } - }, - "node_modules/enzyme-adapter-react-16/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/enzyme-adapter-utils": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.2.tgz", - "integrity": "sha512-1ZC++RlsYRaiOWE5NRaF5OgsMt7F5rn/VuaJIgc7eW/fmgg8eS1/Ut7EugSPPi7VMdWMLcymRnMF+mJUJ4B8KA==", - "dev": true, - "dependencies": { - "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.6", - "hasown": "^2.0.0", - "object.assign": "^4.1.5", - "object.fromentries": "^2.0.7", - "prop-types": "^15.8.1", - "semver": "^6.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" - } - }, - "node_modules/enzyme-shallow-equal": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", - "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0", - "object-is": "^1.1.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/enzyme-to-json": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.6.2.tgz", - "integrity": "sha512-Ynm6Z6R6iwQ0g2g1YToz6DWhxVnt8Dy1ijR2zynRKxTyBGA8rCDXU3rs2Qc4OKvUvc2Qoe1bcFK6bnPs20TrTg==", - "dev": true, - "dependencies": { - "@types/cheerio": "^0.22.22", - "lodash": "^4.17.21", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "enzyme": "^3.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.23.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", - "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.6", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-regex-test": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "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-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "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", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "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/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "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.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "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", - "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", - "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-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "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", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", - "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "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", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "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-plugin-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "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-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "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", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "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", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "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", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exifr": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", - "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/expect/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/expect/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expect/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/expect/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==" - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/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==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": 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", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "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/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "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/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/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/filelist/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/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "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", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-node-modules": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", - "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", - "dev": true, - "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "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/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "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/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "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", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/form-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", - "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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" - } - ] - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", - "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "0.6.8" - } - }, - "node_modules/git-log-parser/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/git-log-parser/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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/git-log-parser/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "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", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "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", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "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.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/highlight.js": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", - "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", - "engines": { - "node": ">=12.0.0" - } - }, - "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==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "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", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "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", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-element-map": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", - "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", - "dev": true, - "dependencies": { - "array.prototype.filter": "^1.0.0", - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-encoding-sniffer/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==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "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-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", - "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": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "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", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "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": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", - "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/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-proxy/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/husky": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", - "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^7.0.0", - "find-versions": "^4.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^5.0.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "bin": { - "husky-run": "bin/run.js", - "husky-upgrade": "lib/upgrader/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/husky" - } - }, - "node_modules/husky/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "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", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "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/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "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.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": 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": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shallow-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz", - "integrity": "sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==" - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", - "dev": true - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", - "dependencies": { - "call-bound": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "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", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", - "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "reflect.getprototypeof": "^1.0.8", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-circus/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-circus/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==" - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "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/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-config/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-config/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-config/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==" - }, - "node_modules/jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "dependencies": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/jest-diff/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-each/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-each/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-each/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==" - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-haste-map/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-jasmine2/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-jasmine2/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-jasmine2/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==" - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-leak-detector/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==" - }, - "node_modules/jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "dependencies": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/jest-matcher-utils/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-message-util/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-message-util/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==" - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-resolve/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runtime/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runtime/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-snapshot/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-snapshot/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==" - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-sonar-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", - "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", - "dependencies": { - "xml": "^1.0.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-util/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-validate/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "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/jest-validate/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==" - }, - "node_modules/jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dependencies": { - "@jest/schemas": "^28.1.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": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-watch-typeahead/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/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==" - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", - "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "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.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "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==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/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==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/jsdom/node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/jsdom/node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", - "dependencies": { - "string-convert": "^0.2.0" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonpath": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", - "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" - } - }, - "node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "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/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/knot.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/knot.js/-/knot.js-1.1.5.tgz", - "integrity": "sha512-ptGtvTrgLNtQj9ilUR+tSyHWTCPp2xu/EHkeo3OvpczzNqBSwjQKz8G7vUhzlRbasXVULBWSejsj6QRQb1pakw==" - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/linkifyjs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", - "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==" - }, - "node_modules/lint-staged": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", - "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.2.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^4.1.0", - "listr2": "^3.2.2", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/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==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowlight": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-2.9.0.tgz", - "integrity": "sha512-OpcaUTCLmHuVuBcyNckKfH5B0oA4JUavb/M/8n9iAvanJYNQkrVm4pvyX0SUaqkBG4dnWHKt7p50B3ngAG2Rfw==", - "dependencies": { - "@types/hast": "^2.0.0", - "fault": "^2.0.0", - "highlight.js": "~11.8.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lowlight/node_modules/highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "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/marked": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", - "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", - "dev": true, - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/marked-terminal": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.2.0.tgz", - "integrity": "sha512-DQfNRV9svZf0Dm9Cf5x5xaVJ1+XjxQW6XjFJ5HFkVyK52SDpj5PCBzS5X5r2w9nHr3mlB0T5201UMLue9fmhUw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.1", - "cardinal": "^2.1.1", - "chalk": "^4.1.0", - "cli-table3": "^0.6.0", - "node-emoji": "^1.10.0", - "supports-hyperlinks": "^2.1.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0" - } - }, - "node_modules/material-colors": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", - "dependencies": { - "map-or-similar": "^1.5.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", - "dev": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", - "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", - "dependencies": { - "wildcard": "^1.1.0" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/monaco-editor": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.25.2.tgz", - "integrity": "sha512-5iylzSJevCnzJn9UVsW8yOZ3yHjmAs4TfvH3zsbftKiFKmHG0xirGN6DK9Kk04VSWxYCZZAIafYJoNJJMAU1KA==" - }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/namespace-emitter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", - "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" - }, - "node_modules/nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "bin": { - "nearley-railroad": "bin/nearley-railroad.js", - "nearley-test": "bin/nearley-test.js", - "nearley-unparse": "bin/nearley-unparse.js", - "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" - } - }, - "node_modules/nearley/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz", - "integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "ansicolors", - "ansistyles", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "pacote", - "parse-conflict-json", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "workspaces": [ - "docs", - "packages/*" - ], - "dependencies": { - "@isaacs/string-locale-compare": "*", - "@npmcli/arborist": "*", - "@npmcli/ci-detect": "*", - "@npmcli/config": "*", - "@npmcli/map-workspaces": "*", - "@npmcli/package-json": "*", - "@npmcli/run-script": "*", - "abbrev": "*", - "ansicolors": "*", - "ansistyles": "*", - "archy": "*", - "cacache": "*", - "chalk": "*", - "chownr": "*", - "cli-columns": "*", - "cli-table3": "*", - "columnify": "*", - "fastest-levenshtein": "*", - "glob": "*", - "graceful-fs": "*", - "hosted-git-info": "*", - "ini": "*", - "init-package-json": "*", - "is-cidr": "*", - "json-parse-even-better-errors": "*", - "libnpmaccess": "*", - "libnpmdiff": "*", - "libnpmexec": "*", - "libnpmfund": "*", - "libnpmhook": "*", - "libnpmorg": "*", - "libnpmpack": "*", - "libnpmpublish": "*", - "libnpmsearch": "*", - "libnpmteam": "*", - "libnpmversion": "*", - "make-fetch-happen": "*", - "minipass": "*", - "minipass-pipeline": "*", - "mkdirp": "*", - "mkdirp-infer-owner": "*", - "ms": "*", - "node-gyp": "*", - "nopt": "*", - "npm-audit-report": "*", - "npm-install-checks": "*", - "npm-package-arg": "*", - "npm-pick-manifest": "*", - "npm-profile": "*", - "npm-registry-fetch": "*", - "npm-user-validate": "*", - "npmlog": "*", - "opener": "*", - "pacote": "*", - "parse-conflict-json": "*", - "qrcode-terminal": "*", - "read": "*", - "read-package-json": "*", - "read-package-json-fast": "*", - "readdir-scoped-modules": "*", - "rimraf": "*", - "semver": "*", - "ssri": "*", - "tar": "*", - "text-table": "*", - "tiny-relative-date": "*", - "treeverse": "*", - "validate-npm-package-name": "*", - "which": "*", - "write-file-atomic": "*" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "2.9.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ini": "^2.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "semver": "^7.3.4", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "inBundle": true, - "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/npm/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/ansicolors": { - "version": "0.3.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ansistyles": { - "version": "0.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "1.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/asn1": { - "version": "0.2.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/npm/node_modules/assert-plus": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/asynckit": { - "version": "0.4.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aws-sign2": { - "version": "0.7.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/aws4": { - "version": "1.11.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/npm/node_modules/bin-links": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/cacache": { - "version": "15.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/caseless": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "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/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/ansi-regex": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/code-point-at": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/colors": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.5.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "node_modules/npm/node_modules/combined-stream": { - "version": "1.0.8", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/dashdash": { - "version": "1.14.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delayed-stream": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/ecc-jsbn": { - "version": "0.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extend": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extsprintf": { - "version": "1.3.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/forever-agent": { - "version": "0.6.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/getpass": { - "version": "0.1.7", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.8", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/har-schema": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/har-validator": { - "version": "5.1.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/http-signature": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "2.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^8.1.5", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.7.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/is-typedarray": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/isstream": { - "version": "0.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsbn": { - "version": "0.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-schema": { - "version": "0.2.3", - "dev": true, - "inBundle": true - }, - "node_modules/npm/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsprim": { - "version": "1.4.1", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/npm/node_modules/just-diff": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "4.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^3.0.4", - "npm-package-arg": "^8.1.4", - "pacote": "^11.3.4", - "tar": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^2.3.0", - "@npmcli/ci-detect": "^1.3.0", - "@npmcli/run-script": "^1.8.4", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^8.1.2", - "pacote": "^11.3.1", - "proc-log": "^1.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^2.5.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "6.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^1.8.3", - "npm-package-arg": "^8.1.0", - "pacote": "^11.2.6" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.0.7", - "@npmcli/run-script": "^1.8.4", - "json-parse-even-better-errors": "^2.3.1", - "semver": "^7.3.5", - "stringify-package": "^1.0.1" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/mime-db": { - "version": "1.49.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/mime-types": { - "version": "2.1.32", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.49.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "1.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "7.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/aproba": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "2.7.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/string-width": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "2.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "8.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "2.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "6.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "5.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "11.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/number-is-nan": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/oauth-sign": { - "version": "0.9.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "11.3.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/performance-now": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/proc-log": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/psl": { - "version": "1.8.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/punycode": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/qs": { - "version": "6.5.2", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/request": { - "version": "2.88.2", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/npm/node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "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" - } + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.6.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "6.1.0", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" + "optional": true, + "os": [ + "android" + ] }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.10", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" + "optional": true, + "os": [ + "android" + ] }, - "node_modules/npm/node_modules/sshpk": { - "version": "1.16.1", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/npm/node_modules/ssri": { - "version": "8.0.1", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/npm/node_modules/string-width": { - "version": "2.1.1", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], "dev": true, - "inBundle": true, "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/stringify-package": { - "version": "1.0.1", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], "dev": true, - "inBundle": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], "dev": true, - "inBundle": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/treeverse": { - "version": "1.0.4", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/tunnel-agent": { - "version": "0.6.0", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/npm/node_modules/tweetnacl": { - "version": "0.14.5", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], "dev": true, - "inBundle": true, - "license": "Unlicense" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/npm/node_modules/typedarray-to-buffer": { - "version": "3.1.5", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/npm/node_modules/unique-filename": { - "version": "1.1.1", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "cpu": [ + "x64" + ], "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/npm/node_modules/unique-slug": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@storybook/addons": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.16.tgz", + "integrity": "sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "@storybook/api": "6.5.16", + "@storybook/channels": "6.5.16", + "@storybook/client-logger": "6.5.16", + "@storybook/core-events": "6.5.16", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.16", + "@storybook/theming": "6.5.16", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/npm/node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/@storybook/addons/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/@storybook/api": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", + "integrity": "sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==", + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "@storybook/channels": "6.5.16", + "@storybook/client-logger": "6.5.16", + "@storybook/core-events": "6.5.16", + "@storybook/csf": "0.0.2--canary.4566f4d.1", + "@storybook/router": "6.5.16", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.5.16", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^6.0.8", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, + "node_modules/@storybook/api/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, - "node_modules/npm/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "inBundle": true, + "node_modules/@storybook/channels": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", + "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", "license": "MIT", - "bin": { - "uuid": "bin/uuid" + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", + "node_modules/@storybook/client-logger": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", + "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/@storybook/core-events": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", + "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", + "license": "MIT", "dependencies": { - "builtins": "^1.0.3" + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/npm/node_modules/verror": { - "version": "1.10.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, + "node_modules/@storybook/csf": { + "version": "0.0.2--canary.4566f4d.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", + "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "lodash": "^4.17.15" } }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, + "node_modules/@storybook/router": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", + "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", "license": "MIT", "dependencies": { - "defaults": "^1.0.3" + "@storybook/client-logger": "6.5.16", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, + "node_modules/@storybook/router/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "core-js": "^3.6.5", + "find-up": "^4.1.0" }, "bin": { - "node-which": "bin/node-which" + "semver": "bin/semver.js" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "node": ">=10" } }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/@storybook/semver/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==" - }, - "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==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/@storybook/semver/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "node_modules/@storybook/semver/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "node_modules/@storybook/semver/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/@storybook/theming": { + "version": "6.5.16", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", + "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "6.5.16", + "core-js": "^3.8.2", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } + "node_modules/@storybook/theming/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", - "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" - }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/omit.js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-2.0.2.tgz", - "integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "wrappy": "1" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dev": true, - "bin": { - "opencollective-postinstall": "index.js" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "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" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, + "license": "MIT", "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" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==" - }, - "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==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, + "node_modules/@tailwindcss/node": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.17.tgz", + "integrity": "sha512-LIdNwcqyY7578VpofXyqjH6f+3fP4nrz7FBLki5HpzqjYfXdF2m/eW18ZfoKePtDGg90Bvvfpov9d2gy5XVCbg==", + "license": "MIT", "dependencies": { - "p-map": "^2.0.0" + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "tailwindcss": "4.0.17" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.17.tgz", + "integrity": "sha512-B4OaUIRD2uVrULpAD1Yksx2+wNarQr2rQh65nXqaqbLY1jCd8fO+3KLh/+TH4Hzh2NTHQvgxVbPdUDOtLk7vAw==", + "license": "MIT", + "engines": { + "node": ">= 10" }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.17", + "@tailwindcss/oxide-darwin-arm64": "4.0.17", + "@tailwindcss/oxide-darwin-x64": "4.0.17", + "@tailwindcss/oxide-freebsd-x64": "4.0.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.17", + "@tailwindcss/oxide-linux-x64-musl": "4.0.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.17" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.17.tgz", + "integrity": "sha512-3RfO0ZK64WAhop+EbHeyxGThyDr/fYhxPzDbEQjD2+v7ZhKTb2svTWy+KK+J1PHATus2/CQGAGp7pHY/8M8ugg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.17.tgz", + "integrity": "sha512-e1uayxFQCCDuzTk9s8q7MC5jFN42IY7nzcr5n0Mw/AcUHwD6JaBkXnATkD924ZsHyPDvddnusIEvkgLd2CiREg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.17.tgz", + "integrity": "sha512-d6z7HSdOKfXQ0HPlVx1jduUf/YtBuCCtEDIEFeBCzgRRtDsUuRtofPqxIVaSCUTOk5+OfRLonje6n9dF6AH8wQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.17.tgz", + "integrity": "sha512-EjrVa6lx3wzXz3l5MsdOGtYIsRjgs5Mru6lDv4RuiXpguWeOb3UzGJ7vw7PEzcFadKNvNslEQqoAABeMezprxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.17.tgz", + "integrity": "sha512-65zXfCOdi8wuaY0Ye6qMR5LAXokHYtrGvo9t/NmxvSZtCCitXV/gzJ/WP5ksXPhff1SV5rov0S+ZIZU+/4eyCQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.17.tgz", + "integrity": "sha512-+aaq6hJ8ioTdbJV5IA1WjWgLmun4T7eYLTvJIToiXLHy5JzUERRbIZjAcjgK9qXMwnvuu7rqpxzej+hGoEcG5g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/p-queue": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", - "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^5.0.2" - }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.17.tgz", + "integrity": "sha512-/FhWgZCdUGAeYHYnZKekiOC0aXFiBIoNCA0bwzkICiMYS5Rtx2KxFfMUXQVnl4uZRblG5ypt5vpPhVaXgGk80w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.17.tgz", + "integrity": "sha512-gELJzOHK6GDoIpm/539Golvk+QWZjxQcbkKq9eB2kzNkOvrP0xc5UPgO9bIMNt1M48mO8ZeNenCMGt6tfkvVBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.17.tgz", + "integrity": "sha512-68NwxcJrZn94IOW4TysMIbYv5AlM6So1luTlbYUDIGnKma1yTFGBRNEJ+SacJ3PZE2rgcTBNRHX1TB4EQ/XEHw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.17.tgz", + "integrity": "sha512-AkBO8efP2/7wkEXkNlXzRD4f/7WerqKHlc6PWb5v0jGbbm22DFBLbIM19IJQ3b+tNewQZa+WnPOaGm0SmwMNjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.17.tgz", + "integrity": "sha512-7/DTEvXcoWlqX0dAlcN0zlmcEu9xSermuo7VNGX9tJ3nYMdo735SHvbrHDln1+LYfF6NhJ3hjbpbjkMOAGmkDg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/@tailwindcss/vite": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.17.tgz", + "integrity": "sha512-HJbBYDlDVg5cvYZzECb6xwc1IDCEM3uJi3hEZp3BjZGCNGJcTsnCpan+z+VMW0zo6gR0U6O6ElqU1OoZ74Dhww==", + "license": "MIT", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "@tailwindcss/node": "4.0.17", + "@tailwindcss/oxide": "4.0.17", + "lightningcss": "1.29.2", + "tailwindcss": "4.0.17" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/@tippyjs/react": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", + "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "tippy.js": "^6.3.1" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "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" - }, + "node_modules/@tiptap/core": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.3.1.tgz", + "integrity": "sha512-ycpQlmczAOc05TgB5sc3RUTEEBXAVmS8MR9PqQzg96qidaRfVkgE+2w4k7t83PMHl2duC0MGqOCy96pLYwSpeg==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.0.0" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/@tiptap/extension-blockquote": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.5.tgz", + "integrity": "sha512-MZfcRIzKRD8/J1hkt/eYv49060GTL6qGR3NY/oTDuw2wYzbQXXLEbjk8hxAtjwNn7G+pWQv3L+PKFzZDxibLuA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "dependencies": { - "entities": "^4.5.0" - }, + "node_modules/@tiptap/extension-bold": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.5.tgz", + "integrity": "sha512-OAq03MHEbl7MtYCUzGuwb0VpOPnM0k5ekMbEaRILFU5ZC7cEAQ36XmPIw1dQayrcuE8GZL35BKub2qtRxyC9iA==", + "license": "MIT", "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.5.tgz", + "integrity": "sha512-rx+rMd7EEdht5EHLWldpkzJ56SWYA9799b33ustePqhXd6linnokJCzBqY13AfZ9+xp3RsR6C0ZHI9GGea0tIA==", + "license": "MIT", "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" + "tippy.js": "^6.3.7" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "dependencies": { - "parse5": "^7.0.0" + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.5.tgz", + "integrity": "sha512-VXwHlX6A/T6FAspnyjbKDO0TQ+oetXuat6RY1/JxbXphH42nLuBaGWJ6pgy6xMl6XY8/9oPkTNrfJw/8/eeRwA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-character-count": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.3.1.tgz", + "integrity": "sha512-9aYj1K7uejPm+U0kaviECC+p0bWhIo2ld2x9FFvw4RJF7UlULAz8kiS55WhHBpLiv6OdAIuQH8SwVDLNac5/yQ==", + "license": "MIT", "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" + "node_modules/@tiptap/extension-code": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.5.tgz", + "integrity": "sha512-xOvHevNIQIcCCVn9tpvXa1wBp0wHN/2umbAZGTVzS+AQtM7BTo0tz8IyzwxkcZJaImONcUVYLOLzt2AgW1LltA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "node_modules/@tiptap/extension-code-block": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.5.tgz", + "integrity": "sha512-ksxMMvqLDlC+ftcQLynqZMdlJT1iHYZorXsXw/n+wuRd7YElkRkd6YWUX/Pq/njFY6lDjKiqFLEXBJB8nrzzBA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" + "node_modules/@tiptap/extension-code-block-lowlight": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.3.1.tgz", + "integrity": "sha512-cITugRxTy2/HM2csvjpAnCYBp1Z+A+dXLpNic1QzcXvTTjxTw7V4dtOE7ymmiMHlsAOKQLeWkkgc6W0pPES6IA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/extension-code-block": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" + "node_modules/@tiptap/extension-color": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.3.1.tgz", + "integrity": "sha512-a127akyS3nMbcLKzZ02l/rHUP5BlCmbma6vYJNjRk6Srd1DlhXCIynMZJr7Bzgngq9KNLGQha2uxbPr7me3xAA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/extension-text-style": "^2.0.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" + "node_modules/@tiptap/extension-document": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.3.1.tgz", + "integrity": "sha512-uWYbzAV95JnetFBduWRI9n2QbQfmznQ7I6XzfZxuTAO2KcWGvHPBS7F00COO9Y67FZAPMbuQ1njtCJK0nClOPw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.5.tgz", + "integrity": "sha512-uIN7L3FU0904ec7FFFbndO7RQE/yiON4VzAMhNn587LFMyWO8US139HXIL4O8dpZeYwYL3d1FnDTflZl6CwLlg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.5.tgz", + "integrity": "sha512-HsMI0hV5Lwzm530Z5tBeyNCBNG38eJ3qjfdV2OHlfSf3+KOEfn6a5AUdoNaZO02LF79/8+7BaYU2drafag9cxQ==", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" + "tippy.js": "^6.3.7" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-to-regexp": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.0.0.tgz", - "integrity": "sha512-GAWaqWlTjYK/7SVpIUA6CTxmcg65SP30sbjdCvyYReosRkk7Z/LyHWwkK3Vu0FcIi0FNTADUs4eh1AsU5s10cg==", - "engines": { - "node": ">=16" + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.5.tgz", + "integrity": "sha512-kcWa+Xq9cb6lBdiICvLReuDtz/rLjFKHWpW3jTTF3FiP3wx4H8Rs6bzVtty7uOVTfwupxZRiKICAMEU6iT0xrQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" + "node_modules/@tiptap/extension-hard-break": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.5.tgz", + "integrity": "sha512-q9doeN+Yg9F5QNTG8pZGYfNye3tmntOwch683v0CCVCI4ldKaLZ0jG3NbBTq+mosHYdgOH2rNbIORlRRsQ+iYQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { + "node_modules/@tiptap/extension-heading": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.3.1.tgz", + "integrity": "sha512-epdIrg1xpuk5ApnNyM/NJO1dhVZgD7kDPem6QH4fug5UJtCueze942yNzUhCuvckmIegfdferAb1p4ug4674ig==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/@tiptap/extension-highlight": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.3.1.tgz", + "integrity": "sha512-BWetu1jqHVsl6bZMaZM8VZYtHC6JBM2CRgI7R8GnKKDM8aSxK0P7CHCZLs4dGwOPlFVjE/nCjwdKd+GUUkeaQg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" + "node_modules/@tiptap/extension-history": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.5.tgz", + "integrity": "sha512-b+wOS33Dz1azw6F1i9LFTEIJ/gUui0Jwz5ZvmVDpL2ZHBhq1Ui0/spTT+tuZOXq7Y/uCbKL8Liu4WoedIvhboQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.5.tgz", + "integrity": "sha512-3up2r1Du8/5/4ZYzTC0DjTwhgPI3dn8jhOCLu73m5F3OGvK/9whcXoeWoX103hYMnGDxBlfOje71yQuN35FL4A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" + "node_modules/@tiptap/extension-image": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.3.1.tgz", + "integrity": "sha512-3RhVBySQA2LbftWhtZ0p2Mqf9lihNAYs3uQ3iyaB+BYViQiHyVpui09Wny0BwNy0oV6ryUWjBifko2Z1AZgANw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "node_modules/@tiptap/extension-italic": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.5.tgz", + "integrity": "sha512-9VGfb2/LfPhQ6TjzDwuYLRvw0A6VGbaIp3F+5Mql8XVdTBHb2+rhELbyhNGiGVR78CaB/EiKb6dO9xu/tBWSYA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, + "node_modules/@tiptap/extension-link": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.3.1.tgz", + "integrity": "sha512-VE54iLwWcPldqZl7a4E/pmGD7waCWS//VT8jxTuFUroTouIzT+OjB9DQAXMkrRiaz+na3I8Jie1yBE+zYB0gvQ==", + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "linkifyjs": "^4.1.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" + "node_modules/@tiptap/extension-list-item": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.5.tgz", + "integrity": "sha512-Mp5RD/pbkfW1vdc6xMVxXYcta73FOwLmblQlFNn/l/E5/X1DUSA4iGhgDDH4EWO3swbs03x2f7Zka/Xoj3+WLg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.5.tgz", + "integrity": "sha512-Cu8KwruBNWAaEfshRQR0yOSaUKAeEwxW7UgbvF9cN/zZuKgK5uZosPCPTehIFCcRe+TBpRtZQh+06f/gNYpYYg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/@tiptap/extension-paragraph": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.5.tgz", + "integrity": "sha512-YFBWeg7xu/sBnsDIF/+nh9Arf7R0h07VZMd0id5Ydd2Qe3c1uIZwXxeINVtH0SZozuPIQFAT8ICe9M0RxmE+TA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" + "node_modules/@tiptap/extension-strike": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.5.tgz", + "integrity": "sha512-PVfUiCqrjvsLpbIoVlegSY8RlkR64F1Rr2RYmiybQfGbg+AkSZXDeO0eIrc03//4gua7D9DfIozHmAKv1KN3ow==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, + "node_modules/@tiptap/extension-subscript": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.3.1.tgz", + "integrity": "sha512-fTe7/U/1iteoa/cci0Ya7KLuf5VFTrthizzCoWiUiv08C2AJSHTLEURtljmiZ6iA37P8l6FvgzS/ZXTOZ/1o2A==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, + "node_modules/@tiptap/extension-superscript": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.3.1.tgz", + "integrity": "sha512-xAFgiW39zlHhzoyrcdiLTqmE/jRexJof7jhChCxHTt5DqOZxWS+1JPcn47XY+Ho0W0CpqiO5JuhO3i/5gs5Llw==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, + "node_modules/@tiptap/extension-text": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.5.tgz", + "integrity": "sha512-Gq1WwyhFpCbEDrLPIHt5A8aLSlf8bfz4jm417c8F/JyU0J5dtYdmx0RAxjnLw1i7ZHE7LRyqqAoS0sl7JHDNSQ==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" + "node_modules/@tiptap/extension-text-align": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.3.1.tgz", + "integrity": "sha512-EhV8xuCKdy0abZNALW0AwgqK3KeFzUFmRiKETTkfZb9Y2Jqz8HVGJT8EAAIMfEMkO9AaRMoGRIDMCx3vQsiJlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-text-style": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.3.1.tgz", + "integrity": "sha512-eXtuf3AqcOv28BM0dO4lbBNnvM1fo4WWuT+/s1YV5Ovex3T5OS7PsPuR/9p5AD4NuX9QvNrV+eM02mcNzaTBWw==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" + "node_modules/@tiptap/extension-typography": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-2.3.1.tgz", + "integrity": "sha512-7TWpU2nvCqz1RGldnsocviUvMpzBqm6zowV0+ecRaXSBI/bDui5tK5kf6fhYrxtb4WF2vGF9C6Wr4tF7Mx8OIw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" + "node_modules/@tiptap/extension-underline": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.3.1.tgz", + "integrity": "sha512-xgLGr7bM5OAKagUKdL5dWxJHgwEp2fk3D5XCVUBwqgeOZtOFteoqPzb/2617w7qrP+9oM9zRjw6z27hM8YxyvQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/@tiptap/pm": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.5.tgz", + "integrity": "sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==", + "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.1", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.23.0", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.3", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.0" }, - "engines": { - "node": ">=6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/@tiptap/react": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.0.4.tgz", + "integrity": "sha512-NcrZL4Tu3+1Xfj/us5AOD7+kJhwYo2XViOB2iRRnfwS80PUtiLWDis6o3ngMGot/jBWzaMn4gofXnMWHtFdIAw==", + "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "@tiptap/extension-bubble-menu": "^2.0.4", + "@tiptap/extension-floating-menu": "^2.0.4" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" } }, - "node_modules/playwright": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", - "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "node_modules/@tiptap/starter-kit": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.3.1.tgz", + "integrity": "sha512-VGk1o5y5f2ZHKkvP2WNj8BH7FGak0d0cjxQiXP1n5w8eS0vFnTkCz3JbCPM+KTKobsBmxd2vSC3ElgP9E9d2xw==", + "license": "MIT", "dependencies": { - "playwright-core": "1.49.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" + "@tiptap/core": "^2.3.1", + "@tiptap/extension-blockquote": "^2.3.1", + "@tiptap/extension-bold": "^2.3.1", + "@tiptap/extension-bullet-list": "^2.3.1", + "@tiptap/extension-code": "^2.3.1", + "@tiptap/extension-code-block": "^2.3.1", + "@tiptap/extension-document": "^2.3.1", + "@tiptap/extension-dropcursor": "^2.3.1", + "@tiptap/extension-gapcursor": "^2.3.1", + "@tiptap/extension-hard-break": "^2.3.1", + "@tiptap/extension-heading": "^2.3.1", + "@tiptap/extension-history": "^2.3.1", + "@tiptap/extension-horizontal-rule": "^2.3.1", + "@tiptap/extension-italic": "^2.3.1", + "@tiptap/extension-list-item": "^2.3.1", + "@tiptap/extension-ordered-list": "^2.3.1", + "@tiptap/extension-paragraph": "^2.3.1", + "@tiptap/extension-strike": "^2.3.1", + "@tiptap/extension-text": "^2.3.1" }, - "optionalDependencies": { - "fsevents": "2.3.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/playwright-core": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", - "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", - "bin": { - "playwright-core": "cli.js" + "node_modules/@tiptap/suggestion": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.3.1.tgz", + "integrity": "sha512-hfUIsC80QivPH833rlqh3x1RCOat2mE0SzR6m2Z1ZNZ86N5BrYDU8e8p81gR//4SlNBJ7BZGVWN3DXj+aAKs2A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "node_modules/@transloadit/prettier-bytes": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz", + "integrity": "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { - "semver-compare": "^1.0.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "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" - } - ], + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@babel/types": "^7.20.7" } }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } + "node_modules/@types/deep-equal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/deep-equal/-/deep-equal-1.0.4.tgz", + "integrity": "sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==", + "dev": true, + "license": "MIT" }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" + "@types/unist": "^2" } }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "node_modules/@types/is-function": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.3.tgz", + "integrity": "sha512-/CLhCW79JUeLKznI6mbVieGbl4QU5Hfn+6udw1YHZoofASjbQ5zaP5LzAUZYDpRYEjS4/P+DhEgyJ/PQmGGTWw==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", + "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "undici-types": "~6.20.0" } }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "license": "MIT" + }, + "node_modules/@types/qrcode.react": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/qrcode.react/-/qrcode.react-1.0.5.tgz", + "integrity": "sha512-BghPtnlwvrvq8QkGa1H25YnN+5OIgCKFuQruncGWLGJYOzeSKiix/4+B9BtfKF2wf5ja8yfyWYA3OXju995G8w==", + "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "@types/react": "*" } }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "node_modules/@types/react": { + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" + "csstype": "^3.0.2" } }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "node_modules/@types/react-color": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.13.tgz", + "integrity": "sha512-2c/9FZ4ixC5T3JzN0LP5Cke2Mf0MKOP2Eh0NPDPWmuVH3NjPyhEjqNMQpN1Phr5m74egAy+p2lYNAFrX1z9Yrg==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@types/reactcss": "*" }, "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*" } }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, + "node_modules/@types/react-dom": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "dev": true, + "license": "MIT", "peerDependencies": { - "postcss": "^8.3" + "@types/react": "^19.0.0" } }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "node_modules/@types/react-helmet": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", + "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "@types/react": "*" } }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, + "node_modules/@types/reactcss": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.13.tgz", + "integrity": "sha512-gi3S+aUi6kpkF5vdhUsnkwbiSEIU/BEJyD7kBy2SudWBUuKmJk8AQKE0OVcQQeEy40Azh0lV6uynxlikYIJuwg==", + "dev": true, + "license": "MIT", "peerDependencies": { - "postcss": "^8.2.15" + "@types/react": "*" } }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/@types/tailwindcss": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/tailwindcss/-/tailwindcss-3.0.11.tgz", + "integrity": "sha512-PR+BOIrI+rxteHwFvkfIOty+PDJwTG4ute3alxSSXpF/xKpryO1room265m46Auyae0VwqUYs3PuVEOF9Oil3w==", + "dev": true, + "license": "MIT" }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/webpack-env": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", + "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", + "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "dev": true, + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/type-utils": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.2" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "node_modules/@typescript-eslint/parser": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", + "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "debug": "^4.3.4" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": "^12 || ^14 || >=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.4" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.9" + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", + "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, + "node_modules/@typescript-eslint/types": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12 || ^14 || >= 16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "dev": true, + "license": "MIT", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.2" + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@typescript-eslint/typescript-estree/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==", + "dev": true, + "license": "MIT", "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "balanced-match": "^1.0.0" } }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", "bin": { - "yaml": "bin.mjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">= 14" + "node": ">=10" } }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "node_modules/@typescript-eslint/utils": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", + "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1" }, "engines": { - "node": ">= 12.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@typescript-eslint/types": "8.24.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" + "node_modules/@uppy/aws-s3": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@uppy/aws-s3/-/aws-s3-4.2.3.tgz", + "integrity": "sha512-5vNgTE85DLujOXpzC6KEwJHLSi8o96v4rwZxMvDWQuikvX4sGcGflYjBCsPaVDYUCiiDXuhI8f93zfwCUEwQ/Q==", + "license": "MIT", + "dependencies": { + "@uppy/companion-client": "^4.4.1", + "@uppy/utils": "^6.1.1" }, "peerDependencies": { - "postcss": "^8.4" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" + "node_modules/@uppy/aws-s3-multipart": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@uppy/aws-s3-multipart/-/aws-s3-multipart-3.12.0.tgz", + "integrity": "sha512-l6/TlRjde/mP4LMFWdJIRBEUUceYXtAiNAHukfyzM3VbY3/+YrEJTAchsa4DrqAiyToJJu6b+xxvL2H46cDs3Q==", + "deprecated": "Use @uppy/aws-s3 instead.", + "license": "MIT", + "dependencies": { + "@uppy/companion-client": "^3.8.1", + "@uppy/utils": "^5.9.0" }, "peerDependencies": { - "postcss": "^8.1.0" + "@uppy/core": "^3.12.0" } }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "node_modules/@uppy/aws-s3-multipart/node_modules/@uppy/companion-client": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.2.tgz", + "integrity": "sha512-WLjZ0Y6Fe7lzwU1YPvvQ/YqooejcgIZkT2TC39xr+QQ7Y1FwJECsyUdlKwgi1ee8TNpjoCrj3Q1Hjel/+p0VhA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@uppy/utils": "^5.9.0", + "namespace-emitter": "^2.0.1", + "p-retry": "^6.1.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^3.13.1" } }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "node_modules/@uppy/aws-s3-multipart/node_modules/@uppy/utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.9.0.tgz", + "integrity": "sha512-9Ubddd3orCOLYjf0KobwgJ+aTrABSxk9t4X/QdM4qJHVZuMIftkaMplrViRUO+kvIBCXEZDIP2AmS060siDNGw==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "lodash": "^4.17.21", + "preact": "^10.5.13" } }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "node_modules/@uppy/companion-client": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-4.4.1.tgz", + "integrity": "sha512-ardMacShsfzaIbqHEH48YlpzWZkBj1qhAj0Dvn3r31p9d0HA5xFUvAdLYrZ6ezKvZ0RcDbf0SB5qCrQMkjscXQ==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@uppy/utils": "^6.1.1", + "namespace-emitter": "^2.0.1", + "p-retry": "^6.1.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "node_modules/@uppy/core": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-4.4.2.tgz", + "integrity": "sha512-df0fQtPEd5W/e5M/CWIXQb/O0rBb+LCz4HTN5Bkqm0UDzW2JFR9mrxnL0dfh3ikVlUq+9vNjAeBr9P0aluIiFg==", + "license": "MIT", "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/store-default": "^4.2.0", + "@uppy/utils": "^6.1.2", + "lodash": "^4.17.21", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^5.0.9", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/core/node_modules/nanoid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", + "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": "^18 || >=20" } }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "node_modules/@uppy/dashboard": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-4.3.2.tgz", + "integrity": "sha512-6cikgcY/TMy+Fq/v03QI1BNocfm1kOxii3kuUaxnz1SFGeuZ/55+C7KKL7SP/IdeoVwH7KV+550HThT0uwIQEw==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/informer": "^4.2.1", + "@uppy/provider-views": "^4.4.2", + "@uppy/status-bar": "^4.1.2", + "@uppy/thumbnail-generator": "^4.1.1", + "@uppy/utils": "^6.1.2", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "nanoid": "^5.0.9", + "preact": "^10.5.13", + "shallow-equal": "^3.0.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^4.4.2" } }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" + "node_modules/@uppy/dashboard/node_modules/nanoid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", + "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^18 || >=20" + } + }, + "node_modules/@uppy/drag-drop": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-4.1.1.tgz", + "integrity": "sha512-4ebDFmgQU3QsG0OB5AqXV8dXydtPEIcjrEy7Q0BI2Zick4bv0BwnqbffygPG0iI+IXRyGxdzkxtS8PHtw5Ks6g==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.1", + "preact": "^10.5.13" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "engines": { - "node": "^10 || ^12 || >= 14" + "node_modules/@uppy/file-input": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-4.1.1.tgz", + "integrity": "sha512-Hz6nHjwtvLasnu9o152AQJrueeQOO4dVSmVEfEHtgbPW1mOuFbiRxasQyW6QOrPyY6cndPpHPidvGzfVtk50Hw==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.1", + "preact": "^10.5.13" }, "peerDependencies": { - "postcss": "^8.1.0" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "node_modules/@uppy/google-drive": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@uppy/google-drive/-/google-drive-4.3.1.tgz", + "integrity": "sha512-boDN+1UecNlUQ8EnAj0JP4RGxIHmvhyb4t9hgFPmNtoaf/ZNMZ+tbieyrPko2QVUFCDo9PddBYiF85vURFqu7w==", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "@uppy/companion-client": "^4.4.1", + "@uppy/provider-views": "^4.4.1", + "@uppy/utils": "^6.1.1", + "preact": "^10.5.13" }, "peerDependencies": { - "postcss": "^8.1.0" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "node_modules/@uppy/image-editor": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@uppy/image-editor/-/image-editor-3.3.1.tgz", + "integrity": "sha512-UKxxX8I6cq+o5Rw9BLRunj0Rbqh/2yNO9UarBJIiA76DxV1YPVF7dTr0NrVhfPYpEuirUoOQUvLsMH6WBERSXg==", + "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@uppy/utils": "^6.1.1", + "cropperjs": "^1.6.2", + "preact": "^10.5.13" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "node_modules/@uppy/informer": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-4.2.1.tgz", + "integrity": "sha512-0en8Py47pl6RMDrgUfqFoF807W5kK5AKVJNT1SkTsLiGg5anmTIMuvmNG3k6LN4cn9P/rKyEHSdGcoBBUj9u7Q==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "@uppy/utils": "^6.1.1", + "preact": "^10.5.13" }, "peerDependencies": { - "postcss": "^8.1.0" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "node_modules/@uppy/progress-bar": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-4.2.1.tgz", + "integrity": "sha512-5TrUYYt1e/Qy4L4GS7pHeH9I9/zYpp7SiJzC5BtYlku5J6yxZbdxpMPW1mBhQqW+ou/IByaVIGFIR6iSq6yo0w==", + "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@uppy/utils": "^6.1.1", + "preact": "^10.5.13" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/@uppy/provider-views": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-4.4.2.tgz", + "integrity": "sha512-YGrPJuydrksmMCjvo7Ty7/lDLNo/Y8zsOgWgWmVbXB0V5aRvqY49LeKY8HDlOXclKmn6dl5CeQFf7p46txRNGQ==", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "@uppy/utils": "^6.1.2", + "classnames": "^2.2.6", + "nanoid": "^5.0.9", + "p-queue": "^8.0.0", + "preact": "^10.5.13" }, "peerDependencies": { - "postcss": "^8.1.0" + "@uppy/core": "^4.4.2" } }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "node_modules/@uppy/provider-views/node_modules/nanoid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", + "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": "^18 || >=20" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "node_modules/@uppy/react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@uppy/react/-/react-4.2.1.tgz", + "integrity": "sha512-T50BmNPMx5+KvXJ4mo8pigiUS8yteLD+G7VG0pl5fOp9MfozEm/NRpUfStUpxU2yh9PVdiz3Q9byN9Cu9azh+A==", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "@uppy/utils": "^6.1.1", + "use-sync-external-store": "^1.2.0" }, "peerDependencies": { - "postcss": "^8.2" + "@uppy/core": "^4.4.1", + "@uppy/dashboard": "^4.3.1", + "@uppy/drag-drop": "^4.1.1", + "@uppy/file-input": "^4.1.1", + "@uppy/progress-bar": "^4.2.1", + "@uppy/status-bar": "^4.1.1", + "react": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@uppy/dashboard": { + "optional": true + }, + "@uppy/drag-drop": { + "optional": true + }, + "@uppy/file-input": { + "optional": true + }, + "@uppy/progress-bar": { + "optional": true + }, + "@uppy/status-bar": { + "optional": true + } } }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "node_modules/@uppy/status-bar": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-4.1.2.tgz", + "integrity": "sha512-Z2fDXItoE940uMo3kwdDo4ZFPjTk5GY6y/C/G5+tSl6nL/IaDtWo5iVbAKHIH4s9SIRwCBgllEhxbmEPhuK7eA==", + "license": "MIT", "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/utils": "^6.1.2", + "classnames": "^2.2.6", + "preact": "^10.5.13" }, "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" + "@uppy/core": "^4.4.2" } }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } + "node_modules/@uppy/store-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-4.2.0.tgz", + "integrity": "sha512-PieFVa8yTvRHIqsNKfpO/yaJw5Ae/hT7uT58ryw7gvCBY5bHrNWxH5N0XFe8PFHMpLpLn8v3UXGx9ib9QkB6+Q==", + "license": "MIT" }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "node_modules/@uppy/thumbnail-generator": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-4.1.1.tgz", + "integrity": "sha512-65znkGNgVTbVte51IKOhgxOpHGSwYj9Qik2jF2ZBocMbhBY4gPkWFwqMrKQBfddA9KbUa4jVe1psxhAQTzYgiA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@uppy/utils": "^6.1.1", + "exifr": "^7.0.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^4.4.1" } }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "node_modules/@uppy/url": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@uppy/url/-/url-4.2.2.tgz", + "integrity": "sha512-ipWXjsNCtVTrWQ2OmDnVJmjnLETLFZFPTBDkkxgAXg/JmeYlmBvIxkqnsi9wpWM0lRSu25zdFEFOMSmxyILKew==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@uppy/companion-client": "^4.4.1", + "@uppy/utils": "^6.1.2", + "nanoid": "^5.0.9", + "preact": "^10.5.13" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^4.4.2" } }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" + "node_modules/@uppy/url/node_modules/nanoid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", + "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": "^18 || >=20" } }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "node_modules/@uppy/utils": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-6.1.2.tgz", + "integrity": "sha512-PCrw6v51M6p3hlrlB2INmcocen4Dyjun1SobjVZRBkg4wutQE8ihZfSrH5ZE8UXFelufhtO16wlaZMi0EHk84w==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "lodash": "^4.17.21", + "preact": "^10.5.13" } }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "node_modules/@uppy/xhr-upload": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-3.6.8.tgz", + "integrity": "sha512-zr3OHrIdo08jmCqTYKS0C7o3E0XQpjtZI40wmB6VvXYzu4x/aZankG9QqKxLiY0n8KbZ9aCIvO8loxBGoL7Kaw==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@uppy/companion-client": "^3.8.1", + "@uppy/utils": "^5.9.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^3.13.0" } }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "node_modules/@uppy/xhr-upload/node_modules/@uppy/companion-client": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.2.tgz", + "integrity": "sha512-WLjZ0Y6Fe7lzwU1YPvvQ/YqooejcgIZkT2TC39xr+QQ7Y1FwJECsyUdlKwgi1ee8TNpjoCrj3Q1Hjel/+p0VhA==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "@uppy/utils": "^5.9.0", + "namespace-emitter": "^2.0.1", + "p-retry": "^6.1.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "@uppy/core": "^3.13.1" + } + }, + "node_modules/@uppy/xhr-upload/node_modules/@uppy/utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.9.0.tgz", + "integrity": "sha512-9Ubddd3orCOLYjf0KobwgJ+aTrABSxk9t4X/QdM4qJHVZuMIftkaMplrViRUO+kvIBCXEZDIP2AmS060siDNGw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "preact": "^10.5.13" } }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=0.4.0" } }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", "peerDependencies": { - "postcss": "^8.2" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8" } }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "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": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" + "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/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "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": { - "postcss-value-parser": "^4.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "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": { - "postcss-selector-parser": "^6.0.10" + "tslib": "^2.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=10" } }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8" } }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/postcss-svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/bricks.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/bricks.js/-/bricks.js-1.8.0.tgz", + "integrity": "sha512-XJsIGxoixpMDo/KoLXR+uQizFVGWNAQy1lLoIwXKxm6/Zpd9QQLSUd0otybbK7wjqX23ZvCXFxnIw+uCXJHo0A==", + "license": "MIT", "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" + "knot.js": "^1.1.5" } }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "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": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=8.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/postcss-svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/postcss-svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=6" } }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.2.15" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "node_modules/caniuse-lite": { + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", + "dev": true, "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" } ], - "bin": { - "nanoid": "bin/nanoid.cjs" + "license": "CC-BY-4.0" + }, + "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" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/preact": { - "version": "10.25.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.3.tgz", - "integrity": "sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==", + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "url": "https://polar.sh/cva" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "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/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" + "node_modules/cli-simple-table": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/cli-simple-table/-/cli-simple-table-0.0.3.tgz", + "integrity": "sha512-Pvq9t46QehEZedz4pDwoCMso1BJTJpsXxPKMIYgxkDfQkjc/HBvpJ1D/BpnorqbPsQO+FfAbQzJdaKDCPQOShQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "strip-ansi": "^6.0.0" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/cmdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", + "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", + "license": "MIT", "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/cmdk/node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@babel/runtime": "^7.13.10" } }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" + "node_modules/cmdk/node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "license": "MIT", "dependencies": { - "asap": "~2.0.6" + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "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==", + "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/prop-types-exact": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.6.tgz", - "integrity": "sha512-jjPykG6orULQ/2Zcatm6vtCs9mdksYZQs4HTmlHAxbkK2NHGFVBrSLDh4k/RpMWVXECZO6za1i6iF7srRKp/KQ==", - "dev": true, + "node_modules/cmdk/node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "isarray": "^2.0.5", - "object.assign": "^4.1.5", - "reflect.ownkeys": "^1.1.4" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" }, - "engines": { - "node": ">= 0.8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/prosemirror-changeset": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", - "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", + "node_modules/cmdk/node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "license": "MIT", "dependencies": { - "prosemirror-transform": "^1.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", - "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "node_modules/cmdk/node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "license": "MIT", "dependencies": { - "prosemirror-state": "^1.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/prosemirror-commands": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.2.tgz", - "integrity": "sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==", + "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "license": "MIT", "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", - "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", + "node_modules/cmdk/node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "license": "MIT", "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", - "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "license": "MIT", "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/prosemirror-history": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", - "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "license": "MIT", "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/prosemirror-inputrules": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", - "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", + "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "license": "MIT", "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/prosemirror-keymap": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", - "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "license": "MIT", "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/prosemirror-markdown": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", - "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", + "node_modules/cmdk/node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", "dependencies": { - "@types/markdown-it": "^14.0.0", - "markdown-it": "^14.0.0", - "prosemirror-model": "^1.20.0" + "react-remove-scroll-bar": "^2.3.3", + "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/prosemirror-menu": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", - "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "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": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/prosemirror-model": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz", - "integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==", + "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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { - "orderedmap": "^2.0.0" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", - "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", - "dependencies": { - "prosemirror-model": "^1.19.0" + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/prosemirror-schema-list": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz", - "integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" + "node_modules/core-js": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/prosemirror-state": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" + "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/prosemirror-tables": { + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cropperjs": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.2.tgz", - "integrity": "sha512-97dKocVLrEVTQjZ4GBLdrrMw7Gv3no8H8yMwf5IRM9OoHrzbWpcH5jJxYgNQIRCtdIqwDctT1HdMHrGTiwp1dQ==", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.2.tgz", + "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { - "prosemirror-keymap": "^1.2.2", - "prosemirror-model": "^1.24.1", - "prosemirror-state": "^1.4.3", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.37.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/prosemirror-trailing-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", - "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", - "dependencies": { - "@remirror/core-constants": "3.0.0", - "escape-string-regexp": "^4.0.0" + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dangerously-set-html-content": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dangerously-set-html-content/-/dangerously-set-html-content-1.1.0.tgz", + "integrity": "sha512-kUHpnYZ9EgT6BKUEgrgccg17Pa0YdI9MlWdDYeu49HIXYONCxZpKr6Tj24q+LwFmbmtL3IJ1Rvj+aaTTzFOepg==", + "license": "MIT", + "engines": { + "node": ">=10" }, "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" + "react": "^18.2.0" } }, - "node_modules/prosemirror-transform": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", - "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", - "dependencies": { - "prosemirror-model": "^1.21.0" + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/prosemirror-view": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.37.1.tgz", - "integrity": "sha512-MEAnjOdXU1InxEmhjgmEzQAikaS6lF3hD64MveTPpjOGNTl87iRLA1HupC/DEV6YuK7m4Q9DHFNTjwIVtqz5NA==", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "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.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { - "punycode": "^2.3.1" + "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/lupomontero" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "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/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "license": "MIT", + "dependencies": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node_modules/deps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deps/-/deps-1.0.0.tgz", + "integrity": "sha512-/mP1HrwnkRaetYr51krCOtAzHE9V5rV5/dhurFJ+B8ztvGP5zWdzBWqPMapyhIpPVy/9Kzr7JbeF0QaPhkF7aQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "cli-simple-table": "0.0.3", + "del": "^5.1.0", + "execa": "^4.0.1", + "minimist": "^1.2.5", + "read-pkg": "^5.2.0", + "sort-keys": "^4.0.0", + "tempy": "^0.5.0" + }, + "bin": { + "deps": "bin/deps.js", + "deps-start": "bin/deps-start.sh", + "deps-stop": "bin/deps-stop.sh" } }, - "node_modules/qrcode.react": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", - "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" } }, - "node_modules/qs": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "path-type": "^4.0.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/dompurify": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.2.tgz", + "integrity": "sha512-hLGGBI1tw5N8qTELr3blKjAML/LY4ANxksbS612UiJyDfyf/2D092Pvm+S7pmeTGJRqvlJkFzBoHBQKgQlOQVg==", + "license": "(MPL-2.0 OR Apache-2.0)" }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { - "performance-now": "^2.1.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "dev": true + "node_modules/electron-to-chromium": { + "version": "1.5.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", + "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==", + "dev": true, + "license": "ISC" }, - "node_modules/ramda": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", - "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" + "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/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/raw-body/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==", + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "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" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "es-errors": "^1.3.0" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/rc-cascader": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.30.0.tgz", - "integrity": "sha512-rrzSbk1Bdqbu+pDwiLCLHu72+lwX9BZ28+JKzoi0DWZ4N29QYFeip8Gctl33QVd2Xg3Rf14D3yAOG76ElJw16w==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "classnames": "^2.3.1", - "rc-select": "~14.16.2", - "rc-tree": "~5.10.1", - "rc-util": "^5.43.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/rc-checkbox": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", - "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.3.2", - "rc-util": "^5.25.2" + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-collapse": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", - "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.3.4", - "rc-util": "^5.27.0" + "engines": { + "node": ">=18" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/rc-dialog": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", - "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/portal": "^1.0.0-8", - "classnames": "^2.2.6", - "rc-motion": "^2.3.0", - "rc-util": "^5.21.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/rc-drawer": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", - "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@rc-component/portal": "^1.1.1", - "classnames": "^2.2.6", - "rc-motion": "^2.6.1", - "rc-util": "^5.38.1" + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rc-dropdown": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", - "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "node_modules/eslint": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", + "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.3", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.6", - "rc-util": "^5.44.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "9.21.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" }, - "peerDependencies": { - "react": ">=16.11.0", - "react-dom": ">=16.11.0" - } - }, - "node_modules/rc-field-form": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", - "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", - "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/async-validator": "^5.0.3", - "rc-util": "^5.32.2" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=8.x" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-image": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz", - "integrity": "sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@rc-component/portal": "^1.0.2", - "classnames": "^2.2.6", - "rc-dialog": "~9.6.0", - "rc-motion": "^2.6.2", - "rc-util": "^5.34.1" + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc-input": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.4.tgz", - "integrity": "sha512-lBZhfRD4NSAUW0zOKLUeI6GJuXkxeZYi0hr8VcJgJpyTNOvHw1ysrKWAHcEOAAHj7guxgmWYSi6xWrEdfrSAsA==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.18.1" + "jiti": "*" }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/rc-input-number": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.3.0.tgz", - "integrity": "sha512-JQ363ywqRyxwgVxpg2z2kja3CehTpYdqR7emJ/6yJjRdbvo+RvfE83fcpBCIJRq3zLp8SakmEXq60qzWyZ7Usw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/mini-decimal": "^1.0.1", - "classnames": "^2.2.5", - "rc-input": "~1.6.0", - "rc-util": "^5.40.1" + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/rc-mentions": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.17.0.tgz", - "integrity": "sha512-sfHy+qLvc+p8jx8GUsujZWXDOIlIimp6YQz7N5ONQ6bHsa2kyG+BLa5k2wuxgebBbH97is33wxiyq5UkiXRpHA==", - "dependencies": { - "@babel/runtime": "^7.22.5", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.6", - "rc-input": "~1.6.0", - "rc-menu": "~9.16.0", - "rc-textarea": "~1.8.0", - "rc-util": "^5.34.1" - }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "eslint": ">=8.40" } }, - "node_modules/rc-menu": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.0.tgz", - "integrity": "sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==", + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^2.0.0", - "classnames": "2.x", - "rc-motion": "^2.4.3", - "rc-overflow": "^1.3.1", - "rc-util": "^5.27.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/rc-motion": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", - "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-util": "^5.44.0" + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/rc-notification": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.2.tgz", - "integrity": "sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.9.0", - "rc-util": "^5.20.1" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=8.x" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/rc-overflow": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", - "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.37.0" + "estraverse": "^5.1.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">=0.10" } }, - "node_modules/rc-pagination": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.0.0.tgz", - "integrity": "sha512-QjrPvbAQwps93iluvFM62AEYglGYhWW2q/nliQqmvkTi4PXP4HHoh00iC1Sa5LLVmtWQHmG73fBi2x6H6vFHRg==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" + "estraverse": "^5.2.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">=4.0" } }, - "node_modules/rc-picker": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.8.3.tgz", - "integrity": "sha512-hJ45qoEs4mfxXPAJdp1n3sKwADul874Cd0/HwnsEOE60H+tgiJUGgbOD62As3EG/rFVNS5AWRfBCDJJfmRqOVQ==", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.2.1", - "rc-overflow": "^1.3.2", - "rc-resize-observer": "^1.4.0", - "rc-util": "^5.43.0" - }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "date-fns": ">= 2.x", - "dayjs": ">= 1.x", - "luxon": ">= 3.x", - "moment": ">= 2.x", - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - } + "node": ">=4.0" } }, - "node_modules/rc-progress": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", - "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.6", - "rc-util": "^5.16.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/rc-rate": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", - "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.0.1" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=8.x" + "node": ">=10" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/rc-resize-observer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", - "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "classnames": "^2.2.1", - "rc-util": "^5.44.1", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } + "node_modules/exifr": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", + "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==", + "license": "MIT" }, - "node_modules/rc-segmented": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.5.0.tgz", - "integrity": "sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==", - "dependencies": { - "@babel/runtime": "^7.11.1", - "classnames": "^2.2.1", - "rc-motion": "^2.4.4", - "rc-util": "^5.17.0" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, - "node_modules/rc-select": { - "version": "14.16.4", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.4.tgz", - "integrity": "sha512-jP6qf7+vjnxGvPpfPWbGYfFlSl3h8L2XcD4O7g2GYXmEeBC0mw+nPD7i++OOE8v3YGqP8xtYjRKAWCMLfjgxlw==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^2.1.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-overflow": "^1.3.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.5.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "node": ">=8.6.0" } }, - "node_modules/rc-slider": { - "version": "11.1.7", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.7.tgz", - "integrity": "sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.5", - "rc-util": "^5.36.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "node": ">= 6" } }, - "node_modules/rc-steps": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", - "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", - "dependencies": { - "@babel/runtime": "^7.16.7", - "classnames": "^2.2.3", - "rc-util": "^5.16.1" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" }, - "node_modules/rc-switch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", - "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "classnames": "^2.2.1", - "rc-util": "^5.30.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, - "node_modules/rc-table": { - "version": "7.49.0", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.49.0.tgz", - "integrity": "sha512-/FoPLX94muAQOxVpi1jhnpKjOIqUbT81eELQPAzSXOke4ky4oCWYUXOcVpL31ZCO90xScwVSXRd7coqtgtB1Ng==", + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "license": "ISC", "dependencies": { - "@babel/runtime": "^7.10.1", - "@rc-component/context": "^1.4.0", - "classnames": "^2.2.5", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.41.0", - "rc-virtual-list": "^3.14.2" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "reusify": "^1.0.4" } }, - "node_modules/rc-tabs": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.4.0.tgz", - "integrity": "sha512-llKuyiAVqmXm2z7OrmhX5cNb2ueZaL8ZyA2P4R+6/72NYYcbEgOXibwHiQCFY2RiN3swXl53SIABi2CumUS02g==", + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.11.2", - "classnames": "2.x", - "rc-dropdown": "~4.2.0", - "rc-menu": "~9.16.0", - "rc-motion": "^2.6.2", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.34.1" - }, - "engines": { - "node": ">=8.x" + "format": "^0.2.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/rc-textarea": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.2.tgz", - "integrity": "sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-input": "~1.6.0", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.27.0" + "flat-cache": "^4.0.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/rc-tooltip": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.1.tgz", - "integrity": "sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.11.2", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.1" + "to-regex-range": "^5.0.1" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "engines": { + "node": ">=8" } }, - "node_modules/rc-tree": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.10.1.tgz", - "integrity": "sha512-FPXb3tT/u39mgjr6JNlHaUTYfHkVGW56XaGDahDpEFLGsnPxGcVLNTjcqoQb/GNbSCycl7tD7EvIymwOTP0+Yw==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "2.x", - "rc-motion": "^2.0.1", - "rc-util": "^5.16.1", - "rc-virtual-list": "^3.5.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=10.x" + "node": ">=10" }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rc-tree-select": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.24.5.tgz", - "integrity": "sha512-PnyR8LZJWaiEFw0SHRqo4MNQWyyZsyMs8eNmo68uXZWjxc7QqeWcjPPoONN0rc90c3HZqGF9z+Roz+GLzY5GXA==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "classnames": "2.x", - "rc-select": "~14.16.2", - "rc-tree": "~5.10.1", - "rc-util": "^5.43.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "engines": { + "node": ">=16" } }, - "node_modules/rc-upload": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz", - "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "classnames": "^2.2.5", - "rc-util": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, - "node_modules/rc-util": { - "version": "5.44.3", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.3.tgz", - "integrity": "sha512-q6KCcOFk3rv/zD3MckhJteZxb0VjAIFuf622B7ElK4vfrZdAzs16XR5p3VTdy3+U5jfJU5ACz4QnhLSuAGe5dA==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^18.2.0" + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/rc-util/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==" - }, - "node_modules/rc-virtual-list": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.16.1.tgz", - "integrity": "sha512-algM5UsB7vrlPNr9lsZEH8s9KHkP8XbT/Y0qylyPkiM8mIOlSJLjBNADcmbYPEQCm4zW82mZRJuVHNzqqN0EAQ==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.0", - "classnames": "^2.2.6", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.36.0" + "is-callable": "^1.2.7" }, "engines": { - "node": ">=8.x" + "node": ">= 0.4" }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "engines": { - "node": ">=14" + "node": ">=0.4.x" } }, - "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "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/react-color": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", - "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", - "dependencies": { - "@icons/material": "^0.2.4", - "lodash": "^4.17.15", - "lodash-es": "^4.17.15", - "material-colors": "^1.2.1", - "prop-types": "^15.5.10", - "reactcss": "^1.2.0", - "tinycolor2": "^1.4.1" - }, - "peerDependencies": { - "react": "*" + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "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": ">= 12.13.0" + "node": ">=6" } }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "pump": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { - "p-limit": "^3.0.2" + "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": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "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==" - }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-hotkeys-hook": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.5.0.tgz", - "integrity": "sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==", - "peerDependencies": { - "react": ">=16.8.1", - "react-dom": ">=16.8.1" - } - }, - "node_modules/react-icons": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", - "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-infinite-scroller": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/react-infinite-scroller/-/react-infinite-scroller-1.2.6.tgz", - "integrity": "sha512-mGdMyOD00YArJ1S1F3TVU9y4fGSfVVl6p5gh/Vt4u99CJOptfVu/q5V/Wlle72TMgYlBwIhbxK5wF0C/R33PXQ==", - "dependencies": { - "prop-types": "^15.5.8" - }, - "peerDependencies": { - "react": "^0.14.9 || ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "url": "https://github.com/sponsors/isaacs" } }, - "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==" - }, - "node_modules/react-masonry-infinite": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/react-masonry-infinite/-/react-masonry-infinite-1.2.2.tgz", - "integrity": "sha512-mUr0NRzeec9fnwkS513pOsBmMOOZe2YxVuE9HbKjgO0RKp6cFgtUBCEn8wZiiOrmdTiGe8Kx9T8QufJZmhNBxw==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", "dependencies": { - "bricks.js": "^1.7.0", - "prop-types": "^15.5.10", - "react-infinite-scroller": "^1.0.12" + "is-glob": "^4.0.3" }, - "peerDependencies": { - "react": ">= 0.14.0" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/react-paginate": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.2.0.tgz", - "integrity": "sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw==", + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", "dependencies": { - "prop-types": "^15" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18" + "min-document": "^2.19.0", + "process": "^0.11.10" } }, - "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==", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-redux/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==" - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/react-router": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz", - "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==", - "dependencies": { - "@remix-run/router": "1.21.0" - }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "react": ">=16.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-router-dom": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz", - "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==", - "dependencies": { - "@remix-run/router": "1.21.0", - "react-router": "6.28.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, - "node_modules/react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" }, - "node_modules/react-scripts/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-scripts/node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "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": ">=10" + "node": ">=8" } }, - "node_modules/react-scripts/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-scripts/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-scripts/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=10" - } - }, - "node_modules/react-scripts/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/react-side-effect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-test-renderer": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", - "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" + "function-bind": "^1.1.2" }, - "peerDependencies": { - "react": "^16.14.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/react-test-renderer/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" } }, - "node_modules/reactcss": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", - "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", - "dependencies": { - "lodash": "^4.0.1" - } + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=0.8.19" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } }, - "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==", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.4" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", "dependencies": { - "minimatch": "^3.0.5" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "dependencies": { - "esprima": "~4.0.0" - } + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, - "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==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/redux-devtools-extension": { - "version": "2.13.9", - "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", - "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", - "deprecated": "Package moved to @redux-devtools/extension.", - "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/redux-mock-store": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.5.tgz", - "integrity": "sha512-YxX+ofKUTQkZE4HbhYG4kKGr7oCTJfB0GLy7bSeqx86GLpGirrbUWstMnqXkqHNaQpcnbMGbof2dYs5KsPE6Zg==", - "dev": true, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", "dependencies": { - "lodash.isplainobject": "^4.0.6" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, - "peerDependencies": { - "redux": "*" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "peerDependencies": { - "redux": "^4" + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "which-builtin-type": "^1.2.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -25325,66 +7711,63 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reflect.ownkeys": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-1.1.4.tgz", - "integrity": "sha512-iUNmtLgzudssL+qnTUosCmnq3eczlrVd1wXrgx/GhiI/8FvwrTYWtCJ9PNvWIRX+4ftupj2WUfB5mu5s9t6LnA==", - "dev": true, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "globalthis": "^1.0.3" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dependencies": { - "regenerate": "^1.4.2" - }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "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==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" + "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/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "license": "MIT" }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" + "is-extglob": "^2.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -25392,205 +7775,186 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=0.12.0" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", "dependencies": { - "jsesc": "~3.0.2" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "bin": { - "jsesc": "bin/jsesc" - }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "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/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/is-shallow-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz", + "integrity": "sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==", + "license": "MIT" + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">= 4" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-from-string": { + "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -25599,1640 +7963,1802 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-dir/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/resolve-dir/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "json-buffer": "3.0.1" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } + "node_modules/knot.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/knot.js/-/knot.js-1.1.5.tgz", + "integrity": "sha512-ptGtvTrgLNtQj9ilUR+tSyHWTCPp2xu/EHkeo3OvpczzNqBSwjQKz8G7vUhzlRbasXVULBWSejsj6QRQb1pakw==", + "license": "MIT" }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { - "global-dirs": "^0.1.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=8.9" + "node": ">= 12.0.0" }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "url": "https://opencollective.com/parcel" } }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "bin": { - "rimraf": "bin.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "bin": { - "rollup": "dist/bin/rollup" - }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10.0.0" + "node": ">= 12.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" + "uc.micro": "^2.0.0" } }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/linkifyjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", + "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } + "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/rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, - "node_modules/rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, + "license": "MIT" + }, + "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": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "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==", + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "engines": { - "node": ">=0.12.0" + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/lowlight": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-2.9.0.tgz", + "integrity": "sha512-OpcaUTCLmHuVuBcyNckKfH5B0oA4JUavb/M/8n9iAvanJYNQkrVm4pvyX0SUaqkBG4dnWHKt7p50B3ngAG2Rfw==", + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "@types/hast": "^2.0.0", + "fault": "^2.0.0", + "highlight.js": "~11.8.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowlight/node_modules/highlight.js": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", + "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.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==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { - "tslib": "^2.1.0" + "yallist": "^3.0.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/lucide-react": { + "version": "0.475.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", + "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.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", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "node_modules/material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "license": "MIT", "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.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", - "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 - } + "map-or-similar": "^1.5.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "xmlchars": "^2.2.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=10" + "node": ">=8.6" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "license": "ISC", "dependencies": { - "loose-envify": "^1.1.0" + "wildcard": "^1.1.0" } }, - "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.6" } }, - "node_modules/scroll-into-view-if-needed": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", - "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", - "dependencies": { - "compute-scroll-into-view": "^3.0.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/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release": { - "version": "17.4.7", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.7.tgz", - "integrity": "sha512-3Ghu8mKCJgCG3QzE5xphkYWM19lGE3XjFdOXQIKBM2PBpBvgFQ/lXv31oX0+fuN/UjNFO/dqhNs8ATLBhg6zBg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^8.0.0", - "@semantic-release/error": "^2.2.0", - "@semantic-release/github": "^7.0.0", - "@semantic-release/npm": "^7.0.0", - "@semantic-release/release-notes-generator": "^9.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^2.0.0", - "marked-terminal": "^4.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "semantic-release": "bin/semantic-release.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=10.19" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/semantic-release/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "license": "MIT" + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/semantic-release/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/semantic-release/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "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" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "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-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">= 0.4" } }, - "node_modules/semantic-release/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, + "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" + }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "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" + "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": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node": ">= 0.8.0" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^6.3.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "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" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/p-queue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "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" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "node": ">=14.16" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "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" + "@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": ">= 0.4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "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": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 0.4" - }, + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.26.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.2.tgz", + "integrity": "sha512-0gNmv4qpS9HaN3+40CLBAnKe0ZfyE4ZWo5xKlC1rVrr0ckkEvJvAQqKaHANdFKsGstoxrY4AItZ7kZSGVoVjgg==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "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==" + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, + "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": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", + "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "prosemirror-transform": "^1.0.0" } }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "prosemirror-state": "^1.0.0" } }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/prosemirror-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.0.tgz", + "integrity": "sha512-6toodS4R/Aah5pdsrIwnTYPEjW70SlO5a66oo5Kk+CIrgJz3ukOoS+FYDGqvQlAX5PxoGWDX1oD++tn5X3pyRA==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" } }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", + "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } }, - "node_modules/signale/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==", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" } }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" } }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" } }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", + "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "node_modules/prosemirror-markdown": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", + "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.20.0" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, + "node_modules/prosemirror-model": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz", + "integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" + "orderedmap": "^2.0.0" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "node_modules/prosemirror-schema-basic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", + "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", + "license": "MIT", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "prosemirror-model": "^1.19.0" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" + "node_modules/prosemirror-tables": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.4.tgz", + "integrity": "sha512-TkDY3Gw52gRFRfRn2f4wJv5WOgAOXLJA2CQJYIJ5+kdFbfj3acR4JUW6LX2e1hiEBiUwvEhzH5a3cZ5YSztpIA==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.24.1", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.2" } }, - "node_modules/source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "license": "MIT", "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" }, "peerDependencies": { - "webpack": "^5.0.0" + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "node_modules/prosemirror-transform": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.3.tgz", + "integrity": "sha512-Nhh/+1kZGRINbEHmVu39oynhcap4hWTs/BlU7NnxWj3+l0qi8I1mu67v6mMdEe/ltD8hHvU4FV6PHiCw2VSpMw==", + "license": "MIT", "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "prosemirror-model": "^1.21.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/prosemirror-view": { + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.38.1.tgz", + "integrity": "sha512-4FH/uM1A4PNyrxXbD+RAbAsf0d/mM0D/wAKSVVWK7o0A9Q/oOXJBrw786mBf2Vnrs/Edly6dH6Z2gsb7zWwaUw==", + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "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" - }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=6" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "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/qrcode.react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", + "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "through": "2" + "side-channel": "^1.1.0" }, "engines": { - "node": "*" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "node_modules/ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "react": "*" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "node_modules/react-dayjs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/react-dayjs/-/react-dayjs-0.3.2.tgz", + "integrity": "sha512-N9ozA6KNunzvnhwRbDi0JTa1Ine8AWQxNQ1u6sPugBenpl2mXMf0c5nOxBcs8id0z9kaKVlF2NOYzWGMoEzelg==", + "license": "MIT", "dependencies": { - "escodegen": "^1.8.1" + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "dayjs": "^1.5.16", + "react": "^15.6.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" + "scheduler": "^0.25.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "peerDependencies": { + "react": "^19.0.0" } }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } + "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/static-eval/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" }, - "engines": { - "node": ">= 0.8.0" + "peerDependencies": { + "react": ">=16.3.0" } }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "node_modules/react-helmet/node_modules/react-side-effect": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/react-hook-form": { + "version": "7.54.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", + "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "node_modules/react-hotkeys-hook": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.5.0.tgz", + "integrity": "sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.1", + "react-dom": ">=16.8.1" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" + "node_modules/react-icons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "license": "MIT", + "peerDependencies": { + "react": "*" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "node_modules/react-infinite-scroller": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-infinite-scroller/-/react-infinite-scroller-1.2.6.tgz", + "integrity": "sha512-mGdMyOD00YArJ1S1F3TVU9y4fGSfVVl6p5gh/Vt4u99CJOptfVu/q5V/Wlle72TMgYlBwIhbxK5wF0C/R33PXQ==", + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "prop-types": "^15.5.8" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/store2": { - "version": "2.14.3", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", - "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==" + "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/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, + "node_modules/react-masonry-infinite": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/react-masonry-infinite/-/react-masonry-infinite-1.2.2.tgz", + "integrity": "sha512-mUr0NRzeec9fnwkS513pOsBmMOOZe2YxVuE9HbKjgO0RKp6cFgtUBCEn8wZiiOrmdTiGe8Kx9T8QufJZmhNBxw==", + "license": "MIT", "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "bricks.js": "^1.7.0", + "prop-types": "^15.5.10", + "react-infinite-scroller": "^1.0.12" + }, + "peerDependencies": { + "react": ">= 0.14.0" } }, - "node_modules/stream-combiner2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/stream-combiner2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, + "node_modules/react-paginate": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.2.0.tgz", + "integrity": "sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw==", + "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" + "prop-types": "^15" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18" } }, - "node_modules/stream-combiner2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/stream-combiner2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "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": { - "safe-buffer": "~5.1.0" + "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/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==", + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } } }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6.19" + "node": ">=0.10.0" } }, - "node_modules/string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/react-remove-scroll": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" }, "engines": { "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "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==", + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/string-width-cjs": { - "name": "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==", + "node_modules/react-router": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.2.0.tgz", + "integrity": "sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" }, "engines": { - "node": ">=8" + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } } }, - "node_modules/string-width-cjs/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==" - }, - "node_modules/string-width/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==" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "node_modules/react-router-dom": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.2.0.tgz", + "integrity": "sha512-cU7lTxETGtQRQbafJubvZKHEn5izNABxZhBY0Jlzdv0gqQhCPQt2J8aN5ZPjS6mQOXn5NnirWNh+FpE8TTYN0Q==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" + "react-router": "7.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "node_modules/reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "lodash": "^4.0.1" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "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/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -27241,244 +9767,308 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" }, - "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==", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/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==", - "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-bom": { + "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { - "node": ">=6" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { - "min-indent": "^1.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "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": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">= 0.4" } }, - "node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "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": ">=16 || 14 >=14.17" + "node": ">= 0.4" } }, - "node_modules/sucrase/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==", + "node_modules/shallow-equal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz", + "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -27486,317 +10076,179 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "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/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" + "node": ">=8" } }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/svgo/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" + "node_modules/sonner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.3.tgz", + "integrity": "sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/svgo/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "node_modules/sort-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "is-plain-obj": "^2.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/svgo/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==", - "engines": { - "node": ">=0.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/svgo/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" }, - "node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/swr": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz", - "integrity": "sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "license": "CC0-1.0" }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "node": ">= 0.4" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } + "node_modules/store2": { + "version": "2.14.4", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.4.tgz", + "integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==", + "license": "MIT" }, - "node_modules/telejson": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", - "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "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": { - "@types/is-function": "^1.0.0", - "global": "^4.4.0", - "is-function": "^1.0.2", - "is-regex": "^1.1.2", - "is-symbol": "^1.0.3", - "isobject": "^4.0.0", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, + "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": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -27804,174 +10256,146 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "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": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { - "node": ">= 10.13.0" + "node": ">= 0.4" }, "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/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "dev": true, - "engines": { - "node": ">=0.10" + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.2.tgz", + "integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "node_modules/tailwindcss": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.17.tgz", + "integrity": "sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==", + "license": "MIT" }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=6" } }, - "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + "node_modules/telejson": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", + "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "license": "MIT", + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } }, - "node_modules/throttle-debounce": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", - "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", "engines": { - "node": ">=12.22" + "node": ">=8" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, + "node_modules/tempy": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.5.0.tgz", + "integrity": "sha512-VEY96x7gbIRfsxqsafy2l5yVxxp3PhwAGoWMyC2D2Zt5DmEv+2tGiPOrquNRpf21hhGnKLVEsuqleqiZmKG/qw==", + "license": "MIT", "dependencies": { - "readable-stream": "3" + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.12.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "node_modules/tempy/node_modules/type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "license": "MIT", "dependencies": { "@popperjs/core": "^2.9.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -27979,149 +10403,46 @@ "node": ">=8.0" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "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", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", "engines": { "node": ">=6.10" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "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", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -28129,209 +10450,69 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.17" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/typescript-eslint": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", + "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "@typescript-eslint/eslint-plugin": "8.24.1", + "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/utils": "8.24.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" - }, - "node_modules/undici": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", - "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", - "dev": true, - "engines": { - "node": ">=18.17" - } + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "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.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -28339,47 +10520,11 @@ "node": ">=8" } }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -28394,9 +10539,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -28409,35 +10555,60 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/use-sync-external-store": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -28445,496 +10616,139 @@ "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==" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vary": { + "node_modules/vaul": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wait-for-expect": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz", - "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==" - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "@radix-ui/react-dialog": "^1.1.1" }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/vite": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", "dev": true, + "license": "MIT", "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "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-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "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", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "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" + "esbuild": "^0.24.2", + "postcss": "^8.5.2", + "rollup": "^4.30.1" }, "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "vite": "bin/vite.js" }, "engines": { - "node": ">= 12.13.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.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/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/webpack-dev-server/node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "url": "https://github.com/vitejs/vite?sponsor=1" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "bufferutil": { + "@types/node": { "optional": true }, - "utf-8-validate": { + "jiti": { "optional": true - } - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "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/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "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", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "node_modules/vite-plugin-svgr": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", + "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", "dev": true, + "license": "MIT", "dependencies": { - "iconv-lite": "0.6.3" + "@rollup/pluginutils": "^5.1.3", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "vite": ">=2.6.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "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": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" + "loose-envify": "^1.0.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -28949,6 +10763,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -28963,36 +10778,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -29006,25 +10796,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/which-typed-array": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -29043,487 +10819,53 @@ "node_modules/wildcard": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", - "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", + "license": "MIT" }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "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/workbox-build/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-build/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" - }, - "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", - "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "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/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/studio/package.json b/studio/package.json index 7e2bfc2af..ba4d59681 100644 --- a/studio/package.json +++ b/studio/package.json @@ -1,130 +1,99 @@ { - "name": "gateway", - "version": "0.3.0", - "description": "UI for dega-admin", + "name": "studio-shadcn", "private": true, - "license": "MIT", - "cacheDirectories": [ - "node_modules" - ], + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, "dependencies": { - "@ant-design/icons": "^4.2.1", - "@ant-design/pro-layout": "^7.2.6", - "@editorjs/editorjs": "^2.18.0", - "@editorjs/header": "^2.5.0", - "@editorjs/list": "^1.5.0", - "@editorjs/paragraph": "^2.7.0", - "@editorjs/quote": "^2.3.0", - "@editorjs/raw": "^2.1.2", - "@editorjs/table": "^1.2.2", - "@factly/scooter-claim": "^0.0.45", - "@factly/scooter-code-block": "^0.0.45", - "@factly/scooter-core": "^0.0.45", - "@factly/scooter-embed": "^0.0.45", - "@factly/scooter-table": "^0.0.45", - "@monaco-editor/react": "4.4.6", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.5.0", - "@testing-library/user-event": "^7.2.1", - "@uppy/google-drive": "^3.5.0", - "@uppy/image-editor": "^2.4.0", - "ajv": "^8.17.1", - "antd": "^5.0.4", - "axios": "^0.21.1", - "dayjs": "^1.11.6", - "deep-equal": "^2.0.3", - "dotenv": "^16.4.5", - "jest-sonar-reporter": "^2.0.0", - "monaco-editor": "^0.25.2", - "playwright": "^1.44.1", + "@factly/scooter-claim": "^0.0.48", + "@factly/scooter-code-block": "^0.0.48", + "@factly/scooter-core": "^0.0.48", + "@factly/scooter-embed": "^0.0.48", + "@factly/scooter-table": "^0.0.48", + "@hookform/resolvers": "^4.1.0", + "@monaco-editor/react": "^4.7.0", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-tooltip": "^1.1.8", + "@redux-devtools/extension": "^3.3.0", + "@reduxjs/toolkit": "^2.5.1", + "@tailwindcss/vite": "^4.0.17", + "@uppy/aws-s3": "^4.2.3", + "@uppy/core": "^4.4.2", + "@uppy/dashboard": "^4.3.2", + "@uppy/drag-drop": "^4.1.1", + "@uppy/file-input": "^4.1.1", + "@uppy/google-drive": "^4.3.1", + "@uppy/image-editor": "^3.3.1", + "@uppy/progress-bar": "^4.2.1", + "@uppy/react": "^4.2.1", + "@uppy/url": "^4.2.2", + "axios": "^1.7.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "date-fns": "^4.1.0", + "dayjs": "^1.11.13", + "deep-equal": "^2.2.3", + "deps": "^1.0.0", + "lucide-react": "^0.475.0", + "next-themes": "^0.4.6", "qrcode.react": "^4.2.0", - "react": "^18.2.0", + "react": "^19.0.0", "react-color": "^2.19.3", - "react-dom": "^18.2.0", + "react-day-picker": "^8.10.1", + "react-dayjs": "^0.3.2", + "react-dom": "^19.0.0", "react-helmet": "^6.1.0", - "react-redux": "^7.2.0", - "react-router-dom": "^6.9.0", - "react-scripts": "^5.0.1", - "redux": "^4.0.5", - "redux-devtools-extension": "^2.13.8", - "redux-thunk": "^2.3.0" - }, - "engines": { - "node": ">=18" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged", - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", - "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true" - } - }, - "lint-staged": { - "**/*.{js,jsx,yml,yaml,json,css,scss,md}": [ - "npm run format", - "git add" - ] - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "test:watch": "npm test -- --watch", - "test:coverage": "npm test -- --coverage", - "eject": "react-scripts eject", - "format:check": "prettier --check \"**/*.{js,jsx,yml,yaml,json,css,scss,md}\"", - "format": "prettier --write \"**/*.{js,jsx,yml,yaml,json,css,scss,md}\"" - }, - "eslintConfig": { - "extends": [ - "react-app" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] + "react-hook-form": "^7.54.2", + "react-redux": "^9.2.0", + "react-router-dom": "^7.1.5", + "redux": "^5.0.1", + "reselect": "^5.1.1", + "sonner": "^2.0.3", + "tailwind-merge": "^3.0.1", + "tailwindcss": "^4.0.17", + "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", + "zod": "^3.24.2" }, "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@commitlint/cli": "^9.1.1", - "@commitlint/config-conventional": "^9.1.1", - "@editorjs/code": "^2.6.0", - "@editorjs/delimiter": "^1.2.0", - "@editorjs/inline-code": "^1.3.1", - "@editorjs/marker": "^1.2.2", - "@playwright/test": "^1.44.1", - "cz-conventional-changelog": "^3.3.0", - "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.2", - "enzyme-to-json": "^3.5.0", - "eslint": "^8.46.0", - "husky": "^4.2.5", - "lint-staged": "^10.2.11", - "prettier": "2.0.5", - "react-test-renderer": "^16.13.1", - "redux-mock-store": "^1.5.4", - "semantic-release": "^17.1.1" - }, - "jest": { - "snapshotSerializers": [ - "enzyme-to-json/serializer" - ], - "collectCoverageFrom": [ - "src/**/*.js", - "!src/index.js" - ] - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } + "@eslint/js": "^9.19.0", + "@types/deep-equal": "^1.0.4", + "@types/node": "^22.13.4", + "@types/qrcode.react": "^1.0.5", + "@types/react": "^19.0.10", + "@types/react-color": "^3.0.13", + "@types/react-dom": "^19.0.3", + "@types/react-helmet": "^6.1.11", + "@types/tailwindcss": "^3.0.11", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.19.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.18", + "globals": "^15.14.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.22.0", + "vite": "^6.1.0", + "vite-plugin-svgr": "^4.3.0" } } diff --git a/studio/public/config.js b/studio/public/config.js deleted file mode 100644 index a93608866..000000000 --- a/studio/public/config.js +++ /dev/null @@ -1,16 +0,0 @@ -window.REACT_APP_KRATOS_PUBLIC_URL = 'http://127.0.0.1:4455/.ory/kratos/public'; -window.REACT_APP_API_URL = 'http://127.0.0.1:7789'; -window.REACT_APP_COMPANION_URL = 'http://127.0.0.1:3020'; -window.PUBLIC_URL = 'http://localhost:3000'; -window.REACT_APP_SACH_API_URL = 'https://sach-server.factly.in'; -window.REACT_APP_IFRAMELY_URL = 'http://127.0.0.1:4455/.factly/dega/server/meta'; -window.REACT_APP_ENABLE_IMGPROXY = true; -window.REACT_APP_ZITADEL_AUTHORITY = 'https://develop-xtjn2g.zitadel.cloud'; -window.REACT_APP_ZITADEL_CLIENT_ID = '268579887244192475@kavach'; -window.REACT_APP_ZITADEL_REDIRECT_URI = 'http://localhost:3000/redirect'; -window.REACT_APP_ZITADEL_POST_LOGOUT_REDIRECT_URI = 'http://localhost:3000'; -window.REACT_APP_ZITADEL_PROJECT_ID = '268579264306114801'; -window.REACT_APP_ZITADEL_PAT = - 'RqnMpiB5WpmLV3VaP13-QAu31JF72LLo3yxM0RaNQbQX_pY8mG8SDKRovwyD0eATmDOycfc'; -window.REACT_APP_ZITADEL_IDP_ID = '282701719060623464'; -window.DEGA_PUBLIC_URL = 'http://localhost:7789'; diff --git a/studio/public/favicon.ico b/studio/public/favicon.ico deleted file mode 100644 index 3006a3acb..000000000 Binary files a/studio/public/favicon.ico and /dev/null differ diff --git a/studio/public/index.html b/studio/public/index.html deleted file mode 100644 index 686cc04ff..000000000 --- a/studio/public/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - Dega Studio - - - - -
- - - diff --git a/studio/public/logo192.png b/studio/public/logo192.png deleted file mode 100644 index b0324c90f..000000000 Binary files a/studio/public/logo192.png and /dev/null differ diff --git a/studio/public/logo512.png b/studio/public/logo512.png deleted file mode 100644 index 52ce8036d..000000000 Binary files a/studio/public/logo512.png and /dev/null differ diff --git a/studio/public/manifest.json b/studio/public/manifest.json deleted file mode 100644 index 2591013e0..000000000 --- a/studio/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "dega.png", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "dega.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "dega.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/studio/public/robots.txt b/studio/public/robots.txt deleted file mode 100644 index 9450c3efc..000000000 --- a/studio/public/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: - diff --git a/studio/release.config.js b/studio/release.config.js deleted file mode 100644 index 29f88e1b8..000000000 --- a/studio/release.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - branches: 'master', - repositoryUrl: 'https://github.com/factly/dega-studio', - plugins: [ - '@semantic-release/commit-analyzer', - '@semantic-release/release-notes-generator', - '@semantic-release/github', - ], -}; diff --git a/studio/sonar-project.properties b/studio/sonar-project.properties deleted file mode 100644 index fb3a8a6ac..000000000 --- a/studio/sonar-project.properties +++ /dev/null @@ -1,13 +0,0 @@ -sonar.organization=factly -sonar.projectKey=factly_dega_studio -sonar.projectName=factly_dega_studio - -sonar.sources=src/ -sonar.exclusions=src/__tests__/**/*.js - -sonar.tests=src/__tests__/ -sonar.test.inclusions=src/**/*.test.js - -sonar.javascript.lcov.reportPaths=coverage/lcov.info - -sonar.sourceEncoding=UTF-8 diff --git a/studio/src/App.css b/studio/src/App.css index 86d1e2810..813134ac8 100644 --- a/studio/src/App.css +++ b/studio/src/App.css @@ -1,16 +1,23 @@ -.ant-form { - max-width: 100%; +body.modal-open::before { + content: ""; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.3); + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + z-index: 9000; + pointer-events: none; } - -.search-box-hide { - opacity: 0 !important; - width: 0 !important; - height: 0 !important; - transition: all 0s ease-in-out; +body.modal-open .fixed { + position: relative; + z-index: auto !important; } -.search-box-expand { - width: 100%; - height: auto; - transition: all 0.5s ease-in-out; +body.modal-open .z-\[9999\] { + position: fixed; + z-index: 9999 !important; } + diff --git a/studio/src/App.js b/studio/src/App.js deleted file mode 100644 index 997805eed..000000000 --- a/studio/src/App.js +++ /dev/null @@ -1,53 +0,0 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -import React, { useEffect, useState } from 'react'; -import './App.css'; -import { createBrowserRouter, RouterProvider } from 'react-router-dom'; -import 'antd/dist/reset.css'; -import { extractV6RouteObject } from './config/routesConfig'; -import { useDispatch, useSelector } from 'react-redux'; -import { getFormats } from '../src/actions/formats'; -import deepEqual from 'deep-equal'; - -function App() { - const [reloadFlag, setReloadFlag] = useState(false); - const dispatch = useDispatch(); - - const { formats, selected, session } = useSelector(({ formats, spaces, session }) => { - const node = formats.req.find((item) => { - return deepEqual(item.query, { space_id: spaces.selected }); - }); - if (node) { - const formatDetails = node.data.map((element) => formats.details[element]); - const article = formatDetails.find((format) => format.slug === 'article'); - const factcheck = formatDetails.find((format) => format.slug === 'fact-check'); - if (article || factcheck) { - const format = { - factcheck: factcheck, - article: article, - loading: formats.loading, - }; - return { formats: format, selected: spaces.selected, session }; - } - } - return { formats: { loading: formats.loading }, selected: spaces.selected, session }; - }); - - useEffect(() => { - fetchFormats(); - }, [dispatch, selected, reloadFlag]); - - const fetchFormats = () => { - if (selected !== '') dispatch(getFormats({ space_id: selected })); - }; - - const router = createBrowserRouter( - extractV6RouteObject(formats, setReloadFlag, reloadFlag, session), - ); - return ( -
- -
- ); -} - -export default App; diff --git a/studio/src/App.tsx b/studio/src/App.tsx new file mode 100644 index 000000000..9bf5abcd3 --- /dev/null +++ b/studio/src/App.tsx @@ -0,0 +1,140 @@ +import { createBrowserRouter, RouterProvider } from "react-router-dom"; +import "./App.css"; +import { Notifications } from "./components/Notifications/Notifications"; +import { useEffect, useState, useRef } from "react"; +import { useSelector } from "react-redux"; +import { getFormats } from "./actions/formats"; +import deepEqual from "deep-equal"; +import { useAppDispatch } from "./hooks/reduxHooks"; +import { RootState } from "./types"; +import { extractV6RouteObject } from "./config/routesConfig"; + +function App() { + const [reloadFlag, setReloadFlag] = useState(false); + const dispatch = useAppDispatch(); + const formatsFetchedRef = useRef(false); + + // State to hold cached formats + const [cachedFormats, setCachedFormats] = useState(null); + + // Load cached formats from localStorage once on component mount + useEffect(() => { + try { + const savedFormats = localStorage.getItem("cachedFormats"); + if (savedFormats) { + const parsedFormats = JSON.parse(savedFormats); + setCachedFormats(parsedFormats); + } + } catch (error) { + console.error("Error loading cached formats:", error); + } + }, []); + + const { formats, selected, session } = useSelector((state: RootState) => { + const node = state.formats.req.find((item: any) => { + return deepEqual(item.query, { space_id: state.spaces.selected }); + }); + + let formatsData = { + loading: state.formats.loading, + hasAttemptedFetch: state.formats.hasAttemptedFetch, + }; + + if (node) { + const formatDetails = node.data.map( + (element: string) => state.formats.details[element] + ); + const article = formatDetails.find( + (format: any) => format.slug === "article" + ); + const factcheck = formatDetails.find( + (format: any) => format.slug === "fact-check" + ); + + if (article || factcheck) { + formatsData = { + factcheck: factcheck, + article: article, + loading: state.formats.loading, + hasAttemptedFetch: state.formats.hasAttemptedFetch, + }; + + // Update localStorage with latest format data whenever we have valid formats + try { + localStorage.setItem("cachedFormats", JSON.stringify(formatsData)); + } catch (error) { + console.error("Error saving cached formats:", error); + } + } + } + + // If there's no format data in Redux, but we have cached data, use that + if (!formatsData.article && !formatsData.factcheck && cachedFormats) { + if (cachedFormats.article || cachedFormats.factcheck) { + return { + formats: { + ...formatsData, + article: cachedFormats.article || null, + factcheck: cachedFormats.factcheck || null, + }, + selected: state.spaces.selected, + session: state.session, + }; + } + } + + return { + formats: formatsData, + selected: state.spaces.selected, + session: state.session, + }; + }); + + // Effect to fetch formats when selected space changes + useEffect(() => { + if (selected !== "") { + fetchFormats(); + } + }, [dispatch, selected, reloadFlag]); + + // Add a safety timeout to prevent infinite loading + useEffect(() => { + // If formats are still loading after 5 seconds, force set reloadFlag to trigger a refetch + let timeoutId: number; + + if (formats.loading && selected !== "") { + timeoutId = window.setTimeout(() => { + if (!formatsFetchedRef.current) { + console.log("Format loading timed out, triggering refetch"); + setReloadFlag((prev) => !prev); + } + }, 5000); + } + + return () => { + if (timeoutId) window.clearTimeout(timeoutId); + }; + }, [formats.loading, selected]); + + const fetchFormats = () => { + if (selected !== "") { + formatsFetchedRef.current = true; + dispatch(getFormats({ space_id: selected })); + } + }; + + // Extract routes using our function and pass necessary props + const routeObjects = extractV6RouteObject(formats, setReloadFlag, reloadFlag); + + // Create the router with these route objects + const router = createBrowserRouter(routeObjects); + + return ( + <> + + + + ); +} + +export default App; diff --git a/studio/src/__tests__/actions/authors.js b/studio/src/__tests__/actions/authors.js deleted file mode 100644 index d2411cb02..000000000 --- a/studio/src/__tests__/actions/authors.js +++ /dev/null @@ -1,143 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/authors'; -import * as types from '../../constants/authors'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, - total: 0, -}; - -describe('authors actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_AUTHORS_LOADING, - payload: true, - }; - expect(actions.loadingAuthors()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_AUTHORS_LOADING, - payload: false, - }; - expect(actions.stopAuthorsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add authors list', () => { - const data = [ - { id: 1, author: 'tester t' }, - { id: 2, author: 'testing 2' }, - ]; - - const addAuthorsAction = { - type: types.ADD_AUTHORS, - payload: data, - }; - expect(actions.addAuthorsList(data)).toEqual(addAuthorsAction); - }); - it('should create an action to add authors', () => { - const data = [ - { id: 1, author: 'tester t' }, - { id: 2, author: 'testing 2' }, - ]; - - const expectedActions = [ - { - type: types.ADD_AUTHORS, - payload: data, - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addAuthors(data)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create an action to add authors request', () => { - const data = [{ query: 'query' }]; - const addAuthorsRequestAction = { - type: types.ADD_AUTHORS_REQUEST, - payload: data, - }; - expect(actions.addAuthorsRequest(data)).toEqual(addAuthorsRequestAction); - }); - it('should create actions to fetch authors success', () => { - const query = { page: 1, limit: 5 }; - const authors = [{ id: 1, name: 'Author' }]; - const resp = { data: { nodes: authors, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_AUTHORS_LOADING, - payload: true, - }, - { - type: types.ADD_AUTHORS, - payload: authors, - }, - { - type: types.ADD_AUTHORS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_AUTHORS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getAuthors(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.AUTHORS_API, { - params: query, - }); - }); - it('should create actions to fetch authors failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_AUTHORS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_AUTHORS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getAuthors(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.AUTHORS_API, { - params: query, - }); - }); -}); diff --git a/studio/src/__tests__/actions/categories.js b/studio/src/__tests__/actions/categories.js deleted file mode 100644 index 3fdd9755b..000000000 --- a/studio/src/__tests__/actions/categories.js +++ /dev/null @@ -1,593 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/categories'; -import * as types from '../../constants/categories'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_MEDIA } from '../../constants/media'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, - total: 0, -}; - -describe('categories actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }; - expect(actions.loadingCategories()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }; - expect(actions.stopCategoriesLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add categories list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addCategoriesAction = { - type: types.ADD_CATEGORIES, - payload: data, - }; - expect(actions.addCategoriesList(data)).toEqual(addCategoriesAction); - }); - it('should create an action to add categories request', () => { - const data = [{ query: 'query' }]; - const addCategoriesRequestAction = { - type: types.ADD_CATEGORIES_REQUEST, - payload: data, - }; - expect(actions.addCategoriesRequest(data)).toEqual(addCategoriesRequestAction); - }); - it('should create an action to reset categories', () => { - const resetCategoriesRequestAction = { - type: types.RESET_CATEGORIES, - }; - expect(actions.resetCategories()).toEqual(resetCategoriesRequestAction); - }); - it('should create actions to fetch categories success', () => { - const query = { page: 1, limit: 5 }; - const categories = [{ id: 1, name: 'Category' }]; - const resp = { data: { nodes: categories, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CATEGORIES, - payload: [{ id: 1, name: 'Category', medium: undefined }], - }, - { - type: types.ADD_CATEGORIES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategories(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API, { - params: query, - }); - }); - it('should create actions to fetch categories success and not set loading', () => { - const query = { page: 1, limit: 5 }; - const categories = [{ id: 1, name: 'Category' }]; - const resp = { data: { nodes: categories, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CATEGORIES, - payload: [{ id: 1, name: 'Category', medium: undefined }], - }, - { - type: types.ADD_CATEGORIES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategories(query, false)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API, { - params: query, - }); - }); - it('should create actions to fetch categories success with media', () => { - const query = { page: 1, limit: 5 }; - const medium = { id: 3, medium: 'Medium' }; - const categories = [{ id: 1, name: 'Category', medium }]; - const resp = { data: { nodes: categories, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.ADD_CATEGORIES, - payload: [{ id: 1, name: 'Category', medium: 3 }], - }, - { - type: types.ADD_CATEGORIES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategories(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API, { - params: query, - }); - }); - it('should create actions to fetch categories failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategories(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API, { - params: query, - }); - }); - it('should create actions to get category by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategory(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API + '/' + id); - }); - it('should not create actions for fetching categories when spaceID is 0 ', () => { - const query = { page: 1, limit: 5 }; - const expectedActions = []; - const store = mockStore({ ...initialState, spaces: { selected: 0 } }); - store.dispatch(actions.getCategories(query)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to get category by id success', () => { - const id = 1; - const category = { id, name: 'Category' }; - const resp = { data: category }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: types.GET_CATEGORY, - payload: { id, name: 'Category', medium: undefined }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategory(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API + '/' + id); - }); - it('should create actions to get category by id where category has medium', () => { - const id = 1; - const medium = { id: 1, medium: 'Medium' }; - const category = { id, name: 'Category', medium }; - const resp = { data: category }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.GET_CATEGORY, - payload: { id, name: 'Category', medium: 1 }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getCategory(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CATEGORIES_API + '/' + id); - }); - it('should create actions to create category success', () => { - const category = { name: 'Category' }; - const resp = { data: category }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: types.RESET_CATEGORIES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Category created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createCategory(category)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.CATEGORIES_API, category); - }); - it('should create actions to create category failure', () => { - const category = { name: 'Category' }; - const errorMessage = 'Failed to create category'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createCategory(category)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.CATEGORIES_API, category); - }); - it('should create actions to update category without medium success', () => { - const category = { id: 1, name: 'Category' }; - const resp = { data: category }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: types.UPDATE_CATEGORY, - payload: { id: 1, name: 'Category', medium: undefined }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Category updated', - time: Date.now(), - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateCategory(category)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CATEGORIES_API + '/1', category); - }); - it('should create actions to update category with medium success', () => { - const medium = { id: 4, name: 'mediumm' }; - const category = { id: 1, name: 'Category', medium: medium }; - const resp = { data: category }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.UPDATE_CATEGORY, - payload: { id: 1, name: 'Category', medium: 4 }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Category updated', - time: Date.now(), - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateCategory(category)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CATEGORIES_API + '/1', category); - }); - it('should create actions to update category failure', () => { - const category = { id: 1, name: 'Category' }; - const errorMessage = 'Failed to update category'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateCategory(category)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CATEGORIES_API + '/1', category); - }); - it('should create actions to delete category success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: types.RESET_CATEGORIES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Category deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteCategory(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.CATEGORIES_API + '/1'); - }); - it('should create actions to delete category failure', () => { - const errorMessage = 'Failed to delete category'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteCategory(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.CATEGORIES_API + '/1'); - }); - it('should create actions to add categories list with no medium in any of the categories', () => { - const categories = [ - { id: 1, name: 'Category' }, - { id: 2, name: 'Category' }, - ]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CATEGORIES, - payload: [ - { id: 1, name: 'Category', medium: undefined }, - { id: 2, name: 'Category', medium: undefined }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addCategories(categories)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add categories list', () => { - const medium = { id: 4, name: 'mediumm' }; - const categories = [ - { id: 1, name: 'Category' }, - { id: 2, name: 'Category', medium: medium }, - ]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.ADD_CATEGORIES, - payload: [ - { id: 1, name: 'Category', medium: undefined }, - { id: 2, name: 'Category', medium: 4 }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addCategories(categories)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty categories list', () => { - const categories = []; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CATEGORIES, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addCategories(categories)); - expect(store.getActions()).toEqual(expectedActions); - }); -}); diff --git a/studio/src/__tests__/actions/claimants.js b/studio/src/__tests__/actions/claimants.js deleted file mode 100644 index 5da30d0df..000000000 --- a/studio/src/__tests__/actions/claimants.js +++ /dev/null @@ -1,609 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/claimants'; -import * as types from '../../constants/claimants'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_MEDIA } from '../../constants/media'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('claimants actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }; - expect(actions.loadingClaimants()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }; - expect(actions.stopClaimantsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add claimants list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addClaimantsAction = { - type: types.ADD_CLAIMANTS, - payload: data, - }; - expect(actions.addClaimantsList(data)).toEqual(addClaimantsAction); - }); - it('should create an action to add claimants request', () => { - const data = [{ query: 'query' }]; - const addClaimantsRequestAction = { - type: types.ADD_CLAIMANTS_REQUEST, - payload: data, - }; - expect(actions.addClaimantsRequest(data)).toEqual(addClaimantsRequestAction); - }); - it('should create an action to reset claimants', () => { - const resetClaimantsRequestAction = { - type: types.RESET_CLAIMANTS, - }; - expect(actions.resetClaimants()).toEqual(resetClaimantsRequestAction); - }); - it('should create actions to fetch claimants success without media', () => { - const query = { page: 1, limit: 5 }; - const claimants = [{ id: 1, name: 'Claimant' }]; - const resp = { data: { nodes: claimants, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CLAIMANTS, - payload: [{ id: 1, name: 'Claimant', medium: undefined }], - }, - { - type: types.ADD_CLAIMANTS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimants(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API, { - params: query, - }); - }); - it('should create actions to fetch claimants success not all with media', () => { - const query = { page: 1, limit: 5 }; - - const claimants = [ - { id: 1, name: 'Claimant', medium: { id: 11, medium: 'Medium' } }, - { id: 2, name: 'Claimant 2' }, - ]; - const resp = { data: { nodes: claimants, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 11, medium: 'Medium' }], - }, - { - type: types.ADD_CLAIMANTS, - payload: [ - { id: 1, name: 'Claimant', medium: 11 }, - { id: 2, name: 'Claimant 2', medium: undefined }, - ], - }, - { - type: types.ADD_CLAIMANTS_REQUEST, - payload: { - data: [1, 2], - query: query, - total: 2, - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimants(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API, { - params: query, - }); - }); - it('should create actions to fetch claimants success all with media', () => { - const query = { page: 1, limit: 5 }; - - const claimants = [ - { id: 1, name: 'Claimant', medium: { id: 11, medium: 'Medium' } }, - { id: 2, name: 'Claimant 2', medium: { id: 21, medium: 'Medium 2' } }, - ]; - const resp = { data: { nodes: claimants, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [ - { id: 11, medium: 'Medium' }, - { id: 21, medium: 'Medium 2' }, - ], - }, - { - type: types.ADD_CLAIMANTS, - payload: [ - { id: 1, name: 'Claimant', medium: 11 }, - { id: 2, name: 'Claimant 2', medium: 21 }, - ], - }, - { - type: types.ADD_CLAIMANTS_REQUEST, - payload: { - data: [1, 2], - query: query, - total: 2, - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimants(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API, { - params: query, - }); - }); - it('should create actions to fetch claimants failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimants(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API, { - params: query, - }); - }); - it('should create actions to get claimant by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimant(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API + '/' + id); - }); - it('should create actions to get claimant by id success', () => { - const id = 1; - const claimant = { id, name: 'Claimant' }; - const resp = { data: claimant }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: types.GET_CLAIMANT, - payload: { id, name: 'Claimant', medium: undefined }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimant(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API + '/' + id); - }); - it('should create actions to get claimant by id where claimant has medium', () => { - const id = 1; - const medium = { id: 1, medium: 'Medium' }; - const claimant = { id, name: 'Claimant', medium }; - const resp = { data: claimant }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.GET_CLAIMANT, - payload: { id, name: 'Claimant', medium: 1 }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaimant(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMANTS_API + '/' + id); - }); - it('should create actions to create claimant success', () => { - const claimant = { name: 'Claimant' }; - const resp = { data: claimant }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: types.RESET_CLAIMANTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claimant created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createClaimant(claimant)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.CLAIMANTS_API, claimant); - }); - it('should create actions to create claimant failure', () => { - const claimant = { name: 'Claimant' }; - const errorMessage = 'Failed to create claimant'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createClaimant(claimant)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.CLAIMANTS_API, claimant); - }); - it('should create actions to update claimant without medium success', () => { - const claimant = { id: 1, name: 'Claimant' }; - const resp = { data: claimant }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: types.UPDATE_CLAIMANT, - payload: { id: 1, name: 'Claimant', medium: undefined }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claimant updated', - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateClaimant(claimant)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CLAIMANTS_API + '/1', claimant); - }); - it('should create actions to update claimant with medium success', () => { - const medium = { id: 4, name: 'medium' }; - const claimant = { id: 1, name: 'Claimant', medium: medium }; - const resp = { data: claimant }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.UPDATE_CLAIMANT, - payload: { id: 1, name: 'Claimant', medium: 4 }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claimant updated', - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateClaimant(claimant)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CLAIMANTS_API + '/1', claimant); - }); - it('should create actions to update claimant failure', () => { - const claimant = { id: 1, name: 'Claimant' }; - const errorMessage = 'Failed to update claimant'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateClaimant(claimant)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CLAIMANTS_API + '/1', claimant); - }); - it('should create actions to delete claimant success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: types.RESET_CLAIMANTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claimant deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteClaimant(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.CLAIMANTS_API + '/1'); - }); - it('should create actions to delete claimant failure', () => { - const errorMessage = 'Failed to delete claimant'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteClaimant(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.CLAIMANTS_API + '/1'); - }); - it('should create actions to add claimants list', () => { - const medium = { id: 4, name: 'mediumm' }; - const claimants = [ - { id: 1, name: 'Claimant' }, - { id: 2, name: 'Claimant', medium: medium }, - ]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.ADD_CLAIMANTS, - payload: [ - { id: 1, name: 'Claimant', medium: undefined }, - { id: 2, name: 'Claimant', medium: 4 }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addClaimants(claimants)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add claimants list where no claimant has medium', () => { - const claimants = [ - { id: 1, name: 'Claimant' }, - { id: 2, name: 'Claimant' }, - ]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CLAIMANTS, - payload: [ - { id: 1, name: 'Claimant', medium: undefined }, - { id: 2, name: 'Claimant', medium: undefined }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addClaimants(claimants)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty claimants list', () => { - const claimants = []; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_CLAIMANTS, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addClaimants(claimants)); - expect(store.getActions()).toEqual(expectedActions); - }); -}); diff --git a/studio/src/__tests__/actions/claims.js b/studio/src/__tests__/actions/claims.js deleted file mode 100644 index b9df06972..000000000 --- a/studio/src/__tests__/actions/claims.js +++ /dev/null @@ -1,739 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/claims'; -import * as types from '../../constants/claims'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_MEDIA } from '../../constants/media'; -import { ADD_RATINGS } from '../../constants/ratings'; -import { ADD_CLAIMANTS } from '../../constants/claimants'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -const claim_without_id = { - name: 'Claim 1', - claimant: { id: 11, name: 'Claimant 1', medium: { id: 21, name: 'Medium-Claimant 1' } }, - rating: { id: 100, name: 'Rating 1', medium: { id: 110, name: 'Medium-Rating 1' } }, -}; -const claim = { - id: 1, - ...claim_without_id, -}; -const { claimant, rating, ...claim_without_claimant_and_rating } = claim; - -const claim2 = { - id: 2, - name: 'Claim 2', - claimant: { id: 12, name: 'Claimant 2', medium: { id: 22, name: 'Medium-Claimant 2' } }, - rating: { id: 200, name: 'Rating 2', medium: { id: 220, name: 'Medium-Rating 2' } }, -}; -const { claimant: claimant2, rating: rating2, ...claim_without_claimant_and_rating2 } = claim2; - -const claim3 = { - id: 3, - name: 'New Claim', - claimant: { id: 13, name: 'Claimant 3', medium: { id: 23, name: 'Medium-Claimant 3' } }, - rating: { id: 300, name: 'Rating 3', medium: { id: 320, name: 'Medium-Rating 3' } }, -}; - -describe('claims actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_CLAIMS_LOADING, - payload: true, - }; - expect(actions.loadingClaims()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_CLAIMS_LOADING, - payload: false, - }; - expect(actions.stopClaimsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add claims list', () => { - const data = [claim, claim2]; - - const addClaimsAction = { - type: types.ADD_CLAIMS, - payload: data, - }; - expect(actions.addClaimsList(data)).toEqual(addClaimsAction); - }); - it('should create an action to add claims request', () => { - const data = [{ query: 'query' }]; - const addClaimsRequestAction = { - type: types.ADD_CLAIMS_REQUEST, - payload: data, - }; - expect(actions.addClaimsRequest(data)).toEqual(addClaimsRequestAction); - }); - it('should create an action to reset claims', () => { - const resetClaimsRequestAction = { - type: types.RESET_CLAIMS, - }; - expect(actions.resetClaims()).toEqual(resetClaimsRequestAction); - }); - it('should create actions to fetch claims success', () => { - const query = { - page: 1, - limit: 5, - rating: [100], - claimant: [11], - q: 'claimant', - sort: 'asc', - }; - const claims = [claim]; - const resp = { data: { nodes: claims, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 21, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 11, name: 'Claimant 1', medium: 21 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 110, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 100, name: 'Rating 1', medium: 110 }], - }, - { - type: types.ADD_CLAIMS, - payload: [{ id: 1, name: 'Claim 1', claimant: 11, rating: 100 }], - }, - { - type: types.ADD_CLAIMS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams('claimant=11&rating=100&page=1&limit=5&sort=asc&q=claimant'); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaims(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API, { - params: params, - }); - }); - it('should create actions to fetch claims list without page and limit', () => { - const query = { q: 'New' }; - const claims = [claim3]; - const resp = { data: { nodes: claims, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 23, name: 'Medium-Claimant 3' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 13, name: 'Claimant 3', medium: 23 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 320, name: 'Medium-Rating 3' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 300, name: 'Rating 3', medium: 320 }], - }, - { - type: types.ADD_CLAIMS, - payload: [{ id: 3, name: 'New Claim', claimant: 13, rating: 300 }], - }, - { - type: types.ADD_CLAIMS_REQUEST, - payload: { - data: [3], - query: query, - total: 1, - }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - const params = new URLSearchParams('q=New'); - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaims(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API, { - params: params, - }); - }); - it('should create actions to fetch claims list without claimants and ratings', () => { - const query = { page: 1, limit: 5 }; - const claims = [claim_without_claimant_and_rating, claim_without_claimant_and_rating2]; - const resp = { data: { nodes: claims, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - const params = new URLSearchParams('page=1&limit=5'); - - store.dispatch(actions.getClaims(query)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API, { - params: params, - }); - }); - it('should create actions to fetch claims list with claimants but not ratings', () => { - const query = { page: 1, limit: 5 }; - const claims = [ - { ...claim_without_claimant_and_rating, claimant }, - { ...claim_without_claimant_and_rating2, claimant2 }, - ]; - const resp = { data: { nodes: claims, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - const params = new URLSearchParams('page=1&limit=5'); - - store.dispatch(actions.getClaims(query)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API, { - params: params, - }); - }); - it('should create actions to fetch claims list with ratings but not claimants', () => { - const query = { page: 1, limit: 5 }; - const claims = [ - { ...claim_without_claimant_and_rating, rating }, - { ...claim_without_claimant_and_rating2, rating2 }, - ]; - const resp = { data: { nodes: claims, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - const params = new URLSearchParams('page=1&limit=5'); - - store.dispatch(actions.getClaims(query)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API, { - params: params, - }); - }); - it('should create actions to fetch claims failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - const params = new URLSearchParams('page=1&limit=5'); - store - .dispatch(actions.getClaims(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API, { - params: params, - }); - }); - it('should create actions to get claim by id success', () => { - const id = 1; - const resp = { data: claim }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 21, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 11, name: 'Claimant 1', medium: 21 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 110, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 100, name: 'Rating 1', medium: 110 }], - }, - { - type: types.GET_CLAIM, - payload: { id: 1, name: 'Claim 1', claimant: 11, rating: 100 }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaim(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API + '/' + id); - }); - it('should create actions to get claim by id without claimant and rating', () => { - const id = 1; - const resp = { data: claim }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - - store.dispatch(actions.getClaim(id)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API + '/' + id); - }); - it('should create actions to get claim by id with claimant but not rating', () => { - const claim = { ...claim_without_claimant_and_rating, claimant }; - const id = 1; - const resp = { data: claim }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - - store.dispatch(actions.getClaim(id)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API + '/' + id); - }); - it('should create actions to get claim by id with rating but not claimant', () => { - const claim = { ...claim_without_claimant_and_rating, rating }; - const id = 1; - const resp = { data: claim }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - - store.dispatch(actions.getClaim(id)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API + '/' + id); - }); - it('should create actions to get claim by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getClaim(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.CLAIMS_API + '/' + id); - }); - it('should create actions to create claim success', () => { - const resp = { data: claim }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 21, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 11, name: 'Claimant 1', medium: 21 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 110, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 100, name: 'Rating 1', medium: 110 }], - }, - { - type: types.RESET_CLAIMS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claim created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createClaim(claim_without_id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.CLAIMS_API, claim_without_id); - }); - it('should create actions to create claim failure', () => { - const errorMessage = 'Failed to create claim'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createClaim(claim)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.CLAIMS_API, claim); - }); - it('should create actions to update claim success with claim and rating', () => { - const resp = { data: claim }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 21, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 11, name: 'Claimant 1', medium: 21 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 110, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 100, name: 'Rating 1', medium: 110 }], - }, - { - type: types.UPDATE_CLAIM, - payload: { id: 1, name: 'Claim 1', claimant: 11, rating: 100 }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claim updated', - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateClaim(claim)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CLAIMS_API + '/1', claim); - }); - it('should create actions to update claim without claimant and rating', () => { - const store = mockStore({ initialState }); - - try { - store.dispatch(actions.updateClaim(claim_without_claimant_and_rating)); - } catch (err) { - expect(err).toBeInstanceOf(TypeError); - } - }); - it('should create actions to update claim with claimant but not rating', () => { - const claim = { ...claim_without_claimant_and_rating, claimant }; - - const store = mockStore({ initialState }); - - try { - store.dispatch(actions.updateClaim(claim)); - } catch (err) { - expect(err).toBeInstanceOf(TypeError); - } - }); - it('should create actions to update claim with rating but not claimant', () => { - const claim = { ...claim_without_claimant_and_rating, rating }; - - const store = mockStore({ initialState }); - - try { - store.dispatch(actions.updateClaim(claim)); - } catch (err) { - expect(err).toBeInstanceOf(TypeError); - } - }); - it('should create actions to update claim failure', () => { - const errorMessage = 'Failed to update claim'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_CLAIMS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateClaim(claim)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.CLAIMS_API + '/1', claim); - }); - it('should create actions to delete claim success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: types.RESET_CLAIMS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Claim deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteClaim(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.CLAIMS_API + '/1'); - }); - it('should create actions to delete claim failure', () => { - const errorMessage = 'Failed to delete claim'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_CLAIMS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteClaim(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.CLAIMS_API + '/1'); - }); - it('should create actions to add claims list without claimants and ratings', () => { - const claims = [claim_without_claimant_and_rating, claim_without_claimant_and_rating2]; - - const store = mockStore({ initialState }); - - try { - store.dispatch(actions.addClaims(claims)); - } catch (err) { - expect(err).toBeInstanceOf(TypeError); - } - }); - it('should create actions to add claims list with claimants but not ratings', () => { - const claims = [ - { ...claim_without_claimant_and_rating, claimant }, - { ...claim_without_claimant_and_rating2, claimant2 }, - ]; - - const store = mockStore({ initialState }); - - try { - store.dispatch(actions.addClaims(claims)); - } catch (err) { - expect(err).toBeInstanceOf(TypeError); - } - }); - it('should create actions to add claims list with ratings but not claimants', () => { - const claims = [ - { ...claim_without_claimant_and_rating, rating }, - { ...claim_without_claimant_and_rating2, rating2 }, - ]; - - const store = mockStore({ initialState }); - - try { - store.dispatch(actions.addClaims(claims)); - } catch (err) { - expect(err).toBeInstanceOf(TypeError); - } - }); - it('should create actions to add claims list with claimants and ratings', () => { - const claims = [claim, claim2]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [ - { id: 21, name: 'Medium-Claimant 1' }, - { id: 22, name: 'Medium-Claimant 2' }, - ], - }, - { - type: ADD_CLAIMANTS, - payload: [ - { id: 11, name: 'Claimant 1', medium: 21 }, - { id: 12, name: 'Claimant 2', medium: 22 }, - ], - }, - { - type: ADD_MEDIA, - payload: [ - { id: 110, name: 'Medium-Rating 1' }, - { id: 220, name: 'Medium-Rating 2' }, - ], - }, - { - type: ADD_RATINGS, - payload: [ - { id: 100, name: 'Rating 1', medium: 110 }, - { id: 200, name: 'Rating 2', medium: 220 }, - ], - }, - { - type: types.ADD_CLAIMS, - payload: [ - { id: 1, name: 'Claim 1', claimant: 11, rating: 100 }, - { id: 2, name: 'Claim 2', claimant: 12, rating: 200 }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addClaims(claims)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty claims list', () => { - const claims = []; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CLAIMANTS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_RATINGS, - payload: [], - }, - { - type: types.ADD_CLAIMS, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addClaims(claims)); - expect(store.getActions()).toEqual(expectedActions); - }); -}); diff --git a/studio/src/__tests__/actions/events.js b/studio/src/__tests__/actions/events.js deleted file mode 100644 index f849a9421..000000000 --- a/studio/src/__tests__/actions/events.js +++ /dev/null @@ -1,425 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/events'; -import * as types from '../../constants/events'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('Events actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_EVENTS_LOADING, - payload: true, - }; - expect(actions.loadingEvents()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_EVENTS_LOADING, - payload: false, - }; - expect(actions.stopEventsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add events list', () => { - const data = [ - { id: 1, name: 'event 1' }, - { id: 2, name: 'event 2' }, - ]; - - const addEventsAction = { - type: types.ADD_EVENTS, - payload: data, - }; - expect(actions.addEvents(data)).toEqual(addEventsAction); - }); - it('should create an action to add event request', () => { - const data = [{ query: 'query' }]; - const addEventsRequestAction = { - type: types.ADD_EVENTS_REQUEST, - payload: data, - }; - expect(actions.addEventsRequest(data)).toEqual(addEventsRequestAction); - }); - it('should create an action to reset event', () => { - const resetEventsAction = { - type: types.RESET_EVENTS, - }; - expect(actions.resetEvents()).toEqual(resetEventsAction); - }); - it('should create actions to add default events', () => { - const events = [{ id: 1, name: 'Event' }]; - const resp = { data: { nodes: events, total: 1 } }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: types.ADD_EVENTS, - payload: [{ id: 1, name: 'Event' }], - }, - { - type: types.ADD_EVENTS_REQUEST, - payload: { - data: [1], - total: 1, - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultEvents()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.EVENTS_API + '/default'); - }); - it('should create actions to add default events failure', () => { - const errorMessage = 'Failed to add default events'; - axios.post.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultEvents()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.EVENTS_API + '/default'); - }); - it('should create actions to fetch events success', () => { - const query = { page: 1, limit: 5 }; - const events = [{ id: 1, name: 'Event' }]; - const resp = { data: { nodes: events, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: types.ADD_EVENTS, - payload: [{ id: 1, name: 'Event' }], - }, - { - type: types.ADD_EVENTS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getEvents(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.EVENTS_API, { - params: query, - }); - }); - it('should create actions to fetch events failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch events'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getEvents(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.EVENTS_API, { - params: query, - }); - }); - it('should create actions to get event by id success', () => { - const id = 1; - const event = { id, name: 'Event' }; - const resp = { data: event }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: types.GET_EVENT, - payload: { id, name: 'Event' }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getEvent(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.EVENTS_API + '/' + id); - }); - it('should create actions to get event by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch event'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getEvent(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.EVENTS_API + '/' + id); - }); - it('should create actions to create event success', () => { - const event = { name: 'Event' }; - const resp = { data: event }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: types.RESET_EVENTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Event created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createEvent(event)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.EVENTS_API, event); - }); - it('should create actions to create event failure', () => { - const event = { name: 'Event' }; - const errorMessage = 'Failed to create event'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createEvent(event)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.EVENTS_API, event); - }); - it('should create actions to update event success', () => { - const event = { id: 1, name: 'Event' }; - const resp = { data: event }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: types.UPDATE_EVENT, - payload: { id: 1, name: 'Event' }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Event updated', - time: Date.now(), - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateEvent(event)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.EVENTS_API + '/1', event); - }); - it('should create actions to update event failure', () => { - const event = { id: 1, name: 'Event' }; - const errorMessage = 'Failed to update event'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_EVENTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateEvent(event)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.EVENTS_API + '/1', event); - }); - it('should create actions to delete event success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: types.RESET_EVENTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Event deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteEvent(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.EVENTS_API + '/1'); - }); - it('should create actions to delete event failure', () => { - const errorMessage = 'Failed to delete event'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_EVENTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteEvent(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.EVENTS_API + '/1'); - }); -}); diff --git a/studio/src/__tests__/actions/formats.js b/studio/src/__tests__/actions/formats.js deleted file mode 100644 index f7caabfd5..000000000 --- a/studio/src/__tests__/actions/formats.js +++ /dev/null @@ -1,461 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/formats'; -import * as types from '../../constants/formats'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { SET_REDIRECT } from '../../constants/settings'; -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('formats actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_FORMATS_LOADING, - payload: true, - }; - expect(actions.loadingFormats()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_FORMATS_LOADING, - payload: false, - }; - expect(actions.stopFormatsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add formats list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addFormatsAction = { - type: types.ADD_FORMATS, - payload: data, - }; - expect(actions.addFormats(data)).toEqual(addFormatsAction); - }); - it('should create an action to add formats request', () => { - const data = [{ query: 'query' }]; - const addFormatsRequestAction = { - type: types.ADD_FORMATS_REQUEST, - payload: data, - }; - expect(actions.addFormatsRequest(data)).toEqual(addFormatsRequestAction); - }); - it('should create an action to reset formats', () => { - const resetFormatsRequestAction = { - type: types.RESET_FORMATS, - }; - expect(actions.resetFormats()).toEqual(resetFormatsRequestAction); - }); - - it('should create actions to fetch formats success', () => { - const query = { page: 1, limit: 5 }; - const formats = [{ id: 1, name: 'Format' }]; - const resp = { data: { nodes: formats, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: types.ADD_FORMATS, - payload: [{ id: 1, name: 'Format' }], - }, - { - type: types.ADD_FORMATS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getFormats(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.FORMATS_API, { - params: query, - }); - }); - it('should create actions to fetch formats failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch formats'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getFormats(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.FORMATS_API, { - params: query, - }); - }); - it('should create actions to fetch formats failure and redirect if error status is 307', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch formats'; - axios.get.mockRejectedValue({ message: errorMessage, response: { status: 307 } }); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { type: SET_REDIRECT, payload: 307 }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getFormats(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.FORMATS_API, { - params: query, - }); - }); - it('should create actions to get format by id success', () => { - const id = 1; - const format = { id, name: 'Format' }; - const resp = { data: format }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: types.GET_FORMAT, - payload: { id, name: 'Format' }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getFormat(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.FORMATS_API + '/' + id); - }); - it('should create actions to get format by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch format'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getFormat(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.FORMATS_API + '/' + id); - }); - it('should create actions to create format success', () => { - const format = { name: 'Format' }; - const resp = { data: format }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: types.RESET_FORMATS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Format created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createFormat(format)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.FORMATS_API, format); - }); - it('should create actions to create format failure', () => { - const format = { name: 'Format' }; - const errorMessage = 'Failed to create format'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createFormat(format)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.FORMATS_API, format); - }); - it('should create actions to update format success', () => { - const format = { id: 1, name: 'Format' }; - const resp = { data: format }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: types.UPDATE_FORMAT, - payload: { id: 1, name: 'Format' }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Format updated', - time: Date.now(), - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateFormat(format)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.FORMATS_API + '/1', format); - }); - it('should create actions to update format failure', () => { - const format = { id: 1, name: 'Format' }; - const errorMessage = 'Failed to update format'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateFormat(format)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.FORMATS_API + '/1', format); - }); - it('should create actions to delete format success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: types.RESET_FORMATS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Format deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteFormat(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.FORMATS_API + '/1'); - }); - it('should create actions to delete format failure', () => { - const errorMessage = 'Failed to delete format'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteFormat(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.FORMATS_API + '/1'); - }); - it('should create actions to add default formats', () => { - const formats = [{ id: 1, name: 'Format' }]; - const resp = { data: { nodes: formats, total: 1 } }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: types.ADD_FORMATS, - payload: [{ id: 1, name: 'Format' }], - }, - { - type: types.ADD_FORMATS_REQUEST, - payload: { - data: [1], - total: 1, - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultFormats()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.FORMATS_API + '/default'); - }); - it('should create actions to add default formats failure', () => { - const errorMessage = 'Failed to add default format'; - axios.post.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: types.SET_FORMATS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_FORMATS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultFormats()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.FORMATS_API + '/default'); - }); -}); diff --git a/studio/src/__tests__/actions/googleFactChecks.js b/studio/src/__tests__/actions/googleFactChecks.js deleted file mode 100644 index f709d9b08..000000000 --- a/studio/src/__tests__/actions/googleFactChecks.js +++ /dev/null @@ -1,129 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/googleFactChecks'; -import * as types from '../../constants/googleFactChecks'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - loading: true, -}; - -const factCheck = { - text: 'Video shows Russian doctors celebrating the new COVID-19 vaccine.', - claimant: 'Facebook posts', - claimDate: '2020-09-08T02:48:10Z', - claimReview: [ - { - publisher: { - name: 'BOOM', - site: 'boomlive.in', - }, - url: - 'https://www.boomlive.in/world/video-from-saudi-arabia-shared-as-russian-doctors-celebrating-covid-19-vaccine-9654', - title: 'Video From Saudi Arabia Shared As Russian Doctors Celebrating COVID-19 Vaccine', - reviewDate: '2020-09-08T02:48:10Z', - textualRating: 'False', - languageCode: 'en', - }, - ], -}; - -describe('google fact checks actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: true, - }; - expect(actions.loadingGoogleFactChecks()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: false, - }; - expect(actions.stopLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add google fact checks request', () => { - const data = [{ data: [factCheck], query: { page: 1, limit: 1 }, total: 1 }]; - const addRequestAction = { - type: types.ADD_GOOGLE_FACT_CHECKS_REQUEST, - payload: data, - }; - expect(actions.addRequest(data)).toEqual(addRequestAction); - }); - - it('should create actions to fetch google fact checks success', () => { - const query = { page: 1, limit: 1, query: 'fact' }; - - const resp = { data: { nodes: [factCheck], total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: true, - }, - { - type: types.ADD_GOOGLE_FACT_CHECKS_REQUEST, - payload: { - data: [factCheck], - query: query, - total: 1, - }, - }, - { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getGoogleFactChecks(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.GOOGLE_FACT_CHECKS_API, { - params: query, - }); - }); - it('should create actions to fetch google fact checks failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getGoogleFactChecks(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.GOOGLE_FACT_CHECKS_API, { - params: query, - }); - }); -}); diff --git a/studio/src/__tests__/actions/info.js b/studio/src/__tests__/actions/info.js deleted file mode 100644 index 525dd1b41..000000000 --- a/studio/src/__tests__/actions/info.js +++ /dev/null @@ -1,103 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/info'; -import * as types from '../../constants/info'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - categories: 0, - tag: 0, - article: { - draft: 0, - template: 0, - publish: 0, - }, - factCheck: { - draft: 0, - template: 0, - publish: 0, - }, - podcasts: 0, -}; - -describe('info actions', () => { - it('should create an action to addInfo', () => { - const info = { - categories: 4, - tag: 2, - article: { - draft: 1, - template: 2, - publish: 3, - }, - factCheck: { - draft: 1, - template: 2, - publish: 3, - }, - podcasts: 4, - }; - const addInfoActions = { - type: types.ADD_INFO, - payload: info, - }; - expect(actions.addInfo(info)).toEqual(addInfoActions); - }); - it('should create actions to fetch info success', () => { - const info = { - categories: 4, - tag: 2, - article: { - draft: 1, - template: 2, - publish: 3, - }, - factCheck: { - draft: 1, - template: 2, - publish: 3, - }, - podcasts: 4, - }; - const resp = { data: info }; - axios.get.mockResolvedValue(resp); - const expectedActions = [ - { - type: types.ADD_INFO, - payload: info, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.getInfo()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.INFO_API); - }); - it('should create actions to fetch info failure', () => { - const errorMessage = 'Error Occurred'; - axios.get.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.getInfo()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.INFO_API); - }); -}); diff --git a/studio/src/__tests__/actions/media.js b/studio/src/__tests__/actions/media.js deleted file mode 100644 index 7d7e32432..000000000 --- a/studio/src/__tests__/actions/media.js +++ /dev/null @@ -1,532 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/media'; -import * as types from '../../constants/media'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, - total: 0, -}; - -describe('media actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_MEDIA_LOADING, - payload: true, - }; - expect(actions.loadingMedia()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_MEDIA_LOADING, - payload: false, - }; - expect(actions.stopMediaLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add media list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addMediaAction = { - type: types.ADD_MEDIA, - payload: data, - }; - expect(actions.addMedia(data)).toEqual(addMediaAction); - }); - it('should create an action to add media request', () => { - const data = [{ query: 'query' }]; - const addMediaRequestAction = { - type: types.ADD_MEDIA_REQUEST, - payload: data, - }; - expect(actions.addMediaRequest(data)).toEqual(addMediaRequestAction); - }); - it('should create an action to reset media', () => { - const resetMediaRequestAction = { - type: types.RESET_MEDIA, - }; - expect(actions.resetMedia()).toEqual(resetMediaRequestAction); - }); - it('should create actions to fetch media success', () => { - const query = { page: 1, limit: 5 }; - const media = [{ id: 1, name: 'Medium' }]; - const resp = { data: { nodes: media, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.ADD_MEDIA, - payload: [{ id: 1, name: 'Medium', medium: undefined }], - }, - { - type: types.ADD_MEDIA_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedia(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MEDIA_API, { - params: query, - }); - }); - it('should create actions to fetch media success with profile is true', () => { - const query = { page: 1, limit: 5 }; - const media = [{ id: 1, name: 'Medium' }]; - const resp = { data: { nodes: media, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.ADD_MEDIA, - payload: [{ id: 1, name: 'Medium', medium: undefined }], - }, - { - type: types.ADD_MEDIA_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedia(query, true)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.KAVACH_MEDIA_API, { - params: query, - }); - }); - it('should create actions to fetch media success with media', () => { - const query = { page: 1, limit: 5 }; - const media = [{ id: 1, name: 'Medium' }]; - const resp = { data: { nodes: media, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.ADD_MEDIA, - payload: [{ id: 1, name: 'Medium' }], - }, - { - type: types.ADD_MEDIA_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedia(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MEDIA_API, { - params: query, - }); - }); - it('should create actions to fetch media failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedia(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MEDIA_API, { - params: query, - }); - }); - it('should create actions to get medium by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedium(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MEDIA_API + '/' + id); - }); - it('should create actions to get medium by id success', () => { - const id = 1; - const medium = { id, name: 'Medium' }; - const resp = { data: medium }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.GET_MEDIUM, - payload: { id, name: 'Medium', medium: undefined }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedium(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MEDIA_API + '/' + id); - }); - it('should create actions to get medium by id where medium has medium', () => { - const id = 1; - const medium = { id, name: 'Medium' }; - const resp = { data: medium }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.GET_MEDIUM, - payload: { id, name: 'Medium' }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getMedium(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MEDIA_API + '/' + id); - }); - it('should create actions to create medium success where profile is true', () => { - const medium = [{ name: 'Medium' }]; - const resp = { data: medium }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.RESET_MEDIA, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Medium created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createMedium(medium, true)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.KAVACH_MEDIA_API, medium[0]); - }); - it('should create actions to create medium success', () => { - const medium = { name: 'Medium' }; - const resp = { data: { nodes: medium } }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.RESET_MEDIA, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Medium created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createMedium(medium, false)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.MEDIA_API, medium); - }); - it('should create actions to create medium failure', () => { - const medium = { name: 'Medium' }; - const errorMessage = 'Failed to create medium'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createMedium(medium)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.MEDIA_API, medium); - }); - it('should create actions to update medium success', () => { - const medium = { id: 1, name: 'Medium' }; - const resp = { data: medium }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.UPDATE_MEDIUM, - payload: { id: 1, name: 'Medium' }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Medium updated', - time: Date.now(), - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateMedium(medium)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.MEDIA_API + '/1', medium); - }); - it('should create actions to update medium failure', () => { - const medium = { id: 1, name: 'Medium' }; - const errorMessage = 'Failed to update medium'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_MEDIA_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateMedium(medium)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.MEDIA_API + '/1', medium); - }); - it('should create actions to delete medium success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: types.RESET_MEDIA, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Medium deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteMedium(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.MEDIA_API + '/1'); - }); - it('should create actions to delete medium failure', () => { - const errorMessage = 'Failed to delete medium'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MEDIA_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteMedium(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.MEDIA_API + '/1'); - }); - it('should create actions to add media', () => { - const media = [ - { id: 1, name: 'Medium' }, - { id: 2, name: 'Medium' }, - ]; - - const expectedActions = [ - { - type: types.ADD_MEDIA, - payload: [ - { id: 1, name: 'Medium' }, - { id: 2, name: 'Medium' }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addMedia(media)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty media', () => { - const media = []; - - const expectedActions = [ - { - type: types.ADD_MEDIA, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addMedia(media)); - expect(store.getActions()).toEqual(expectedActions); - }); -}); diff --git a/studio/src/__tests__/actions/meiliReindex.js b/studio/src/__tests__/actions/meiliReindex.js deleted file mode 100644 index c347dd312..000000000 --- a/studio/src/__tests__/actions/meiliReindex.js +++ /dev/null @@ -1,122 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/meiliReindex'; -import { MEILI_REINDEX_API } from '../../constants/meiliReindex'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -describe('meiliReindex actions', () => { - it('should create actions to reindex space', () => { - const id = 1; - const resp = { status: 200 }; - axios.post.mockResolvedValue(resp); - const expectedActions = [ - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Successfully Reindexed', - time: Date.now(), - }, - }, - ]; - const store = mockStore({}); - store - .dispatch(actions.reindexSpace(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(MEILI_REINDEX_API + '/space/' + id); - }); - it('should create actions to reindex space without succes status', () => { - const id = 1; - const resp = { status: 404 }; - axios.post.mockResolvedValue(resp); - const expectedActions = []; - const store = mockStore({}); - store - .dispatch(actions.reindexSpace(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(MEILI_REINDEX_API + '/space/' + id); - }); - it('should create actions to reindex space failure', () => { - const id = 1; - const errorMessage = 'Something went wrong'; - axios.post.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - const store = mockStore({}); - store - .dispatch(actions.reindexSpace(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - - expect(axios.post).toHaveBeenCalledWith(MEILI_REINDEX_API + '/space/' + id); - }); - it('should create actions to reindex instance', () => { - const resp = { status: 200 }; - axios.post.mockResolvedValue(resp); - const expectedActions = [ - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Successfully Reindexed', - time: Date.now(), - }, - }, - ]; - const store = mockStore({}); - store - .dispatch(actions.reindex()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - - expect(axios.post).toHaveBeenCalledWith(MEILI_REINDEX_API + '/all'); - }); - it('should create actions to reindex instance without success status', () => { - const resp = { status: 404 }; - axios.post.mockResolvedValue(resp); - const expectedActions = []; - const store = mockStore({}); - store - .dispatch(actions.reindex()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - - expect(axios.post).toHaveBeenCalledWith(MEILI_REINDEX_API + '/all'); - }); - it('should create actions to reindex instance', () => { - const errorMessage = 'Something went wrong'; - axios.post.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - const store = mockStore({}); - store - .dispatch(actions.reindex()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - - expect(axios.post).toHaveBeenCalledWith(MEILI_REINDEX_API + '/all'); - }); -}); diff --git a/studio/src/__tests__/actions/menu.js b/studio/src/__tests__/actions/menu.js deleted file mode 100644 index 16ca50bc0..000000000 --- a/studio/src/__tests__/actions/menu.js +++ /dev/null @@ -1,349 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/menu'; -import * as types from '../../constants/menu'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('menu actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingActions = { - type: types.SET_MENUS_LOADING, - payload: true, - }; - expect(actions.loadingMenus()).toEqual(startLoadingActions); - }); - it('should create an action to set loading to false', () => { - const startLoadingActions = { - type: types.SET_MENUS_LOADING, - payload: false, - }; - expect(actions.stopMenusLoading()).toEqual(startLoadingActions); - }); - it('should create an action to add menus', () => { - const data = [ - { id: 1, name: 'menu1' }, - { id: 2, name: 'menu2' }, - ]; - const addMenusAction = { - type: types.ADD_MENUS, - payload: data, - }; - expect(actions.addMenus(data)).toEqual(addMenusAction); - }); - it('should create an action to add menus request', () => { - const data = [{ query: 'query' }]; - const addMenusRequestAction = { - type: types.ADD_MENUS_REQUEST, - payload: data, - }; - expect(actions.addMenusRequest(data)).toEqual(addMenusRequestAction); - }); - it('should create an action to reset menu', () => { - const resetMenuAction = { - type: types.RESET_MENUS, - }; - expect(actions.resetMenus()).toEqual(resetMenuAction); - }); - it('should create actions to fetch menus success', () => { - const query = { page: 1, limit: 5 }; - const menus = [{ id: 1, name: 'menu1' }]; - const resp = { data: { nodes: menus, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: types.ADD_MENUS, - payload: [{ id: 1, name: 'menu1' }], - }, - { - type: types.ADD_MENUS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_MENUS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.getMenus(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MENUS_API, { - params: query, - }); - }); - it('should create actions to fetch menus failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_MENUS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.getMenus(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MENUS_API, { - params: query, - }); - }); - it('should create actions to fetch menu by id success', () => { - const id = 1; - const menu = { id: 1, name: 'menu1' }; - const resp = { data: menu }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: types.GET_MENU, - payload: { id: 1, name: 'menu1' }, - }, - { - type: types.SET_MENUS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.getMenu(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MENUS_API + '/' + id); - }); - it('should create actions to fetch menu by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_MENUS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.getMenu(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.MENUS_API + '/' + id); - }); - it('should create actions to create menu success', () => { - const menu = { name: 'menu1' }; - const resp = { data: menu }; - axios.post.mockResolvedValue(resp); - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: types.RESET_MENUS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Menu created', - time: Date.now(), - }, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.createMenu(menu)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.MENUS_API, menu); - }); - it('should create actions to create menu failure', () => { - const menu = { name: 'menu1' }; - const errorMessage = 'Failed to create menu'; - axios.post.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.createMenu(menu)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.MENUS_API, menu); - }); - it('should create actions to update menu success', () => { - const menu = { id: 1, name: 'new menu1' }; - const resp = { data: menu }; - axios.put.mockResolvedValue(resp); - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: types.UPDATE_MENU, - payload: { id: 1, name: 'new menu1' }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Menu updated', - time: Date.now(), - }, - }, - { - type: types.SET_MENUS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.updateMenu(menu)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.MENUS_API + '/1', menu); - }); - it('should create actions to update menu failue', () => { - const menu = { id: 1, name: 'new menu1' }; - const errorMessage = 'Failed to update menu'; - axios.put.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_MENUS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.updateMenu(menu)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.MENUS_API + '/1', menu); - }); - it('should create actions to delete menu success', () => { - axios.delete.mockResolvedValue(); - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: types.RESET_MENUS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Menu deleted', - time: Date.now(), - }, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteMenu(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.MENUS_API + '/1'); - }); - it('should create actions to delete menu failure', () => { - const errorMessage = 'Failed to delete menu'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: types.SET_MENUS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteMenu(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.MENUS_API + '/1'); - }); -}); diff --git a/studio/src/__tests__/actions/notifications.js b/studio/src/__tests__/actions/notifications.js deleted file mode 100644 index 72908c951..000000000 --- a/studio/src/__tests__/actions/notifications.js +++ /dev/null @@ -1,33 +0,0 @@ -import * as actions from '../../actions/notifications'; -import * as types from '../../constants/notifications'; - -Date.now = jest.fn(() => 1487076708000); - -describe('notification actions', () => { - it('should create an action to add error notification', () => { - const errorMessage = 'Test Error Message'; - const errorNotificationAction = { - type: types.ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }; - expect(actions.addErrorNotification(errorMessage)).toEqual(errorNotificationAction); - }); - it('should create an action to add success notification', () => { - const successMessage = 'Test Success Message'; - const successNotification = { - type: types.ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: successMessage, - time: Date.now(), - }, - }; - expect(actions.addSuccessNotification(successMessage)).toEqual(successNotification); - }); -}); diff --git a/studio/src/__tests__/actions/pages.js b/studio/src/__tests__/actions/pages.js deleted file mode 100644 index 59af349c7..000000000 --- a/studio/src/__tests__/actions/pages.js +++ /dev/null @@ -1,1045 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/pages'; -import * as types from '../../constants/pages'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_MEDIA } from '../../constants/media'; -import { ADD_FORMATS } from '../../constants/formats'; -import { ADD_AUTHORS } from '../../constants/authors'; -import { ADD_TAGS } from '../../constants/tags'; -import { ADD_CATEGORIES } from '../../constants/categories'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -const page1 = { - id: 1, - name: 'Page 1', - authors: [{ id: 11, name: 'Author 1' }], - tags: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - categories: [ - { id: 31, name: 'category 31', medium: { id: 311, name: 'Category-Medium-311' } }, - { id: 32, name: 'category 32' }, - ], - format: { id: 41, name: 'Format 1' }, - medium: { id: 51, name: 'Medium 1' }, -}; - -const page2 = { - id: 2, - name: 'Page 2', - authors: [{ id: 12, name: 'Author 2' }], - tags: [ - { id: 21, name: 'Tag 21' }, - { id: 23, name: 'Tag 23' }, - { id: 24, name: 'Tag 24' }, - ], - categories: [ - { id: 33, name: 'category 33' }, - { id: 34, name: 'category 34' }, - ], - format: { id: 42, name: 'Format 2' }, - medium: { id: 52, name: 'Medium 2' }, -}; -const page_without_media = { - id: 123, - name: 'Page 1', - authors: [{ id: 11, name: 'Author 1' }], - tags: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - categories: [ - { id: 31, name: 'category 31', medium: { id: 311, name: 'Category-Medium-311' } }, - { id: 32, name: 'category 32' }, - ], - format: { id: 41, name: 'Format 1' }, -}; - -describe('pages actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_PAGES_LOADING, - payload: true, - }; - expect(actions.loadingPages()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_PAGES_LOADING, - payload: false, - }; - expect(actions.stopPagesLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add pages list', () => { - const data = [page1, page2]; - - const addPagesAction = { - type: types.ADD_PAGES, - payload: data, - }; - expect(actions.addPagesList(data)).toEqual(addPagesAction); - }); - it('should create an action to add pages request', () => { - const data = [{ query: 'query' }]; - const addPagesRequestAction = { - type: types.ADD_PAGES_REQUEST, - payload: data, - }; - expect(actions.addPagesRequest(data)).toEqual(addPagesRequestAction); - }); - it('should create an action to add page', () => { - const data = page1; - const addPageAction = { - type: types.ADD_PAGE, - payload: data, - }; - expect(actions.getPageByID(data)).toEqual(addPageAction); - }); - it('should create an action to reset pages', () => { - const resetPagesRequestAction = { - type: types.RESET_PAGES, - }; - expect(actions.resetPages()).toEqual(resetPagesRequestAction); - }); - it('should create actions to fetch pages success', () => { - const query = { - page: 1, - limit: 5, - q: 'page', - sort: 'asc', - tag: [21], - category: [33], - format: [42], - status: 'draft', - author: [11], - }; - const pages = [{ ...page1, status: 'draft' }]; - const resp = { data: { nodes: pages, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_PAGES, - payload: [ - { - id: 1, - name: 'Page 1', - status: 'draft', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - }, - ], - }, - { - type: types.ADD_PAGES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams( - 'category=33&tag=21&format=42&page=1&limit=5&sort=asc&q=page&status=draft&author=11', - ); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPages(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API, { - params: params, - }); - }); - it('should create actions to fetch pages failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - const params = new URLSearchParams('page=1&limit=5'); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPages(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API, { - params: params, - }); - }); - it('should create actions to fetch pages success without page and limit ', () => { - const query = { - q: 'post', - sort: 'asc', - tag: [21], - category: [33], - format: [42], - status: 'publish', - }; - const pages = [{ ...page1, status: 'publish' }]; - const resp = { data: { nodes: pages, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_PAGES, - payload: [ - { - id: 1, - name: 'Page 1', - status: 'publish', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - }, - ], - }, - { - type: types.ADD_PAGES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams( - 'category=33&tag=21&format=42&sort=asc&q=post&status=publish', - ); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPages(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API, { - params: params, - }); - }); - it('should create actions to fetch pages success without any optional fields', () => { - const query = { page: 1, limit: 5 }; - const page = { ...page1, status: 'ready' }; - page.categories = []; - page.authors = []; - page.tags = []; - page.medium = undefined; - - const resp = { data: { nodes: [page], total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_PAGES, - payload: [ - { - id: 1, - name: 'Page 1', - status: 'ready', - authors: [], - tags: [], - categories: [], - format: 41, - medium: undefined, - }, - ], - }, - { - type: types.ADD_PAGES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams('page=1&limit=5'); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPages(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API, { - params: params, - }); - }); - it('should create actions to get page by id success', () => { - const id = 1; - const resp = { data: page1 }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_PAGE, - payload: { - id: 1, - name: 'Page 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: { id: 41, name: 'Format 1' }, - medium: 51, - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPage(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API + '/' + id); - }); - it('should create actions to get page by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPage(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API + '/' + id); - }); - it('should not create actions for fetching pages when spaceID is 0 ', () => { - const query = { page: 1, limit: 5 }; - const expectedActions = []; - const store = mockStore({ ...initialState, spaces: { selected: 0 } }); - store.dispatch(actions.getPages(query)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to get page by id success without any optional fields', () => { - const page = { ...page1 }; - page.categories = []; - page.authors = []; - page.tags = []; - page.medium = undefined; - - const id = 1; - const resp = { data: page }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: types.ADD_PAGE, - payload: { - id: 1, - name: 'Page 1', - authors: [], - tags: [], - categories: [], - format: { id: 41, name: 'Format 1' }, - medium: undefined, - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPage(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PAGES_API + '/' + id); - }); - it('should create actions to create page success', () => { - const data2 = { ...page1 }; - data2.status = 'publish'; - const resp = { data: data2 }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.RESET_PAGES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Page Published', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPage(page1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.PAGES_API, page1); - }); - it('should create actions to create page failure', () => { - const errorMessage = 'Failed to create page'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPage(page1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.PAGES_API, page1); - }); - it('should create actions to create page success without any optional fields', () => { - const page = { ...page1 }; - page.categories = []; - page.authors = []; - page.tags = []; - page.medium = undefined; - page.status = 'draft'; - - const resp = { data: page }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: types.RESET_PAGES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Page added', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPage(page)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.PAGES_API, page); - }); - it('should create actions to create page success without any optional fields ready status', () => { - const page = { ...page1 }; - page.categories = []; - page.authors = []; - page.tags = []; - page.medium = undefined; - page.status = 'ready'; - - const resp = { data: page }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: types.RESET_PAGES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Page added & Ready to Publish', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPage(page)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.PAGES_API, page); - }); - it('should create actions to update page success', () => { - const data2 = { ...page1 }; - data2.status = 'draft'; - const resp = { data: data2 }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_PAGE, - payload: { - id: 1, - name: 'Page 1', - status: 'draft', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: { id: 41, name: 'Format 1' }, - medium: 51, - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Draft Saved', - time: Date.now(), - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePage(page1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.PAGES_API + '/1', page1); - }); - it('should create actions to update page success with ready status', () => { - const data2 = { ...page1 }; - data2.status = 'ready'; - const resp = { data: data2 }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_PAGE, - payload: { - id: 1, - name: 'Page 1', - status: 'ready', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: { id: 41, name: 'Format 1' }, - medium: 51, - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Draft saved & Ready to Publish', - time: Date.now(), - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePage(page1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.PAGES_API + '/1', page1); - }); - it('should create actions to update page failure', () => { - const errorMessage = 'Failed to update page'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePage(page1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.PAGES_API + '/1', page1); - }); - it('should create actions to update success without any optional fields', () => { - const page = { ...page1 }; - page.categories = []; - page.authors = []; - page.tags = []; - page.medium = undefined; - page.status = 'publish'; - - const resp = { data: page }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: types.ADD_PAGE, - payload: { - id: 1, - name: 'Page 1', - authors: [], - tags: [], - categories: [], - format: { id: 41, name: 'Format 1' }, - medium: undefined, - status: 'publish', - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Page Published', - time: Date.now(), - }, - }, - { - type: types.SET_PAGES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePage(page)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.PAGES_API + '/1', page); - }); - it('should create actions to delete page success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: types.RESET_PAGES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Page deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deletePage(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.PAGES_API + '/1'); - }); - it('should create actions to delete page failure', () => { - const errorMessage = 'Failed to delete page'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PAGES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deletePage(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.PAGES_API + '/1'); - }); -}); diff --git a/studio/src/__tests__/actions/policies.js b/studio/src/__tests__/actions/policies.js deleted file mode 100644 index ff7ebec1f..000000000 --- a/studio/src/__tests__/actions/policies.js +++ /dev/null @@ -1,464 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/policies'; -import * as types from '../../constants/policies'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, - total: 0, -}; - -describe('policies actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_POLICIES_LOADING, - payload: true, - }; - expect(actions.loadingPolicies()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_POLICIES_LOADING, - payload: false, - }; - expect(actions.stopPoliciesLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add policies list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addPoliciesAction = { - type: types.ADD_POLICIES, - payload: data, - }; - expect(actions.addPolicies(data)).toEqual(addPoliciesAction); - }); - it('should create an action to add policies request', () => { - const data = [{ query: 'query' }]; - const addPoliciesRequestAction = { - type: types.ADD_POLICIES_REQUEST, - payload: data, - }; - expect(actions.addPoliciesRequest(data)).toEqual(addPoliciesRequestAction); - }); - it('should create an action to reset policies', () => { - const resetPoliciesRequestAction = { - type: types.RESET_POLICIES, - }; - expect(actions.resetPolicies()).toEqual(resetPoliciesRequestAction); - }); - it('should create actions to fetch policies success', () => { - const query = { page: 1, limit: 5 }; - const policies = [{ id: 1, name: 'Policy' }]; - const resp = { data: { nodes: policies, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: types.ADD_POLICIES, - payload: [{ id: 1, name: 'Policy' }], - }, - { - type: types.ADD_POLICIES_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPolicies(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POLICIES_API, { - params: query, - }); - }); - it('should create actions to fetch policies failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPolicies(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POLICIES_API, { - params: query, - }); - }); - it('should create actions to get policy by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPolicy(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POLICIES_API + '/' + id); - }); - it('should create actions to get policy by id success', () => { - const id = 1; - const policy = { id, name: 'Policy' }; - const resp = { data: policy }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: types.GET_POLICY, - payload: { id, name: 'Policy' }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPolicy(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POLICIES_API + '/' + id); - }); - it('should create actions to create policy success', () => { - const policy = { name: 'Policy' }; - const resp = { data: policy }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: types.RESET_POLICIES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Policy created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createPolicy(policy)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POLICIES_API, policy); - }); - it('should create actions to create policy failure', () => { - const policy = { name: 'Policy' }; - const errorMessage = 'Failed to create policy'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createPolicy(policy)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POLICIES_API, policy); - }); - it('should create actions to update policy success', () => { - const policy = { id: 1, name: 'Policy' }; - const resp = { data: policy }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: types.UPDATE_POLICY, - payload: { id: 1, name: 'Policy' }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Policy updated', - time: Date.now(), - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePolicy(policy)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POLICIES_API + '/1', policy); - }); - it('should create actions to update policy failure', () => { - const policy = { id: 1, name: 'Policy' }; - const errorMessage = 'Failed to update policy'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePolicy(policy)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POLICIES_API + '/1', policy); - }); - it('should create actions to delete policy success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: types.RESET_POLICIES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Policy deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deletePolicy(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.POLICIES_API + '/1'); - }); - it('should create actions to delete policy failure', () => { - const errorMessage = 'Failed to delete policy'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deletePolicy(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.POLICIES_API + '/1'); - }); - it('should create actions to add policies list', () => { - const policies = [ - { id: 1, name: 'Policy' }, - { id: 2, name: 'Policy' }, - ]; - - const expectedActions = [ - { - type: types.ADD_POLICIES, - payload: [ - { id: 1, name: 'Policy' }, - { id: 2, name: 'Policy' }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addPolicies(policies)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty policies list', () => { - const policies = []; - - const expectedActions = [ - { - type: types.ADD_POLICIES, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addPolicies(policies)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add default policies success', () => { - const policies = [{ id: 1, name: 'Policy' }]; - const resp = { data: { nodes: policies, total: 1 } }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: types.ADD_POLICIES, - payload: [{ id: 1, name: 'Policy' }], - }, - { - type: types.ADD_POLICIES_REQUEST, - payload: { - data: [1], - total: 1, - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultPolicies()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POLICIES_API + '/default'); - }); - it('should create actions to add default policies failure', () => { - const errorMessage = 'Failed to add default policy'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POLICIES_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POLICIES_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultPolicies()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POLICIES_API + '/default'); - }); -}); diff --git a/studio/src/__tests__/actions/posts.js b/studio/src/__tests__/actions/posts.js deleted file mode 100644 index 2406c8e48..000000000 --- a/studio/src/__tests__/actions/posts.js +++ /dev/null @@ -1,1936 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/posts'; -import * as types from '../../constants/posts'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_MEDIA } from '../../constants/media'; -import { ADD_FORMATS } from '../../constants/formats'; -import { ADD_AUTHORS } from '../../constants/authors'; -import { ADD_TAGS } from '../../constants/tags'; -import { ADD_CATEGORIES } from '../../constants/categories'; -import { ADD_RATINGS } from '../../constants/ratings'; -import { ADD_CLAIMANTS } from '../../constants/claimants'; -import { ADD_CLAIMS } from '../../constants/claims'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -const post_without_id = { - name: 'Post 1', - authors: [{ id: 11, name: 'Author 1' }], - tags: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - categories: [ - { id: 31, name: 'category 31', medium: { id: 311, name: 'Category-Medium-311' } }, - { id: 32, name: 'category 32' }, - ], - format: { id: 41, name: 'Format 1' }, - medium: { id: 51, name: 'Medium 1' }, - claims: [ - { - id: 61, - name: 'Claim 1', - claimant: { id: 601, name: 'Claimant 1', medium: { id: 621, name: 'Medium-Claimant 1' } }, - rating: { id: 602, name: 'Rating 1', medium: { id: 622, name: 'Medium-Rating 1' } }, - }, - ], -}; - -const post = { - id: 1, - ...post_without_id, -}; - -const post2 = { - id: 2, - name: 'Post 2', - authors: [{ id: 12, name: 'Author 2' }], - tags: [ - { id: 21, name: 'Tag 21' }, - { id: 23, name: 'Tag 23' }, - { id: 24, name: 'Tag 24' }, - ], - categories: [ - { id: 33, name: 'category 33' }, - { id: 34, name: 'category 34' }, - ], - format: { id: 42, name: 'Format 2' }, - medium: { id: 52, name: 'Medium 2' }, -}; -const post_without_media = { - id: 123, - name: 'Post 1', - authors: [{ id: 11, name: 'Author 1' }], - tags: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - categories: [ - { id: 31, name: 'category 31', medium: { id: 311, name: 'Category-Medium-311' } }, - { id: 32, name: 'category 32' }, - ], - format: { id: 41, name: 'Format 1' }, - claims: [ - { - id: 61, - name: 'Claim 1', - claimant: { id: 601, name: 'Claimant 1', medium: { id: 621, name: 'Medium-Claimant 1' } }, - rating: { id: 602, name: 'Rating 1', medium: { id: 622, name: 'Medium-Rating 1' } }, - }, - ], -}; -describe('posts actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_POSTS_LOADING, - payload: true, - }; - expect(actions.loadingPosts()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_POSTS_LOADING, - payload: false, - }; - expect(actions.stopPostsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add posts list', () => { - const data = [post, post2]; - - const addPostsAction = { - type: types.ADD_POSTS, - payload: data, - }; - expect(actions.addPostsList(data)).toEqual(addPostsAction); - }); - it('should create an action to add posts request', () => { - const data = [{ query: 'query' }]; - const addPostsRequestAction = { - type: types.ADD_POSTS_REQUEST, - payload: data, - }; - expect(actions.addPostsRequest(data)).toEqual(addPostsRequestAction); - }); - it('should create an action to add post', () => { - const data = post; - const addPostsRequestAction = { - type: types.ADD_POST, - payload: data, - }; - expect(actions.getPostByID(data)).toEqual(addPostsRequestAction); - }); - it('should create an action to reset posts', () => { - const resetPostsRequestAction = { - type: types.RESET_POSTS, - }; - expect(actions.resetPosts()).toEqual(resetPostsRequestAction); - }); - it('should create actions to fetch posts success', () => { - const query = { - page: 1, - limit: 5, - q: 'post', - sort: 'asc', - tag: [21], - category: [33], - format: [42], - status: 'draft', - author: [11], - }; - const posts = [{ ...post, status: 'draft' }]; - const resp = { data: { nodes: posts, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POSTS, - payload: [ - { - id: 1, - name: 'Post 1', - status: 'draft', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - ], - }, - { - type: types.ADD_POSTS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams( - 'category=33&tag=21&format=42&page=1&limit=5&sort=asc&q=post&status=draft&author=11', - ); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPosts(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API, { - params: params, - }); - }); - it('should create actions to fetch posts success without page and limit ', () => { - const query = { - q: 'post', - sort: 'asc', - tag: [21], - category: [33], - format: [42], - status: 'publish', - }; - const posts = [{ ...post, status: 'publish' }]; - const resp = { data: { nodes: posts, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POSTS, - payload: [ - { - id: 1, - name: 'Post 1', - status: 'publish', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - ], - }, - { - type: types.ADD_POSTS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams( - 'category=33&tag=21&format=42&sort=asc&q=post&status=publish', - ); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPosts(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API, { - params: params, - }); - }); - it('should create actions to fetch posts success without any optional fields', () => { - const query = { page: 1, limit: 5 }; - const post_without_fields = { ...post, status: 'ready' }; - post_without_fields.categories = []; - post_without_fields.authors = []; - post_without_fields.tags = []; - post_without_fields.claims = []; - post_without_fields.medium = undefined; - - const resp = { data: { nodes: [post_without_fields], total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CLAIMANTS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_RATINGS, - payload: [], - }, - { - type: ADD_CLAIMS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_POSTS, - payload: [ - { - id: 1, - name: 'Post 1', - status: 'ready', - authors: [], - tags: [], - categories: [], - format: 41, - medium: undefined, - claims: [], - }, - ], - }, - { - type: types.ADD_POSTS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const params = new URLSearchParams('page=1&limit=5'); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPosts(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API, { - params: params, - }); - }); - it('should throw error on fetch posts without required field format', () => { - const { format, ...post_without_author } = post; - const posts = [post_without_author]; - const resp = { data: { nodes: posts, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const query = { page: 1, limit: 5 }; - const store = mockStore({ initialState }); - const params = new URLSearchParams('page=1&limit=5'); - - store.dispatch(actions.getPosts(query)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API, { - params: params, - }); - }); - it('should create actions to fetch posts failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - const params = new URLSearchParams('page=1&limit=5'); - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPosts(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API, { - params: params, - }); - }); - it('should create actions to get post by id success', () => { - const id = 1; - const resp = { data: post }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPost(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API + '/' + id); - }); - it('should create actions to get post by id success without any optional fields', () => { - const post_without_fields = { ...post }; - post_without_fields.categories = []; - post_without_fields.authors = []; - post_without_fields.tags = []; - post_without_fields.claims = []; - post_without_fields.medium = undefined; - - const id = 1; - const resp = { data: post_without_fields }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CLAIMANTS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_RATINGS, - payload: [], - }, - { - type: ADD_CLAIMS, - payload: [], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [], - tags: [], - categories: [], - format: 41, - medium: undefined, - claims: [], - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPost(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API + '/' + id); - }); - it('should throw error on get post by id without required field format', () => { - const { format, ...post_without_format } = post; - - const id = 1; - const resp = { data: post_without_format }; - axios.get.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - store.dispatch(actions.getPost(id)).catch((err) => expect(err).toBeInstanceOf(TypeError)); - - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API + '/' + id); - }); - it('should create actions to get post by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getPost(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.POSTS_API + '/' + id); - }); - it('should create actions to create post success', () => { - const data2 = { ...post }; - data2.status = 'publish'; - const resp = { data: data2 }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.RESET_POSTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Format 1 Published', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPost(post_without_id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API, post_without_id); - }); - it('should create actions to create post success without any optional fields', () => { - const post_without_fields = { ...post }; - post_without_fields.categories = []; - post_without_fields.authors = []; - post_without_fields.tags = []; - post_without_fields.claims = []; - post_without_fields.medium = undefined; - post_without_fields.status = 'draft'; - const resp = { data: post_without_fields }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CLAIMANTS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_RATINGS, - payload: [], - }, - { - type: ADD_CLAIMS, - payload: [], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.RESET_POSTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Post added', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPost(post_without_fields)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API, post_without_fields); - }); - it('should throw error on create post without required field format', () => { - const { format, ...post_without_format } = post; - - const resp = { data: post_without_format }; - axios.post.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPost(post_without_id)) - .catch((err) => expect(err).toBeInstanceOf(TypeError)); - - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API, post_without_id); - }); - it('should create actions to create post failure', () => { - const errorMessage = 'Failed to create post'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addPost(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API, post); - }); - it('should create actions to update post success', () => { - const data2 = { ...post }; - data2.status = 'draft'; - const resp = { data: data2 }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - status: 'draft', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Draft Saved', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePost(data2)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1', data2); - }); - it('should create actions to publish post success', () => { - const resp = { data: post }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Post published', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.publishPost(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1' + '/publish', post); - }); - it('should create actions to publish post success without medium', () => { - const resp = { data: post_without_media }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 123, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Post published', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.publishPost(post_without_media)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith( - types.POSTS_API + '/123' + '/publish', - post_without_media, - ); - }); - it('should create actions to publish success', () => { - const resp = { data: post }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Post published', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.publish(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API + '/publish', post); - }); - it('should create actions to publish success without medium', () => { - const resp = { data: post_without_media }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 123, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Post published', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.publish(post_without_media)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API + '/publish', post_without_media); - }); - - it('should create actions to publish failure', () => { - const errorMessage = 'Failed to publish post'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.publish(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API + '/publish', post); - }); - - it('should create actions to template success', () => { - const resp = { data: post }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 51, name: 'Medium 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - medium: 51, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Template created', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addTemplate(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API + '/templates', post); - }); - - it('should create actions to template success without medium', () => { - const resp = { data: post_without_media }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [ - { id: 21, name: 'Tag 21' }, - { id: 22, name: 'Tag 22' }, - ], - }, - { - type: ADD_MEDIA, - payload: [{ id: 311, name: 'Category-Medium-311' }], - }, - { - type: ADD_CATEGORIES, - payload: [ - { id: 31, name: 'category 31', medium: 311 }, - { id: 32, name: 'category 32', medium: undefined }, - ], - }, - { - type: ADD_AUTHORS, - payload: [{ id: 11, name: 'Author 1' }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 621, name: 'Medium-Claimant 1' }], - }, - { - type: ADD_CLAIMANTS, - payload: [{ id: 601, name: 'Claimant 1', medium: 621 }], - }, - { - type: ADD_MEDIA, - payload: [{ id: 622, name: 'Medium-Rating 1' }], - }, - { - type: ADD_RATINGS, - payload: [{ id: 602, name: 'Rating 1', medium: 622 }], - }, - { - type: ADD_CLAIMS, - payload: [{ id: 61, name: 'Claim 1', claimant: 601, rating: 602 }], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 123, - name: 'Post 1', - authors: [11], - tags: [21, 22], - categories: [31, 32], - format: 41, - claims: [61], - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Template created', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addTemplate(post_without_media)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API + '/templates', post_without_media); - }); - - it('should create actions to template failure', () => { - const errorMessage = 'Failed to publish post'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addTemplate(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.POSTS_API + '/templates', post); - }); - - it('should create actions to update success without any optional fields', () => { - const post_without_fields = { ...post }; - post_without_fields.categories = []; - post_without_fields.authors = []; - post_without_fields.tags = []; - post_without_fields.claims = []; - post_without_fields.medium = undefined; - post_without_fields.status = 'publish'; - - const resp = { data: post_without_fields }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CLAIMANTS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_RATINGS, - payload: [], - }, - { - type: ADD_CLAIMS, - payload: [], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [], - tags: [], - categories: [], - format: 41, - medium: undefined, - claims: [], - status: 'publish', - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Format 1 Published', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePost(post_without_fields)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1', post_without_fields); - }); - it('should create actions to update success without any optional fields with ready status', () => { - const post_without_fields = { ...post }; - post_without_fields.categories = []; - post_without_fields.authors = []; - post_without_fields.tags = []; - post_without_fields.claims = []; - post_without_fields.medium = undefined; - post_without_fields.status = 'ready'; - - const resp = { data: post_without_fields }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_TAGS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CATEGORIES, - payload: [], - }, - { - type: ADD_AUTHORS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_CLAIMANTS, - payload: [], - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: ADD_RATINGS, - payload: [], - }, - { - type: ADD_CLAIMS, - payload: [], - }, - { - type: ADD_FORMATS, - payload: [{ id: 41, name: 'Format 1' }], - }, - { - type: types.ADD_POST, - payload: { - id: 1, - name: 'Post 1', - authors: [], - tags: [], - categories: [], - format: 41, - medium: undefined, - claims: [], - status: 'ready', - }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Draft saved & Ready to Publish', - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePost(post_without_fields)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1', post_without_fields); - }); - it('should throw error on update post without required field format', () => { - const { format, ...post_without_format } = post; - - const resp = { data: post_without_format }; - axios.put.mockResolvedValue(resp); - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePost(post_without_format)) - .catch((err) => expect(err).toBeInstanceOf(TypeError)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1', post_without_format); - }); - it('should create actions to update post failure', () => { - const errorMessage = 'Failed to update post'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updatePost(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1', post); - }); - it('should create actions to publish post failure', () => { - const errorMessage = 'Failed to publish post'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_POSTS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.publishPost(post)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.POSTS_API + '/1' + '/publish', post); - }); - it('should create actions to delete post success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: types.RESET_POSTS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Post deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deletePost(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.POSTS_API + '/1'); - }); - it('should create actions to delete post failure', () => { - const errorMessage = 'Failed to delete post'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_POSTS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deletePost(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.POSTS_API + '/1'); - }); -}); diff --git a/studio/src/__tests__/actions/profile.js b/studio/src/__tests__/actions/profile.js deleted file mode 100644 index ba00d9a75..000000000 --- a/studio/src/__tests__/actions/profile.js +++ /dev/null @@ -1,152 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/profile'; -import * as types from '../../constants/profile'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - details: {}, - loading: true, -}; - -describe('profile actions', () => { - let store; - beforeEach(() => { - store = mockStore({ initialState }); - }); - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_PROFILE_LOADING, - payload: true, - }; - expect(actions.loadingProfile()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_PROFILE_LOADING, - payload: false, - }; - expect(actions.stopProfileLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to ADD_PROFILE', () => { - const data = { id: 1, email: 'abc@gmail.com', first_name: 'abc' }; - const addProfileAction = { - type: types.ADD_PROFILE, - payload: data, - }; - expect(actions.getProfile(data)).toEqual(addProfileAction); - }); - it('should create actions to fetch user profile success', () => { - const profile = { id: 1, email: 'abc@gmail.com', first_name: 'abc' }; - const resp = { data: profile }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PROFILE_LOADING, - payload: true, - }, - { - type: types.ADD_PROFILE, - payload: { id: 1, email: 'abc@gmail.com', first_name: 'abc' }, - }, - { - type: types.SET_PROFILE_LOADING, - payload: false, - }, - ]; - store - .dispatch(actions.getUserProfile()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PROFILE_API); - }); - it('should create actions to fetch user profile failure', () => { - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PROFILE_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - store - .dispatch(actions.getUserProfile()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.PROFILE_API); - }); - it('should create actions to update profile success', () => { - const profile = { id: 1, email: 'abc@gmail.com', first_name: 'abc' }; - const resp = { data: profile }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_PROFILE_LOADING, - payload: true, - }, - { - type: types.ADD_PROFILE, - payload: { id: 1, email: 'abc@gmail.com', first_name: 'abc' }, - }, - { - type: types.SET_PROFILE_LOADING, - payload: false, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Profile Updated', - time: Date.now(), - }, - }, - ]; - store - .dispatch(actions.updateProfile(profile)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.PROFILE_API, profile); - }); - it('should create actions to update profile failure', () => { - const profile = { id: 1, email: 'abc@gmail.com', first_name: 'abc' }; - const errorMessage = 'Unable to update profile'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_PROFILE_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - store - .dispatch(actions.updateProfile(profile)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.PROFILE_API, profile); - }); -}); diff --git a/studio/src/__tests__/actions/ratings.js b/studio/src/__tests__/actions/ratings.js deleted file mode 100644 index 7aaf81084..000000000 --- a/studio/src/__tests__/actions/ratings.js +++ /dev/null @@ -1,662 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/ratings'; -import * as types from '../../constants/ratings'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_MEDIA } from '../../constants/media'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, - total: 0, -}; - -describe('ratings actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_RATINGS_LOADING, - payload: true, - }; - expect(actions.loadingRatings()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_RATINGS_LOADING, - payload: false, - }; - expect(actions.stopRatingsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add ratings list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addRatingsAction = { - type: types.ADD_RATINGS, - payload: data, - }; - expect(actions.addRatingsList(data)).toEqual(addRatingsAction); - }); - it('should create an action to add ratings request', () => { - const data = [{ query: 'query' }]; - const addRatingsRequestAction = { - type: types.ADD_RATINGS_REQUEST, - payload: data, - }; - expect(actions.addRatingsRequest(data)).toEqual(addRatingsRequestAction); - }); - it('should create an action to reset ratings', () => { - const resetRatingsAction = { - type: types.RESET_RATINGS, - }; - expect(actions.resetRatings()).toEqual(resetRatingsAction); - }); - it('should create actions to fetch ratings with none having media', () => { - const query = { page: 1, limit: 5 }; - const ratings = [{ id: 1, name: 'Rating' }]; - const resp = { data: { nodes: ratings, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_RATINGS, - payload: [{ id: 1, name: 'Rating', medium: undefined }], - }, - { - type: types.ADD_RATINGS_REQUEST, - payload: { - data: [1], - query: query, - total: 2, - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRatings(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API, { - params: query, - }); - }); - it('should create actions to fetch ratings success with some having media', () => { - const query = { page: 1, limit: 5 }; - const ratings = [ - { id: 1, name: 'Rating 1', medium: { id: 10, medium: 'Medium 1' } }, - { id: 2, name: 'Rating 2' }, - ]; - const resp = { data: { nodes: ratings, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [{ id: 10, medium: 'Medium 1' }], - }, - { - type: types.ADD_RATINGS, - payload: [ - { id: 1, name: 'Rating 1', medium: 10 }, - { id: 2, name: 'Rating 2', medium: undefined }, - ], - }, - { - type: types.ADD_RATINGS_REQUEST, - payload: { - data: [1, 2], - query: query, - total: 2, - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRatings(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API, { - params: query, - }); - }); - it('should create actions to fetch ratings success with all having media', () => { - const query = { page: 1, limit: 5 }; - const ratings = [ - { id: 1, name: 'Rating 1', medium: { id: 10, medium: 'Medium 1' } }, - { id: 2, name: 'Rating 2', medium: { id: 20, medium: 'Medium 2' } }, - ]; - const resp = { data: { nodes: ratings, total: 2 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [ - { id: 10, medium: 'Medium 1' }, - { id: 20, medium: 'Medium 2' }, - ], - }, - { - type: types.ADD_RATINGS, - payload: [ - { id: 1, name: 'Rating 1', medium: 10 }, - { id: 2, name: 'Rating 2', medium: 20 }, - ], - }, - { - type: types.ADD_RATINGS_REQUEST, - payload: { - data: [1, 2], - query: query, - total: 2, - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRatings(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API, { - params: query, - }); - }); - it('should create actions to fetch ratings failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRatings(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API, { - params: query, - }); - }); - it('should create actions to get rating by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRating(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API + '/' + id); - }); - it('should create actions to get rating by id without medium', () => { - const id = 1; - const rating = { id, name: 'Rating' }; - const resp = { data: rating }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: types.GET_RATING, - payload: { id, name: 'Rating', medium: undefined }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRating(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API + '/' + id); - }); - it('should create actions to get rating by id with medium', () => { - const id = 1; - const medium = { id: 1, medium: 'Medium' }; - const rating = { id, name: 'Rating', medium }; - const resp = { data: rating }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.GET_RATING, - payload: { id, name: 'Rating', medium: 1 }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getRating(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.RATINGS_API + '/' + id); - }); - it('should create actions to create rating success', () => { - const rating = { name: 'Rating' }; - const resp = { data: rating }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: types.RESET_RATINGS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Rating created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createRating(rating)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.RATINGS_API, rating); - }); - it('should create actions to create rating failure', () => { - const rating = { name: 'Rating' }; - const errorMessage = 'Failed to create rating'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createRating(rating)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.RATINGS_API, rating); - }); - it('should create actions to update rating without medium', () => { - const rating = { id: 1, name: 'Rating' }; - const resp = { data: rating }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: types.UPDATE_RATING, - payload: { id: 1, name: 'Rating', medium: undefined }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Rating updated', - time: Date.now(), - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateRating(rating)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.RATINGS_API + '/1', rating); - }); - it('should create actions to update rating with medium', () => { - const medium = { id: 4, name: 'medium' }; - const rating = { id: 1, name: 'Rating', medium: medium }; - const resp = { data: rating }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.UPDATE_RATING, - payload: { id: 1, name: 'Rating', medium: 4 }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Rating updated', - time: Date.now(), - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateRating(rating)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.RATINGS_API + '/1', rating); - }); - it('should create actions to update rating failure', () => { - const rating = { id: 1, name: 'Rating' }; - const errorMessage = 'Failed to update rating'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateRating(rating)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.RATINGS_API + '/1', rating); - }); - it('should create actions to delete rating success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: types.RESET_RATINGS, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteRating(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.RATINGS_API + '/1'); - }); - it('should create actions to delete rating failure', () => { - const errorMessage = 'Failed to delete rating'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteRating(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.RATINGS_API + '/1'); - }); - it('should create actions to add ratings list with none having medium', () => { - const ratings = [ - { id: 1, name: 'Rating' }, - { id: 2, name: 'Rating 2' }, - ]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_RATINGS, - payload: [ - { id: 1, name: 'Rating', medium: undefined }, - { id: 2, name: 'Rating 2', medium: undefined }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addRatings(ratings)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add ratings list with some having medium', () => { - const medium = { id: 4, name: 'medium' }; - const ratings = [ - { id: 1, name: 'Rating' }, - { id: 2, name: 'Rating 2', medium: medium }, - ]; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [medium], - }, - { - type: types.ADD_RATINGS, - payload: [ - { id: 1, name: 'Rating', medium: undefined }, - { id: 2, name: 'Rating 2', medium: 4 }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addRatings(ratings)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty ratings list', () => { - const ratings = []; - - const expectedActions = [ - { - type: ADD_MEDIA, - payload: [], - }, - { - type: types.ADD_RATINGS, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addRatings(ratings)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add default ratings success', () => { - const ratings = [{ id: 1, name: 'Rating' }]; - const resp = { data: { nodes: ratings, total: 1 } }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: types.ADD_RATINGS, - payload: [{ id: 1, name: 'Rating', medium: undefined }], - }, - { - type: types.ADD_RATINGS_REQUEST, - payload: { - data: [1], - total: 1, - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultRatings()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.RATINGS_API + '/default'); - }); - it('should create actions to add default ratings failure', () => { - const errorMessage = 'Failed to add default rating'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_RATINGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_RATINGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addDefaultRatings()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.RATINGS_API + '/default'); - }); -}); diff --git a/studio/src/__tests__/actions/sachFactChecks.js b/studio/src/__tests__/actions/sachFactChecks.js deleted file mode 100644 index 5025f8760..000000000 --- a/studio/src/__tests__/actions/sachFactChecks.js +++ /dev/null @@ -1,102 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/sachFactChecks'; -import * as types from '../../constants/sachFactChecks'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - details: [], - loading: true, -}; - -const factcheck = { - claims: [ - { - claimant: 'Daily Express', - claimdate: '2017-02-16T00:00:00Z', - claimreview: [ - { - languagecode: 'en', - reviewdate: '2017-02-16T00:00:00Z', - textualrating: - 'The estimates suggest this happened, but it’s uncertain. The changes in the ONS’ best estimates weren’t big enough for us to be sure there was any real change.', - title: - 'Reports on employment figures are accurate, but not the whole picture - Full Fact', - url: - 'https://fullfact.org/immigration/reports-employment-figures-are-accurate-not-whole-picture/', - }, - ], - id: '62a03199a5f38940ad71ba7d', - text: 'The number of British-born workers has fallen.', - }, - { - claimant: 'Daily Express', - claimdate: '2017-02-15T00:00:00Z', - claimreview: [ - { - languagecode: 'en', - reviewdate: '2017-02-16T00:00:00Z', - textualrating: - 'That’s correct. The ONS’ best estimate for the number of non-UK born workers rose by 431,000 between the end of 2015 and the end of 2016.', - title: - 'Reports on employment figures are accurate, but not the whole picture - Full Fact', - url: - 'https://fullfact.org/immigration/reports-employment-figures-are-accurate-not-whole-picture/', - }, - ], - id: '62a0319aa5f38940ad71c04b', - text: 'There are another 431,000 foreign born workers in the UK.', - }, - ], - date: '2017-02-16T00:00:00Z', - humanlanguage: 'en', - id: '62a0405ffa2840264aa24f27', - pageurl: - 'https://fullfact.org/immigration/reports-employment-figures-are-accurate-not-whole-picture/', - publisher: { - name: 'Full Fact', - site: 'fullfact.org', - }, - sitename: 'Full Fact', - tags: ['employment', 'United Kingdom'], - text: - 'That’s correct. The ONS’ best estimate for the number of non-UK born workers rose by 431,000 between the end of 2015 and the end of 2016.\n“Another 431,000 migrants working in Britain”\nDaily Express, paper edition, 16 February 2017\n“British-born workers PLUNGE as foreign workers RISE by 431,000”\nDaily Express, online edition, 16 February 2017\nSeveral media outlets reported the most recent set of employment figures this morning, and the Daily Express featured the story on its front page. The figures reported are correct, but there’s a lot of uncertainty around some of the latest changes.\nThe good news is we haven’t seen anyone make the kind of mistakes we’ve seen in the past when it comes to reporting employment figures.\nAs the Office for National Statistics says prominently, these statistics don’t tell us how many people have lost jobs or how many people have got a new one, they just tell us the final change in the headcount of people who have jobs.\nThese estimates are very uncertain\nThe UK had 431,000 more foreign-born workers at the end of 2016 than it had a year beforehand, according to estimates from the Office for National Statistics (ONS).\nMeanwhile, its estimate for the number of workers born inside the UK dropped by 120,000.\nSo foreign-born workers rose in number while British born workers fell? Not quite.\nThe difference between these two changes is that the first is big enough for us to be confident it’s genuine, the second isn’t.\nThe estimates are based on a survey, so there’s a grey area around the ONS’ best estimate for the numbers of different groups of workers.\nThe estimate for UK-born workers and UK nationals in work would have to change by more than 200,000 for us to be reasonably confident that we were seeing a genuine change in the real world.\nThat may sound like a surprisingly big margin. But remember: there are an estimated 26 million UK-born workers or 28 million UK citizens in work. A change of less than 200,000 is difficult to detect with a lot of confidence, based on these figures.\nThere’s more than one definition of ‘foreigner’\nThe Office for National Statistics puts out employment figures for two groups which you might associate with the word, ‘foreigner’:\nPeople born inside / outside the UK\nUK / non-UK nationals\nThe estimated number of British-born workers didn’t ‘plunge’ on both definitions.\nThe best estimate for the number of UK-born workers fell by 120,000, and rose by 70,000 for UK nationals. Like before, these changes are too small for us to be confident they’ve actually happened.', - title: 'Reports on employment figures are accurate, but not the whole picture', - translation: {}, -}; - -describe('sach fact-checks action', () => { - // testing the loadingSachFactChecks action - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_SACH_FACT_CHECKS_LOADING, - payload: true, - }; - expect(actions.loadingSachFactChecks()).toEqual(startLoadingAction); - }); - - // testing the stopLoading fact check action - it('should create an action to stop loading', () => { - const stopLoadingAction = { - type: types.SET_SACH_FACT_CHECKS_LOADING, - payload: false, - }; - expect(actions.stopLoading()).toEqual(stopLoadingAction); - }); - - //testing it addFactChecks action - it('should create an action to add fact checks', () => { - const addFactChecksAction = { - type: types.ADD_SACH_FACT_CHECKS, - payload: [factcheck], - }; - expect(actions.addFactChecks([factcheck])).toEqual(addFactChecksAction); - }); -}); diff --git a/studio/src/__tests__/actions/search.js b/studio/src/__tests__/actions/search.js deleted file mode 100644 index 751fd1fb8..000000000 --- a/studio/src/__tests__/actions/search.js +++ /dev/null @@ -1,93 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import * as actions from '../../actions/search'; -import * as types from '../../constants/search'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); -const initialState = { - req: [], - details: { - articles: [], - 'fact-checks': [], - pages: [], - claims: [], - tags: [], - categories: [], - media: [], - ratings: [], - total: 0, - }, - loading: true, -}; - -describe('search actions', () => { - it('should create actions to fetch search details success', () => { - const query = { page: 1, limit: 5 }; - const resp = { - data: [ - { name: 'new claim', kind: 'claim' }, - { name: 'new media', kind: 'medium' }, - ], - }; - axios.post.mockResolvedValue(resp); - const expectedActions = [ - { - type: types.SET_SEARCH_DETAILS_LOADING, - payload: true, - }, - { - type: types.ADD_SEARCH_DETAIL, - payload: { - data: [ - { name: 'new claim', kind: 'claim' }, - { name: 'new media', kind: 'medium' }, - ], - formats: { 0: { slug: 'article' } }, - }, - }, - { - type: types.SET_SEARCH_DETAILS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ ...initialState, formats: { details: { 0: { slug: 'article' } } } }); - store - .dispatch(actions.getSearchDetails(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.SEARCH_DETAILS_API, query); - }); - - it('should create actions to fetch search details failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'search failed'; - axios.post.mockRejectedValue(new Error(errorMessage)); - const expectedActions = [ - { - type: types.SET_SEARCH_DETAILS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_SEARCH_DETAILS_LOADING, - payload: false, - }, - ]; - const store = mockStore({ ...initialState, formats: { details: { 0: { slug: 'article' } } } }); - store - .dispatch(actions.getSearchDetails(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.SEARCH_DETAILS_API, query); - }); -}); diff --git a/studio/src/__tests__/actions/sidebar.js b/studio/src/__tests__/actions/sidebar.js deleted file mode 100644 index ab31f3b11..000000000 --- a/studio/src/__tests__/actions/sidebar.js +++ /dev/null @@ -1,39 +0,0 @@ -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/sidebar'; -import * as types from '../../constants/sidebar'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); - -const initialState = { - collapsed: false, -}; - -describe('sidebar reducer', () => { - it('should create an action to SET_COLLAPSE to true', () => { - const collapsed = true; - const setCollapseAction = [ - { - type: types.SET_COLLAPSE, - payload: true, - }, - ]; - const store = mockStore({ initialState }); - store.dispatch(actions.setCollapse(collapsed)); - expect(store.getActions()).toEqual(setCollapseAction); - }); - it('should create an action to SET_COLLAPSE to false', () => { - const collapsed = false; - const setCollapseAction = [ - { - type: types.SET_COLLAPSE, - payload: false, - }, - ]; - const store = mockStore({ initialState }); - store.dispatch(actions.setCollapse(collapsed)); - expect(store.getActions()).toEqual(setCollapseAction); - }); -}); diff --git a/studio/src/__tests__/actions/spaces.js b/studio/src/__tests__/actions/spaces.js deleted file mode 100644 index c3fc885ca..000000000 --- a/studio/src/__tests__/actions/spaces.js +++ /dev/null @@ -1,305 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/spaces'; -import * as types from '../../constants/spaces'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - orgs: [], - details: {}, - loading: true, - selected: 0, -}; - -describe('spaces actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.LOADING_SPACES, - }; - expect(actions.loadingSpaces()).toEqual(startLoadingAction); - }); - it('should create an action to add spaces list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addSpacesAction = { - type: types.GET_SPACES_SUCCESS, - payload: data, - }; - expect(actions.getSpacesSuccess(data)).toEqual(addSpacesAction); - }); - it('should create an action to add empty space list', () => { - const data = []; - const addSpacesAction = { - type: types.GET_SPACES_SUCCESS, - payload: [], - }; - expect(actions.getSpacesSuccess(data)).toEqual(addSpacesAction); - }); - it('should create an action to add space', () => { - const data = { id: 1, name: 'tester 1' }; - const addSpaceAction = { - type: types.ADD_SPACE_SUCCESS, - payload: data, - }; - expect(actions.addSpaceSuccess(data)).toEqual(addSpaceAction); - }); - it('should create an action to delete space', () => { - const deleteSpaceAction = { - type: types.DELETE_SPACE_SUCCESS, - payload: 1, - }; - expect(actions.deleteSpaceSuccess(1)).toEqual(deleteSpaceAction); - }); - it('should create an action to update space', () => { - const data = { id: 1, name: 'tester 1' }; - const updateSpaceAction = { - type: types.UPDATE_SPACE_SUCCESS, - payload: data, - }; - expect(actions.updateSpaceSuccess(data)).toEqual(updateSpaceAction); - }); - it('should create actions to fetch spaces success', () => { - const spaces = [{ id: 1, name: 'Space' }]; - const resp = { data: spaces }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: types.GET_SPACES_SUCCESS, - payload: spaces, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getSpaces()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.API_GET_SPACES); - }); - it('should create actions to fetch spaces failure', () => { - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getSpaces()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.API_GET_SPACES); - }); - it('should create actions to create space success', () => { - const space = { name: 'Space' }; - const resp = { data: space }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: types.ADD_SPACE_SUCCESS, - payload: space, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Space added', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addSpace(space)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.API_ADD_SPACE, space); - }); - it('should create actions to create space failure', () => { - const space = { name: 'Space' }; - const errorMessage = 'Failed to create space'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addSpace(space)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.API_ADD_SPACE, space); - }); - it('should create actions to update space success', () => { - const space = { id: 1, name: 'Space' }; - const resp = { data: space }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: types.UPDATE_SPACE_SUCCESS, - payload: space, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Space updated', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateSpace(space)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.API_UPDATE_SPACE + '/1', space); - }); - it('should create actions to update space failure', () => { - const space = { id: 1, name: 'Space' }; - const errorMessage = 'Failed to update space'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateSpace(space)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.API_UPDATE_SPACE + '/1', space); - }); - it('should create actions to delete space success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: types.DELETE_SPACE_SUCCESS, - payload: 1, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Space deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteSpace(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.API_DELETE_SPACE + '/1'); - }); - it('should create actions to delete space failure', () => { - const errorMessage = 'Failed to delete space'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.LOADING_SPACES, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteSpace(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.API_DELETE_SPACE + '/1'); - }); - it('should create actions to set selected space', () => { - const space = { id: 1, name: 'Space' }; - - const expectedActions = [ - { - type: types.SET_SELECTED_SPACE, - payload: space, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Space changed', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.setSelectedSpace(space)); - expect(store.getActions()).toEqual(expectedActions); - }); -}); diff --git a/studio/src/__tests__/actions/tags.js b/studio/src/__tests__/actions/tags.js deleted file mode 100644 index 6a050c3de..000000000 --- a/studio/src/__tests__/actions/tags.js +++ /dev/null @@ -1,408 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/tags'; -import * as types from '../../constants/tags'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('tags actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_TAGS_LOADING, - payload: true, - }; - expect(actions.loadingTags()).toEqual(startLoadingAction); - }); - - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_TAGS_LOADING, - payload: false, - }; - expect(actions.stopTagsLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add tags list', () => { - const data = [ - { id: 1, name: 'tester 1' }, - { id: 2, name: 'testing 2' }, - ]; - - const addTagsAction = { - type: types.ADD_TAGS, - payload: data, - }; - expect(actions.addTags(data)).toEqual(addTagsAction); - }); - it('should create an action to add tags request', () => { - const data = [{ query: 'query' }]; - const addTagsRequestAction = { - type: types.ADD_TAGS_REQUEST, - payload: data, - }; - expect(actions.addTagsRequest(data)).toEqual(addTagsRequestAction); - }); - it('should create an action to reset tags', () => { - const resetTagsRequestAction = { - type: types.RESET_TAGS, - }; - expect(actions.resetTags()).toEqual(resetTagsRequestAction); - }); - it('should create actions to fetch tags success', () => { - const query = { page: 1, limit: 5 }; - const tags = [{ id: 1, name: 'Tag' }]; - const resp = { data: { nodes: tags, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: types.ADD_TAGS, - payload: [{ id: 1, name: 'Tag' }], - }, - { - type: types.ADD_TAGS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_TAGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getTags(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.TAGS_API, { - params: query, - }); - }); - it('should create actions to fetch tags failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_TAGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getTags(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.TAGS_API, { - params: query, - }); - }); - it('should create actions to get tag by id success', () => { - const id = 1; - const tag = { id, name: 'Tag' }; - const resp = { data: tag }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: types.GET_TAG, - payload: { id, name: 'Tag' }, - }, - { - type: types.SET_TAGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getTag(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.TAGS_API + '/' + id); - }); - it('should create actions to get tag by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_TAGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getTag(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.TAGS_API + '/' + id); - }); - it('should not create actions for fetching tag when spaceID is 0 ', () => { - const query = { page: 1, limit: 5 }; - const expectedActions = []; - const store = mockStore({ ...initialState, spaces: { selected: 0 } }); - store.dispatch(actions.getTags(query)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to create tag success', () => { - const tag = { name: 'Tag' }; - const resp = { data: tag }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: types.RESET_TAGS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Tag created', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createTag(tag)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.TAGS_API, tag); - }); - it('should create actions to create tag failure', () => { - const tag = { name: 'Tag' }; - const errorMessage = 'Failed to create tag'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.createTag(tag)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.TAGS_API, tag); - }); - it('should create actions to update tag success', () => { - const tag = { id: 1, name: 'Tag' }; - const resp = { data: tag }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: types.UPDATE_TAG, - payload: { id: 1, name: 'Tag' }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Tag updated', - time: Date.now(), - }, - }, - { - type: types.SET_TAGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateTag(tag)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.TAGS_API + '/1', tag); - }); - it('should create actions to update tag failure', () => { - const tag = { id: 1, name: 'Tag' }; - const errorMessage = 'Failed to update tag'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_TAGS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateTag(tag)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.TAGS_API + '/1', tag); - }); - it('should create actions to delete tag success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: types.RESET_TAGS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Tag deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteTag(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.TAGS_API + '/1'); - }); - it('should create actions to delete tag failure', () => { - const errorMessage = 'Failed to delete tag'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_TAGS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteTag(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.TAGS_API + '/1'); - }); - it('should create actions to add tags list', () => { - const tags = [ - { id: 1, name: 'Tag' }, - { id: 2, name: 'Tag' }, - ]; - - const expectedActions = [ - { - type: types.ADD_TAGS, - payload: [ - { id: 1, name: 'Tag' }, - { id: 2, name: 'Tag' }, - ], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addTags(tags)); - expect(store.getActions()).toEqual(expectedActions); - }); - it('should create actions to add empty tags list', () => { - const tags = []; - - const expectedActions = [ - { - type: types.ADD_TAGS, - payload: [], - }, - ]; - - const store = mockStore({ initialState }); - store.dispatch(actions.addTags(tags)); - expect(store.getActions()).toEqual(expectedActions); - }); -}); diff --git a/studio/src/__tests__/actions/users.js b/studio/src/__tests__/actions/users.js deleted file mode 100644 index 50a3044fd..000000000 --- a/studio/src/__tests__/actions/users.js +++ /dev/null @@ -1,118 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/users'; -import * as types from '../../constants/users'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - details: [], - loading: true, -}; - -const user = { - id: 1, - created_at: '2020-09-23T06:11:01.39323Z', - updated_at: '2020-09-25T12:32:46.395603Z', - deleted_at: null, - email: 'ross@friends.in', - first_name: 'Ross', - last_name: 'Geller', - birth_date: '2020-09-02T18:02:41+05:30', - gender: 'male', - policies: [ - { - id: 'admin', - name: 'admin', - description: '', - }, - ], -}; - -describe('users actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_USERS_LOADING, - payload: true, - }; - expect(actions.loadingUsers()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_USERS_LOADING, - payload: false, - }; - expect(actions.stopLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add users request', () => { - const data = [user]; - const addRequestAction = { - type: types.ADD_USERS_REQUEST, - payload: data, - }; - expect(actions.addRequest(data)).toEqual(addRequestAction); - }); - it('should create actions to fetch users success', () => { - const resp = { data: { nodes: [user] } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_USERS_LOADING, - payload: true, - }, - { - type: types.ADD_USERS_REQUEST, - payload: { - data: [user], - }, - }, - { - type: types.SET_USERS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getUsers()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.USERS_API); - }); - it('should create actions to fetch user failure', () => { - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_USERS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_USERS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getUsers()) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.USERS_API); - }); -}); diff --git a/studio/src/__tests__/actions/webhooks.js b/studio/src/__tests__/actions/webhooks.js deleted file mode 100644 index ef7ef613c..000000000 --- a/studio/src/__tests__/actions/webhooks.js +++ /dev/null @@ -1,404 +0,0 @@ -import axios from 'axios'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; - -import * as actions from '../../actions/webhooks'; -import * as types from '../../constants/webhooks'; -import { ADD_NOTIFICATION } from '../../constants/notifications'; -import { ADD_EVENTS } from '../../constants/events'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -jest.mock('axios'); -Date.now = jest.fn(() => 1487076708000); - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('webhooks actions', () => { - it('should create an action to set loading to true', () => { - const startLoadingAction = { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }; - expect(actions.loadingWebhooks()).toEqual(startLoadingAction); - }); - it('should create an action to set loading to false', () => { - const stopLoadingAction = { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }; - expect(actions.stopWebhooksLoading()).toEqual(stopLoadingAction); - }); - it('should create an action to add webhooks list', () => { - const data = [ - { id: 1, name: 'webhook 1' }, - { id: 2, name: 'webhook 2' }, - ]; - - const addWebhooksAction = { - type: types.ADD_WEBHOOKS, - payload: data, - }; - expect(actions.addWebhookList(data)).toEqual(addWebhooksAction); - }); - it('should create an action to add webhook request', () => { - const data = [{ query: 'query' }]; - const addWebhooksRequestAction = { - type: types.ADD_WEBHOOKS_REQUEST, - payload: data, - }; - expect(actions.addWebhookRequest(data)).toEqual(addWebhooksRequestAction); - }); - it('should create an action to add webhook', () => { - const data = { id: 1, name: 'new webhook' }; - const addWebhookAction = { - type: types.ADD_WEBHOOK, - payload: data, - }; - expect(actions.getWebhookByID(data)).toEqual(addWebhookAction); - }); - it('should create an action to reset webhook', () => { - const resetWebhooksAction = { - type: types.RESET_WEBHOOKS, - }; - expect(actions.resetWebhooks()).toEqual(resetWebhooksAction); - }); - it('should create actions to fetch webhooks success', () => { - const query = { page: 1, limit: 5 }; - const webhooks = [ - { - id: 1, - name: 'Webhook', - events: [ - { - id: 1, - }, - ], - }, - ]; - const resp = { data: { nodes: webhooks, total: 1 } }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_EVENTS, - payload: [{ id: 1 }], - }, - { - type: types.ADD_WEBHOOKS, - payload: [{ id: 1, name: 'Webhook', events: [1] }], - }, - { - type: types.ADD_WEBHOOKS_REQUEST, - payload: { - data: [1], - query: query, - total: 1, - }, - }, - { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getWebhooks(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.WEBHOOKS_API, { - params: query, - }); - }); - it('should create actions to fetch webhooks failure', () => { - const query = { page: 1, limit: 5 }; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getWebhooks(query)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.WEBHOOKS_API, { - params: query, - }); - }); - it('should create actions to get webhook by id success', () => { - const id = 1; - const events = { id: 1 }; - const webhook = { id, name: 'Webhook', events: [events] }; - const resp = { data: webhook }; - axios.get.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_EVENTS, - payload: [events], - }, - { - type: types.ADD_WEBHOOK, - payload: { id, name: 'Webhook', events: [1] }, - }, - { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getWebhook(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.WEBHOOKS_API + '/' + id); - }); - it('should create actions to get webhook by id failure', () => { - const id = 1; - const errorMessage = 'Unable to fetch'; - axios.get.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.getWebhook(id)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.get).toHaveBeenCalledWith(types.WEBHOOKS_API + '/' + id); - }); - it('should create actions to create webhook success', () => { - const webhook = { name: 'Webhook', events: [{ id: 1 }] }; - const resp = { data: webhook }; - axios.post.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_EVENTS, - payload: [{ id: 1 }], - }, - { - type: types.RESET_WEBHOOKS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Webhook added', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addWebhook(webhook)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.WEBHOOKS_API, webhook); - }); - it('should create actions to create webhook failure', () => { - const webhook = { name: 'Webhook' }; - const errorMessage = 'Failed to create webhook'; - axios.post.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.addWebhook(webhook)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.post).toHaveBeenCalledWith(types.WEBHOOKS_API, webhook); - }); - it('should create actions to update webhook success', () => { - const event = { id: 1 }; - const webhook = { id: 1, name: 'Webhook', events: [event] }; - const resp = { data: webhook }; - axios.put.mockResolvedValue(resp); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_EVENTS, - payload: [event], - }, - { - type: types.ADD_WEBHOOK, - payload: { id: 1, name: 'Webhook', events: [1] }, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Webhook updated', - time: Date.now(), - }, - }, - { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateWebhook(webhook)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.WEBHOOKS_API + '/1', webhook); - }); - it('should create actions to update webhook failure', () => { - const event = { id: 1 }; - const webhook = { id: 1, name: 'Webhook', events: [event] }; - const errorMessage = 'Failed to update webhook'; - axios.put.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.updateWebhook(webhook)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.put).toHaveBeenCalledWith(types.WEBHOOKS_API + '/1', webhook); - }); - it('should create actions to delete webhook success', () => { - axios.delete.mockResolvedValue(); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: types.RESET_WEBHOOKS, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Webhook deleted', - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteWebhook(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.WEBHOOKS_API + '/1'); - }); - it('should create actions to delete webhook failure', () => { - const errorMessage = 'Failed to delete Webhook'; - axios.delete.mockRejectedValue(new Error(errorMessage)); - - const expectedActions = [ - { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }, - { - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: errorMessage, - time: Date.now(), - }, - }, - ]; - - const store = mockStore({ initialState }); - store - .dispatch(actions.deleteWebhook(1)) - .then(() => expect(store.getActions()).toEqual(expectedActions)); - expect(axios.delete).toHaveBeenCalledWith(types.WEBHOOKS_API + '/1'); - }); -}); diff --git a/studio/src/__tests__/reducers/authors.js b/studio/src/__tests__/reducers/authors.js deleted file mode 100644 index 2f69f2e20..000000000 --- a/studio/src/__tests__/reducers/authors.js +++ /dev/null @@ -1,115 +0,0 @@ -import reducer from '../../reducers/authorsReducer'; -import * as types from '../../constants/authors'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('authors reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle SET_AUTHORS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_AUTHORS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_AUTHORS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_AUTHORS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_AUTHORS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_AUTHORS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_AUTHORS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_AUTHORS', () => { - expect( - reducer(initialState, { - type: types.ADD_AUTHORS, - payload: [ - { id: 1, author: 'Aut' }, - { id: 2, author: 'hor' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, author: 'Aut' }, 2: { id: 2, author: 'hor' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_AUTHORS', () => { - expect( - reducer(initialState, { - type: types.ADD_AUTHORS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/categories.js b/studio/src/__tests__/reducers/categories.js deleted file mode 100644 index ec0aab213..000000000 --- a/studio/src/__tests__/reducers/categories.js +++ /dev/null @@ -1,193 +0,0 @@ -import reducer from '../../reducers/categoriesReducer'; -import * as types from '../../constants/categories'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('categories reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_CATEGORIES', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'category' }], - loading: false, - }, - { - type: types.RESET_CATEGORIES, - payload: {}, - }, - ), - ).toEqual({ - req: [], - loading: true, - details: [{ id: 1, name: 'category' }], - }); - }); - it('should handle SET_CATEGORIES_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_CATEGORIES_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_CATEGORIES_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_CATEGORIES_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_CATEGORIES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_CATEGORIES_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_CATEGORIES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_CATEGORIES', () => { - expect( - reducer(initialState, { - type: types.ADD_CATEGORIES, - payload: [ - { id: 1, name: 'Category 1' }, - { id: 2, name: 'Category 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'Category 1' }, 2: { id: 2, name: 'Category 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_CATEGORIES', () => { - expect( - reducer(initialState, { - type: types.ADD_CATEGORIES, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_CATEGORY', () => { - expect( - reducer(initialState, { - type: types.GET_CATEGORY, - payload: { id: 1, name: 'new category' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new category' } }, - loading: true, - }); - }); - it('should handle GET_CATEGORY when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing category' } }, - loading: false, - }, - { - type: types.GET_CATEGORY, - payload: { id: 2, name: 'new category' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing category' }, - 2: { id: 2, name: 'new category' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_CATEGORY when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing category' }, - 2: { id: 2, name: 'new category' }, - }, - loading: false, - }, - { - type: types.UPDATE_CATEGORY, - payload: { id: 2, name: 'updated category' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing category' }, - 2: { id: 2, name: 'updated category' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/claimants.js b/studio/src/__tests__/reducers/claimants.js deleted file mode 100644 index 338c8048f..000000000 --- a/studio/src/__tests__/reducers/claimants.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/claimantsReducer'; -import * as types from '../../constants/claimants'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('claimants reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_CLAIMANTS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'claimant' }], - loading: false, - }, - { - type: types.RESET_CLAIMANTS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_CLAIMANTS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_CLAIMANTS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_CLAIMANTS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_CLAIMANTS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_CLAIMANTS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_CLAIMANTS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_CLAIMANTS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_CLAIMANTS', () => { - expect( - reducer(initialState, { - type: types.ADD_CLAIMANTS, - payload: [ - { id: 1, name: 'claimant 1' }, - { id: 2, name: 'claimant 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'claimant 1' }, 2: { id: 2, name: 'claimant 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_CLAIMANTS', () => { - expect( - reducer(initialState, { - type: types.ADD_CLAIMANTS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_CLAIMANT', () => { - expect( - reducer(initialState, { - type: types.GET_CLAIMANT, - payload: { id: 1, name: 'new claimant' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new claimant' } }, - loading: true, - }); - }); - it('should handle GET_CLAIMANT when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing claimant' } }, - loading: false, - }, - { - type: types.GET_CLAIMANT, - payload: { id: 2, name: 'new claimant' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing claimant' }, - 2: { id: 2, name: 'new claimant' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_CLAIMANT when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing claimant' }, - 2: { id: 2, name: 'new claimant' }, - }, - loading: false, - }, - { - type: types.UPDATE_CLAIMANT, - payload: { id: 2, name: 'updated claimant' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing claimant' }, - 2: { id: 2, name: 'updated claimant' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/claims.js b/studio/src/__tests__/reducers/claims.js deleted file mode 100644 index 8c3b7bf04..000000000 --- a/studio/src/__tests__/reducers/claims.js +++ /dev/null @@ -1,193 +0,0 @@ -import reducer from '../../reducers/claimsReducer'; -import * as types from '../../constants/claims'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('claims reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_CLAIMS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'claim' }], - loading: false, - }, - { - type: types.RESET_CLAIMS, - payload: {}, - }, - ), - ).toEqual({ - req: [], - loading: true, - details: [{ id: 1, name: 'claim' }], - }); - }); - it('should handle SET_CLAIMS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_CLAIMS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_CLAIMS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_CLAIMS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_CLAIMS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_CLAIMS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_CLAIMS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_CLAIMS', () => { - expect( - reducer(initialState, { - type: types.ADD_CLAIMS, - payload: [ - { id: 1, name: 'claim 1' }, - { id: 2, name: 'claim 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'claim 1' }, 2: { id: 2, name: 'claim 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_CLAIMS', () => { - expect( - reducer(initialState, { - type: types.ADD_CLAIMS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_CLAIM', () => { - expect( - reducer(initialState, { - type: types.GET_CLAIM, - payload: { id: 1, name: 'new claim' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new claim' } }, - loading: true, - }); - }); - it('should handle GET_CLAIM when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing claim' } }, - loading: false, - }, - { - type: types.GET_CLAIM, - payload: { id: 2, name: 'new claim' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing claim' }, - 2: { id: 2, name: 'new claim' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_CLAIM when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing claim' }, - 2: { id: 2, name: 'new claim' }, - }, - loading: false, - }, - { - type: types.UPDATE_CLAIM, - payload: { id: 2, name: 'updated claim' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing claim' }, - 2: { id: 2, name: 'updated claim' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/events.js b/studio/src/__tests__/reducers/events.js deleted file mode 100644 index 628090850..000000000 --- a/studio/src/__tests__/reducers/events.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/eventsReducer'; -import * as types from '../../constants/events'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('events reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_EVENTS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'event' }], - loading: false, - }, - { - type: types.RESET_EVENTS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_EVENTS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_EVENTS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_EVENTS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_EVENTS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_EVENTS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_EVENTS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_EVENTS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_EVENTS', () => { - expect( - reducer(initialState, { - type: types.ADD_EVENTS, - payload: [ - { id: 1, name: 'Event 1' }, - { id: 2, name: 'Event 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'Event 1' }, 2: { id: 2, name: 'Event 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_EVENTS', () => { - expect( - reducer(initialState, { - type: types.ADD_EVENTS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_EVENT', () => { - expect( - reducer(initialState, { - type: types.GET_EVENT, - payload: { id: 1, name: 'new event' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new event' } }, - loading: true, - }); - }); - it('should handle GET_EVENT when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing event' } }, - loading: false, - }, - { - type: types.GET_EVENT, - payload: { id: 2, name: 'new event' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing event' }, - 2: { id: 2, name: 'new event' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_EVENT when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing event' }, - 2: { id: 2, name: 'new event' }, - }, - loading: false, - }, - { - type: types.UPDATE_EVENT, - payload: { id: 2, name: 'updated event' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing event' }, - 2: { id: 2, name: 'updated event' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/formats.js b/studio/src/__tests__/reducers/formats.js deleted file mode 100644 index 640bbde4c..000000000 --- a/studio/src/__tests__/reducers/formats.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/formatsReducer'; -import * as types from '../../constants/formats'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('formats reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_FORMATS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'format' }], - loading: false, - }, - { - type: types.RESET_FORMATS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_FORMATS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_FORMATS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_FORMATS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_FORMATS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_FORMATS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_FORMATS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_FORMATS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_FORMATS', () => { - expect( - reducer(initialState, { - type: types.ADD_FORMATS, - payload: [ - { id: 1, name: 'format 1' }, - { id: 2, name: 'format 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'format 1' }, 2: { id: 2, name: 'format 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_FORMATS', () => { - expect( - reducer(initialState, { - type: types.ADD_FORMATS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_FORMAT', () => { - expect( - reducer(initialState, { - type: types.GET_FORMAT, - payload: { id: 1, name: 'new format' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new format' } }, - loading: true, - }); - }); - it('should handle GET_FORMAT when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing format' } }, - loading: false, - }, - { - type: types.GET_FORMAT, - payload: { id: 2, name: 'new format' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing format' }, - 2: { id: 2, name: 'new format' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_FORMAT when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing format' }, - 2: { id: 2, name: 'new format' }, - }, - loading: false, - }, - { - type: types.UPDATE_FORMAT, - payload: { id: 2, name: 'updated format' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing format' }, - 2: { id: 2, name: 'updated format' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/googleFactChecks.js b/studio/src/__tests__/reducers/googleFactChecks.js deleted file mode 100644 index a7e664f8c..000000000 --- a/studio/src/__tests__/reducers/googleFactChecks.js +++ /dev/null @@ -1,136 +0,0 @@ -import reducer from '../../reducers/googleFactChecksReducer'; -import * as types from '../../constants/googleFactChecks'; - -const initialState = { - req: [], - loading: true, -}; - -const factCheck = { - text: 'Video shows Russian doctors celebrating the new COVID-19 vaccine.', - claimant: 'Facebook posts', - claimDate: '2020-09-08T02:48:10Z', - claimReview: [ - { - publisher: { - name: 'BOOM', - site: 'boomlive.in', - }, - url: - 'https://www.boomlive.in/world/video-from-saudi-arabia-shared-as-russian-doctors-celebrating-covid-19-vaccine-9654', - title: 'Video From Saudi Arabia Shared As Russian Doctors Celebrating COVID-19 Vaccine', - reviewDate: '2020-09-08T02:48:10Z', - textualRating: 'False', - languageCode: 'en', - }, - ], -}; -const existingFactCheck = { - text: - 'Pelosi travels weekly to California on a 200-seat Boeing that costs millions annually in fuel', - claimant: 'social media users', - claimDate: '2021-02-21T00:00:00Z', - claimReview: [ - { - publisher: { - name: 'BOOM', - site: 'boomlive.in', - }, - url: - 'https://www.usatoday.com/story/news/factcheck/2021/02/28/fact-check-false-claim-pelosi-travels-weekly-200-seat-plane/6860043002/', - title: 'Fact check: False claim that Pelosi travels weekly on 200-seat ...', - reviewDate: '2021-02-28T21:23:54Z', - textualRating: 'False', - languageCode: 'en', - }, - ], -}; - -describe('google fact check reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [factCheck], query: { page: 1, limit: 1 }, total: 1 }], - loading: false, - }), - ).toEqual({ - req: [{ data: [factCheck], query: { page: 1, limit: 1 }, total: 1 }], - loading: false, - }); - }); - it('should handle SET_GOOGLE_FACT_CHECKS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_GOOGLE_FACT_CHECKS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - loading: false, - }); - }); - it('should handle ADD_GOOGLE_FACT_CHECKS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_GOOGLE_FACT_CHECKS_REQUEST, - payload: { - data: [factCheck], - query: { page: 1, limit: 1 }, - total: 1, - }, - }), - ).toEqual({ - req: [ - { - data: [factCheck], - query: { page: 1, limit: 1 }, - total: 1, - }, - ], - loading: true, - }); - }); - it('should handle ADD_GOOGLE_FACT_CHECKS_REQUEST with some existing req', () => { - const state_ = { - req: [ - { - data: [existingFactCheck], - query: { page: 1, limit: 5 }, - total: 1, - }, - ], - loading: true, - }; - expect( - reducer(state_, { - type: types.ADD_GOOGLE_FACT_CHECKS_REQUEST, - payload: { - data: [factCheck, existingFactCheck], - query: { page: 1, limit: 5 }, - total: 2, - }, - }), - ).toEqual({ - req: [ - { - data: [factCheck, existingFactCheck], - query: { page: 1, limit: 5 }, - total: 2, - }, - ], - loading: true, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/index.js b/studio/src/__tests__/reducers/index.js deleted file mode 100644 index bebd687df..000000000 --- a/studio/src/__tests__/reducers/index.js +++ /dev/null @@ -1,187 +0,0 @@ -import rootReducer from '../../reducers'; -import { SET_SELECTED_SPACE } from '../../constants/spaces'; - -const initialState = { - info: { - categories: 0, - tag: 0, - article: { - draft: 0, - template: 0, - publish: 0, - }, - factCheck: { - draft: 0, - template: 0, - publish: 0, - }, - podcasts: 0, - }, - settings: { - navTheme: 'dark', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - }, - spaces: { - orgs: [], - details: {}, - loading: false, - selected: 0, - }, - organisations: { - req: [], - details: {}, - loading: true, - }, - redirect: { - code: 200, - }, - search: { - details: { - articles: [], - categories: [], - claims: [], - 'fact-checks': [], - media: [], - pages: [], - ratings: [], - tags: [], - total: 0, - }, - loading: true, - req: [], - }, - roles: { - details: {}, - loading: true, - req: [], - }, - sachFactChecks: { - details: [], - loading: true, - }, - categories: { - req: [], - details: {}, - loading: true, - }, - tags: { - req: [], - details: {}, - loading: true, - }, - formats: { - req: [], - details: {}, - loading: true, - }, - googleFactChecks: { - req: [], - loading: true, - }, - media: { - req: [], - details: {}, - loading: true, - }, - authors: { - req: [], - details: {}, - loading: true, - }, - posts: { - req: [], - details: {}, - loading: true, - }, - pages: { - req: [], - details: {}, - loading: true, - }, - ratings: { - req: [], - details: {}, - loading: true, - }, - claimants: { - req: [], - details: {}, - loading: true, - }, - claims: { - req: [], - details: {}, - loading: true, - }, - notifications: { - type: null, - message: null, - description: null, - }, - policies: { - req: [], - details: {}, - loading: true, - }, - permissions: { - req: [], - details: {}, - loading: true, - }, - users: { - details: [], - loading: true, - }, - menus: { - req: [], - details: {}, - loading: true, - }, - sidebar: { - collapsed: false, - }, - events: { - req: [], - details: {}, - loading: true, - }, - webhooks: { - req: [], - details: {}, - loading: true, - }, - profile: { - details: {}, - loading: true, - }, -}; -describe('root reducer', () => { - it('should return combined state with selected space', () => { - expect( - rootReducer(initialState, { - type: SET_SELECTED_SPACE, - payload: 1, - }), - ).toEqual({ - ...initialState, - spaces: { - orgs: [], - details: {}, - loading: false, - selected: 1, - }, - }); - }); - it('should return combined state', () => { - expect( - rootReducer(initialState, { - type: 'INCORRECT_ACTION_TYPE', - payload: {}, - }), - ).toEqual(initialState); - }); -}); diff --git a/studio/src/__tests__/reducers/info.js b/studio/src/__tests__/reducers/info.js deleted file mode 100644 index fd418ff1f..000000000 --- a/studio/src/__tests__/reducers/info.js +++ /dev/null @@ -1,119 +0,0 @@ -import reducer from '../../reducers/infoReducer'; -import * as types from '../../constants/info'; - -const initialState = { - categories: 0, - tag: 0, - article: { - draft: 0, - template: 0, - publish: 0, - }, - factCheck: { - draft: 0, - template: 0, - publish: 0, - }, - podcasts: 0, -}; - -describe('Info reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - categories: 0, - tag: 0, - article: { - draft: 0, - template: 0, - publish: 0, - }, - factCheck: { - draft: 0, - template: 0, - publish: 0, - }, - podcasts: 0, - }), - ).toEqual({ - categories: 0, - tag: 0, - article: { - draft: 0, - template: 0, - publish: 0, - }, - factCheck: { - draft: 0, - template: 0, - publish: 0, - }, - podcasts: 0, - }); - }); - it('should handle ADD_INFO', () => { - expect( - reducer(initialState, { - type: types.ADD_INFO, - payload: { - categories: 1, - tag: 1, - podcasts: 1, - episodes: 1, - posts: [ - { - count: 1, - slug: 'article', - status: 'ready', - }, - { - count: 2, - slug: 'fact-check', - status: 'draft', - }, - ], - }, - }), - ).toEqual({ - categories: 1, - tag: 1, - episodes: 1, - article: { - draft: 0, - template: 0, - publish: 0, - ready: 1, - }, - factCheck: { - draft: 2, - template: 0, - publish: 0, - ready: 0, - }, - podcasts: 1, - posts: [ - { - count: 1, - slug: 'article', - status: 'ready', - }, - { - count: 2, - slug: 'fact-check', - status: 'draft', - }, - ], - }); - // expect( - // reducer(initialState, { - // type: types.ADD_INFO, - // payload: false, - // }), - // ).toEqual({ - // collapsed: false, - // }); - }); -}); diff --git a/studio/src/__tests__/reducers/media.js b/studio/src/__tests__/reducers/media.js deleted file mode 100644 index c12fc8b6b..000000000 --- a/studio/src/__tests__/reducers/media.js +++ /dev/null @@ -1,193 +0,0 @@ -import reducer from '../../reducers/mediaReducer'; -import * as types from '../../constants/media'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('media reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_MEDIA', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'media' }], - loading: false, - }, - { - type: types.RESET_MEDIA, - payload: {}, - }, - ), - ).toEqual({ - req: [], - details: [{ id: 1, name: 'media' }], - loading: true, - }); - }); - it('should handle SET_MEDIA_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_MEDIA_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_MEDIA_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_MEDIA_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_MEDIA_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_MEDIA_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_MEDIA_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_MEDIA', () => { - expect( - reducer(initialState, { - type: types.ADD_MEDIA, - payload: [ - { id: 1, name: 'Media 1' }, - { id: 2, name: 'Media 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'Media 1' }, 2: { id: 2, name: 'Media 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_MEDIA', () => { - expect( - reducer(initialState, { - type: types.ADD_MEDIA, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_MEDIUM', () => { - expect( - reducer(initialState, { - type: types.GET_MEDIUM, - payload: { id: 1, name: 'new medium' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new medium' } }, - loading: true, - }); - }); - it('should handle GET_MEDIUM when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing medium' } }, - loading: false, - }, - { - type: types.GET_MEDIUM, - payload: { id: 2, name: 'new medium' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing medium' }, - 2: { id: 2, name: 'new medium' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_MEDIUM when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing medium' }, - 2: { id: 2, name: 'new medium' }, - }, - loading: false, - }, - { - type: types.UPDATE_MEDIUM, - payload: { id: 2, name: 'updated medium' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing medium' }, - 2: { id: 2, name: 'updated medium' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/menu.js b/studio/src/__tests__/reducers/menu.js deleted file mode 100644 index 79319cea8..000000000 --- a/studio/src/__tests__/reducers/menu.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/menuReducer'; -import * as types from '../../constants/menu'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('Menu reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'menu' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'menu' } }, - loading: false, - }); - }); - it('should handle RESET_MENUS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'menu' }], - loading: false, - }, - { - type: types.RESET_MENUS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_MENUS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_MENUS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_MENUS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_MENUS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_MENUS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_MENUS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_MENUS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_MENUS', () => { - expect( - reducer(initialState, { - type: types.ADD_MENUS, - payload: [ - { id: 1, name: 'Menu 1' }, - { id: 2, name: 'Menu 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'Menu 1' }, 2: { id: 2, name: 'Menu 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_MENUS', () => { - expect( - reducer(initialState, { - type: types.ADD_MENUS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_MENU', () => { - expect( - reducer(initialState, { - type: types.GET_MENU, - payload: { id: 1, name: 'new menu' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new menu' } }, - loading: true, - }); - }); - it('should handle GET_MENU when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing menu' } }, - loading: false, - }, - { - type: types.GET_MENU, - payload: { id: 2, name: 'new menu' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing menu' }, - 2: { id: 2, name: 'new menu' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_MENU when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing menu' }, - 2: { id: 2, name: 'new menu' }, - }, - loading: false, - }, - { - type: types.UPDATE_MENU, - payload: { id: 2, name: 'updated menu' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing menu' }, - 2: { id: 2, name: 'updated menu' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/notifications.js b/studio/src/__tests__/reducers/notifications.js deleted file mode 100644 index dc62b3384..000000000 --- a/studio/src/__tests__/reducers/notifications.js +++ /dev/null @@ -1,53 +0,0 @@ -import reducer from '../../reducers/notificationsReducer'; -import * as types from '../../constants/notifications'; - -const initialState = { - type: null, - message: null, - description: null, -}; - -describe('notifications reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect(reducer(initialState, { type: 'NON_EXISTING', payload: {} })).toEqual(initialState); - }); - it('should return the state when payload is empty', () => { - expect(reducer(initialState, { type: types.ADD_NOTIFICATION })).toEqual(initialState); - }); - it('should return the state when action is empty', () => { - expect(reducer(initialState)).toEqual(initialState); - }); - it('should handle ADD_NOTIFICATION', () => { - expect( - reducer(initialState, { - type: types.ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: 'Test error message', - }, - }), - ).toEqual({ - type: 'error', - message: 'Error', - description: 'Test error message', - }); - expect( - reducer(initialState, { - type: types.ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: 'Test success message', - }, - }), - ).toEqual({ - type: 'success', - message: 'Success', - description: 'Test success message', - }); - }); -}); diff --git a/studio/src/__tests__/reducers/pages.js b/studio/src/__tests__/reducers/pages.js deleted file mode 100644 index 40a00436d..000000000 --- a/studio/src/__tests__/reducers/pages.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/pagesReducer'; -import * as types from '../../constants/pages'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('pages reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_PAGES', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'category' }], - loading: false, - }, - { - type: types.RESET_PAGES, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_PAGES_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_PAGES_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_PAGES_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_PAGES_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_PAGES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_PAGES_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_PAGES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_PAGES', () => { - expect( - reducer(initialState, { - type: types.ADD_PAGES, - payload: [ - { id: 1, title: 'Page 1' }, - { id: 2, title: 'Page 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, title: 'Page 1' }, 2: { id: 2, title: 'Page 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_PAGES', () => { - expect( - reducer(initialState, { - type: types.ADD_PAGES, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle ADD_PAGE', () => { - expect( - reducer(initialState, { - type: types.ADD_PAGE, - payload: { id: 1, title: 'new page' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, title: 'new page' } }, - loading: true, - }); - }); - it('should handle ADD_PAGE when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, title: 'existing page' } }, - loading: false, - }, - { - type: types.ADD_PAGE, - payload: { id: 2, title: 'new page' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, title: 'existing page' }, - 2: { id: 2, title: 'new page' }, - }, - loading: false, - }); - }); - it('should handle ADD_PAGE when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, title: 'existing page' }, - 2: { id: 2, title: 'new page' }, - }, - loading: false, - }, - { - type: types.ADD_PAGE, - payload: { id: 2, title: 'updated page' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, title: 'existing page' }, - 2: { id: 2, title: 'updated page' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/permissions.js b/studio/src/__tests__/reducers/permissions.js deleted file mode 100644 index abcd8d6ab..000000000 --- a/studio/src/__tests__/reducers/permissions.js +++ /dev/null @@ -1,111 +0,0 @@ -import reducer from '../../reducers/permissionsReducer'; -import * as types from '../../constants/permissions'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -const permission = { - data: [ - { - resource: 'categories', - actions: ['get', 'create', 'update', 'delete'], - }, - { - resource: 'tags', - actions: ['get', 'create'], - }, - { - resource: 'formats', - actions: ['update'], - }, - { - resource: 'media', - actions: ['create'], - }, - { - resource: 'tags', - actions: ['get'], - }, - ], - user_id: 1, -}; - -describe('permissions reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [permission], - details: { 1: permission }, - loading: false, - }), - ).toEqual({ - req: [permission], - details: { 1: permission }, - loading: false, - }); - }); - it('should handle SET_PERMISSIONS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_PERMISSIONS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_PERMISSIONS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_PERMISSIONS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_PERMISSIONS_REQUEST, - payload: [1], - }), - ).toEqual({ - req: [1], - details: {}, - loading: true, - }); - }); - it('should handle ADD_PERMISSIONS', () => { - expect( - reducer(initialState, { - type: types.ADD_PERMISSIONS, - payload: permission, - }), - ).toEqual({ - req: [], - details: { 1: permission.data }, - loading: true, - }); - }); - it('should handle empty payload ADD_PERMISSIONS', () => { - expect( - reducer(initialState, { - type: types.ADD_PERMISSIONS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/policies.js b/studio/src/__tests__/reducers/policies.js deleted file mode 100644 index b64347742..000000000 --- a/studio/src/__tests__/reducers/policies.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/policiesReducer'; -import * as types from '../../constants/policies'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('policies reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_POLICIES', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'policy' }], - loading: false, - }, - { - type: types.RESET_POLICIES, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_POLICIES_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_POLICIES_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_POLICIES_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_POLICIES_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_POLICIES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_POLICIES_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_POLICIES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_POLICIES', () => { - expect( - reducer(initialState, { - type: types.ADD_POLICIES, - payload: [ - { id: 1, name: 'policy 1' }, - { id: 2, name: 'policy 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'policy 1' }, 2: { id: 2, name: 'policy 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_POLICIES', () => { - expect( - reducer(initialState, { - type: types.ADD_POLICIES, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_POLICY', () => { - expect( - reducer(initialState, { - type: types.GET_POLICY, - payload: { id: 1, name: 'new policy' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new policy' } }, - loading: true, - }); - }); - it('should handle GET_POLICY when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing policy' } }, - loading: false, - }, - { - type: types.GET_POLICY, - payload: { id: 2, name: 'new policy' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing policy' }, - 2: { id: 2, name: 'new policy' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_POLICY when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing policy' }, - 2: { id: 2, name: 'new policy' }, - }, - loading: false, - }, - { - type: types.UPDATE_POLICY, - payload: { id: 2, name: 'updated policy' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing policy' }, - 2: { id: 2, name: 'updated policy' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/posts.js b/studio/src/__tests__/reducers/posts.js deleted file mode 100644 index f7f40961e..000000000 --- a/studio/src/__tests__/reducers/posts.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/postsReducer'; -import * as types from '../../constants/posts'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('posts reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_POSTS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'Post' }], - loading: false, - }, - { - type: types.RESET_POSTS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_POSTS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_POSTS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_POSTS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_POSTS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_POSTS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_POSTS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_POSTS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_POSTS', () => { - expect( - reducer(initialState, { - type: types.ADD_POSTS, - payload: [ - { id: 1, name: 'Post 1' }, - { id: 2, name: 'Post 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'Post 1' }, 2: { id: 2, name: 'Post 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_POSTS', () => { - expect( - reducer(initialState, { - type: types.ADD_POSTS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle ADD_POST', () => { - expect( - reducer(initialState, { - type: types.ADD_POST, - payload: { id: 1, name: 'new post' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new post' } }, - loading: true, - }); - }); - it('should handle ADD_POST when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing post' } }, - loading: false, - }, - { - type: types.ADD_POST, - payload: { id: 2, name: 'new post' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing post' }, - 2: { id: 2, name: 'new post' }, - }, - loading: false, - }); - }); - it('should handle ADD_POST when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing post' }, - 2: { id: 2, name: 'new post' }, - }, - loading: false, - }, - { - type: types.ADD_POST, - payload: { id: 2, name: 'updated post' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing post' }, - 2: { id: 2, name: 'updated post' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/profile.js b/studio/src/__tests__/reducers/profile.js deleted file mode 100644 index 7585371e4..000000000 --- a/studio/src/__tests__/reducers/profile.js +++ /dev/null @@ -1,80 +0,0 @@ -import reducer from '../../reducers/profileReducer'; -import * as types from '../../constants/profile'; - -const initialState = { - details: {}, - loading: true, -}; - -describe('profile reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - details: { 1: { id: 1, email: 'abc@gmail.com', first_name: 'abc' } }, - loading: false, - }), - ).toEqual({ - details: { 1: { id: 1, email: 'abc@gmail.com', first_name: 'abc' } }, - loading: false, - }); - }); - it('should handle SET_PROFILE_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_PROFILE_LOADING, - payload: true, - }), - ).toEqual({ - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_PROFILE_LOADING, - payload: false, - }), - ).toEqual({ - details: {}, - loading: false, - }); - }); - it('should handle ADD_PROFILE', () => { - expect( - reducer(initialState, { - type: types.ADD_PROFILE, - payload: { id: 1, email: 'abc@gmail.com', first_name: 'abc' }, - }), - ).toEqual({ - details: { id: 1, email: 'abc@gmail.com', first_name: 'abc' }, - loading: true, - }); - }); - it('should handle ADD_PROFILE when already exists', () => { - expect( - reducer( - { - details: { - id: 1, - email: 'abc@gmail.com', - first_name: 'abc', - }, - loading: false, - }, - { - type: types.ADD_PROFILE, - payload: { id: 1, email: 'querty@gmail.com', first_name: 'abc' }, - }, - ), - ).toEqual({ - details: { - id: 1, - email: 'querty@gmail.com', - first_name: 'abc', - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/ratings.js b/studio/src/__tests__/reducers/ratings.js deleted file mode 100644 index 84e50feca..000000000 --- a/studio/src/__tests__/reducers/ratings.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/ratingsReducer'; -import * as types from '../../constants/ratings'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('ratings reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_RATINGS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'Rating' }], - loading: false, - }, - { - type: types.RESET_RATINGS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_RATINGS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_RATINGS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_RATINGS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_RATINGS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_RATINGS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_RATINGS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_RATINGS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_RATINGS', () => { - expect( - reducer(initialState, { - type: types.ADD_RATINGS, - payload: [ - { id: 1, name: 'rating 1' }, - { id: 2, name: 'rating 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'rating 1' }, 2: { id: 2, name: 'rating 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_RATINGS', () => { - expect( - reducer(initialState, { - type: types.ADD_RATINGS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_RATING', () => { - expect( - reducer(initialState, { - type: types.GET_RATING, - payload: { id: 1, name: 'new rating' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new rating' } }, - loading: true, - }); - }); - it('should handle GET_RATING when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing rating' } }, - loading: false, - }, - { - type: types.GET_RATING, - payload: { id: 2, name: 'new rating' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing rating' }, - 2: { id: 2, name: 'new rating' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_RATING when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing rating' }, - 2: { id: 2, name: 'new rating' }, - }, - loading: false, - }, - { - type: types.UPDATE_RATING, - payload: { id: 2, name: 'updated rating' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing rating' }, - 2: { id: 2, name: 'updated rating' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/redirectReducer.js b/studio/src/__tests__/reducers/redirectReducer.js deleted file mode 100644 index 165ceed72..000000000 --- a/studio/src/__tests__/reducers/redirectReducer.js +++ /dev/null @@ -1,31 +0,0 @@ -import reducer from '../../reducers/redirectReducer'; -import * as types from '../../constants/settings'; - -const initialState = { - code: 200, -}; - -describe('redirect reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - code: 200, - }), - ).toEqual({ - code: 200, - }); - }); - it('should set SET_REDIRECT', () => { - expect( - reducer(initialState, { - type: types.SET_REDIRECT, - payload: 300, - }), - ).toEqual({ - code: 300, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/roles.js b/studio/src/__tests__/reducers/roles.js deleted file mode 100644 index a95ee160e..000000000 --- a/studio/src/__tests__/reducers/roles.js +++ /dev/null @@ -1,182 +0,0 @@ -import reducer from '../../reducers/rolesReducer'; -import * as types from '../../constants/roles'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('roles reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect(reducer(initialState, { type: 'NON_EXISTING', payload: {} })).toEqual(initialState); - }); - it('should return the state when action is empty', () => { - expect(reducer(initialState)).toEqual(initialState); - }); - it('should handle SET_ROLES_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_ROLES_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - expect( - reducer(initialState, { - type: types.SET_ROLES_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle RESET_ROLES', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'roles' }], - loading: false, - }, - { - type: types.RESET_ROLES, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle ADD_ROLES_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_ROLES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_ROLES_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_ROLES_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_ROLES', () => { - expect( - reducer(initialState, { - type: types.ADD_ROLES, - payload: [ - { id: 1, name: 'role 1' }, - { id: 2, name: 'role 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'role 1' }, 2: { id: 2, name: 'role 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_ROLES', () => { - expect( - reducer(initialState, { - type: types.ADD_ROLES, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_ROLE', () => { - expect( - reducer(initialState, { - type: types.GET_ROLE, - payload: { id: 1, name: 'new role' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new role' } }, - loading: true, - }); - }); - it('should handle GET_ROLE when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing role' } }, - loading: false, - }, - { - type: types.GET_ROLE, - payload: { id: 2, name: 'new role' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing role' }, - 2: { id: 2, name: 'new role' }, - }, - loading: false, - }); - }); - it('should handle UPDATE_ROLE when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing role' }, - 2: { id: 2, name: 'new role' }, - }, - loading: false, - }, - { - type: types.UPDATE_ROLE, - payload: { id: 2, name: 'updated role' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing role' }, - 2: { id: 2, name: 'updated role' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/sachFactChecks.js b/studio/src/__tests__/reducers/sachFactChecks.js deleted file mode 100644 index ec52935e7..000000000 --- a/studio/src/__tests__/reducers/sachFactChecks.js +++ /dev/null @@ -1,119 +0,0 @@ -import reducer from '../../reducers/sachFactChecksReducer'; -import * as types from '../../constants/sachFactChecks'; - -const initialState = { - details: [], - loading: true, -}; - -const factcheck = { - claims: [ - { - claimant: 'Daily Express', - claimdate: '2017-02-16T00:00:00Z', - claimreview: [ - { - languagecode: 'en', - reviewdate: '2017-02-16T00:00:00Z', - textualrating: - 'The estimates suggest this happened, but it’s uncertain. The changes in the ONS’ best estimates weren’t big enough for us to be sure there was any real change.', - title: - 'Reports on employment figures are accurate, but not the whole picture - Full Fact', - url: - 'https://fullfact.org/immigration/reports-employment-figures-are-accurate-not-whole-picture/', - }, - ], - id: '62a03199a5f38940ad71ba7d', - text: 'The number of British-born workers has fallen.', - }, - { - claimant: 'Daily Express', - claimdate: '2017-02-15T00:00:00Z', - claimreview: [ - { - languagecode: 'en', - reviewdate: '2017-02-16T00:00:00Z', - textualrating: - 'That’s correct. The ONS’ best estimate for the number of non-UK born workers rose by 431,000 between the end of 2015 and the end of 2016.', - title: - 'Reports on employment figures are accurate, but not the whole picture - Full Fact', - url: - 'https://fullfact.org/immigration/reports-employment-figures-are-accurate-not-whole-picture/', - }, - ], - id: '62a0319aa5f38940ad71c04b', - text: 'There are another 431,000 foreign born workers in the UK.', - }, - ], - date: '2017-02-16T00:00:00Z', - humanlanguage: 'en', - id: '62a0405ffa2840264aa24f27', - pageurl: - 'https://fullfact.org/immigration/reports-employment-figures-are-accurate-not-whole-picture/', - publisher: { - name: 'Full Fact', - site: 'fullfact.org', - }, - sitename: 'Full Fact', - tags: ['employment', 'United Kingdom'], - text: - 'That’s correct. The ONS’ best estimate for the number of non-UK born workers rose by 431,000 between the end of 2015 and the end of 2016.\n“Another 431,000 migrants working in Britain”\nDaily Express, paper edition, 16 February 2017\n“British-born workers PLUNGE as foreign workers RISE by 431,000”\nDaily Express, online edition, 16 February 2017\nSeveral media outlets reported the most recent set of employment figures this morning, and the Daily Express featured the story on its front page. The figures reported are correct, but there’s a lot of uncertainty around some of the latest changes.\nThe good news is we haven’t seen anyone make the kind of mistakes we’ve seen in the past when it comes to reporting employment figures.\nAs the Office for National Statistics says prominently, these statistics don’t tell us how many people have lost jobs or how many people have got a new one, they just tell us the final change in the headcount of people who have jobs.\nThese estimates are very uncertain\nThe UK had 431,000 more foreign-born workers at the end of 2016 than it had a year beforehand, according to estimates from the Office for National Statistics (ONS).\nMeanwhile, its estimate for the number of workers born inside the UK dropped by 120,000.\nSo foreign-born workers rose in number while British born workers fell? Not quite.\nThe difference between these two changes is that the first is big enough for us to be confident it’s genuine, the second isn’t.\nThe estimates are based on a survey, so there’s a grey area around the ONS’ best estimate for the numbers of different groups of workers.\nThe estimate for UK-born workers and UK nationals in work would have to change by more than 200,000 for us to be reasonably confident that we were seeing a genuine change in the real world.\nThat may sound like a surprisingly big margin. But remember: there are an estimated 26 million UK-born workers or 28 million UK citizens in work. A change of less than 200,000 is difficult to detect with a lot of confidence, based on these figures.\nThere’s more than one definition of ‘foreigner’\nThe Office for National Statistics puts out employment figures for two groups which you might associate with the word, ‘foreigner’:\nPeople born inside / outside the UK\nUK / non-UK nationals\nThe estimated number of British-born workers didn’t ‘plunge’ on both definitions.\nThe best estimate for the number of UK-born workers fell by 120,000, and rose by 70,000 for UK nationals. Like before, these changes are too small for us to be confident they’ve actually happened.', - title: 'Reports on employment figures are accurate, but not the whole picture', - translation: {}, -}; - -describe('sach fact check reducer', () => { - // testing for the initial state - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - - // testing when no action is passed - it should return the previous state - it('should return the state for default case', () => { - expect( - reducer({ - details: [factcheck], - loading: false, - }), - ).toEqual({ - details: [factcheck], - loading: false, - }); - }); - - // testing SET_SACH_FACT_CHECKS_LOADING case - it('should handle SET_SACH_FACT_CHECKS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_SACH_FACT_CHECKS_LOADING, - payload: true, - }), - ).toEqual({ - details: [], - loading: true, - }); - - expect( - reducer(initialState, { - type: types.SET_SACH_FACT_CHECKS_LOADING, - payload: false, - }), - ).toEqual({ - details: [], - loading: false, - }); - }); - - // testing ADD_SACH_FACT_CHECKS case - it('should handle ADD_SACH_FACT_CHECKS', () => { - expect( - reducer(initialState, { - type: types.ADD_SACH_FACT_CHECKS, - payload: [factcheck], - }), - ).toEqual({ - details: [factcheck], - loading: true, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/searchReducer.js b/studio/src/__tests__/reducers/searchReducer.js deleted file mode 100644 index efba7f942..000000000 --- a/studio/src/__tests__/reducers/searchReducer.js +++ /dev/null @@ -1,173 +0,0 @@ -import reducer from '../../reducers/searchReducer'; -import * as types from '../../constants/search'; - -const initialState = { - req: [], - details: { - articles: [], - 'fact-checks': [], - pages: [], - claims: [], - tags: [], - categories: [], - media: [], - ratings: [], - total: 0, - }, - loading: true, -}; - -describe('search reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle SET_SEARCH_DETAILS_LOADING ', () => { - expect( - reducer(initialState, { - type: types.SET_SEARCH_DETAILS_LOADING, - payload: true, - }), - ).toEqual({ - ...initialState, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_SEARCH_DETAILS_LOADING, - payload: false, - }), - ).toEqual({ - ...initialState, - loading: false, - }); - }); - it('should handle ADD_SEARCH_DETAIL if data is empty ', () => { - expect( - reducer(initialState, { type: types.ADD_SEARCH_DETAIL, payload: { data: [], formats: [] } }), - ).toEqual(initialState); - }); - - it('should handle ADD_SEARCH_DETAIL if data has a post which is a page ', () => { - expect( - reducer(initialState, { - type: types.ADD_SEARCH_DETAIL, - payload: { - data: [ - { - name: 'new post', - kind: 'post', - is_page: true, - }, - ], - formats: [], - }, - }), - ).toEqual({ - ...initialState, - total: 1, - details: { - ...initialState.details, - pages: [{ name: 'new post', kind: 'post', is_page: true }], - }, - }); - }); - - it('should handle ADD_SEARCH_DETAIL if data has a post which is a page and a template ', () => { - expect( - reducer(initialState, { - type: types.ADD_SEARCH_DETAIL, - payload: { - data: [ - { - name: 'new post', - kind: 'post', - is_page: true, - status: 'template', - }, - ], - formats: [], - }, - }), - ).toEqual({ ...initialState, total: 1, details: { ...initialState.details, pages: [] } }); - }); - - it('should handle ADD_SEARCH_DETAIL if data has a tag , category , claims , media , ratings ', () => { - expect( - reducer(initialState, { - type: types.ADD_SEARCH_DETAIL, - payload: { - data: [ - { name: 'new tag', kind: 'tag' }, - { name: 'new category', kind: 'category' }, - { name: 'error', kind: 'error' }, - { name: 'new claim', kind: 'claim' }, - { name: 'new media', kind: 'medium' }, - ], - - formats: [], - }, - }), - ).toEqual({ - ...initialState, - total: 5, - details: { - ...initialState.details, - tags: [{ name: 'new tag', kind: 'tag' }], - categories: [{ name: 'new category', kind: 'category' }], - claims: [{ name: 'new claim', kind: 'claim' }], - media: [{ name: 'new media', kind: 'medium' }], - }, - }); - }); - - it('should handle ADD_SEARCH_DETAIL if data has a fact-check ', () => { - expect( - reducer(initialState, { - type: types.ADD_SEARCH_DETAIL, - payload: { - data: [{ name: 'new fact-check', format_id: 0, kind: 'post' }], - formats: { 0: { slug: 'fact-check' } }, - }, - }), - ).toEqual({ - ...initialState, - total: 1, - details: { - ...initialState.details, - 'fact-checks': [{ name: 'new fact-check', format_id: 0, kind: 'post' }], - }, - }); - }); - - it('should handle ADD_SEARCH_DETAIL if data has a article ', () => { - expect( - reducer(initialState, { - type: types.ADD_SEARCH_DETAIL, - payload: { - data: [{ name: 'new article', format_id: 0, kind: 'post' }], - formats: { 0: { slug: 'article' } }, - }, - }), - ).toEqual({ - ...initialState, - total: 1, - details: { - ...initialState.details, - articles: [{ name: 'new article', format_id: 0, kind: 'post' }], - }, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/settings.js b/studio/src/__tests__/reducers/settings.js deleted file mode 100644 index 63240dca5..000000000 --- a/studio/src/__tests__/reducers/settings.js +++ /dev/null @@ -1,154 +0,0 @@ -import reducer from '../../reducers/settingsReducer'; -import * as types from '../../constants/settings'; - -const initialState = { - navTheme: 'light', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: true, - }, - title: 'Dega Admin', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: true, - }, -}; - -describe('settings reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - navTheme: 'light', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: false, - }, - title: 'Dega', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: false, - }, - }), - ).toEqual({ - navTheme: 'light', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: false, - }, - title: 'Dega', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: false, - }, - }); - }); - it('should change sider to true when false', () => { - expect( - reducer( - { - navTheme: 'dark', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: true, - }, - title: 'Dega Admin', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: false, - }, - }, - { - type: types.TOGGLE_SIDER, - }, - ), - ).toEqual({ - navTheme: 'dark', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: true, - }, - title: 'Dega Admin', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: true, - }, - }); - }); - it('should change sider to false when true', () => { - expect( - reducer( - { - navTheme: 'dark', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: true, - }, - title: 'Dega Admin', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: true, - }, - }, - { - type: types.TOGGLE_SIDER, - }, - ), - ).toEqual({ - navTheme: 'dark', - primaryColor: '#1890ff', - layout: 'sidemenu', - contentWidth: 'Fluid', - fixedHeader: false, - fixSiderbar: false, - colorWeak: false, - menu: { - locale: true, - }, - title: 'Dega Admin', - pwa: false, - iconfontUrl: '', - sider: { - collapsed: false, - }, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/sidebarReducer.js b/studio/src/__tests__/reducers/sidebarReducer.js deleted file mode 100644 index 4ec21bd9c..000000000 --- a/studio/src/__tests__/reducers/sidebarReducer.js +++ /dev/null @@ -1,39 +0,0 @@ -import reducer from '../../reducers/sidebarReducer'; -import * as types from '../../constants/sidebar'; - -const initialState = { - collapsed: false, -}; - -describe('Sidebar reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - collapsed: false, - }), - ).toEqual({ - collapsed: false, - }); - }); - it('should handle SET_COLLAPSE', () => { - expect( - reducer(initialState, { - type: types.SET_COLLAPSE, - payload: true, - }), - ).toEqual({ - collapsed: true, - }); - expect( - reducer(initialState, { - type: types.SET_COLLAPSE, - payload: false, - }), - ).toEqual({ - collapsed: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/spaces.js b/studio/src/__tests__/reducers/spaces.js deleted file mode 100644 index 085c58496..000000000 --- a/studio/src/__tests__/reducers/spaces.js +++ /dev/null @@ -1,369 +0,0 @@ -import reducer from '../../reducers/spacesReducer'; -import * as types from '../../constants/spaces'; - -const initialState = { - orgs: [], - details: {}, - loading: true, - selected: 0, -}; - -const space = { - id: 1, - organisation: { id: 1, title: 'organization 1' }, - applications: [{ id: 1, name: 'Dega' }], - permission: [{ id: 1, role: 'owner' }], - spaces: [{ id: 11, name: 'Space 11' }], -}; -const space2 = { - id: 2, - applications: [ - { id: 1, name: 'Dega' }, - { id: 2, name: 'Dataful' }, - ], - permission: [{ id: 2, role: 'owner' }], - organisation: { id: 2, title: 'organization 2' }, - spaces: [ - { id: 21, name: 'Space 21' }, - { id: 22, name: 'Space 22' }, - ], -}; - -describe('spaces reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect(reducer(initialState, { type: 'NON_EXISTING', payload: {} })).toEqual(initialState); - }); - it('should return the state when payload is empty', () => { - expect(reducer(initialState, { type: types.SET_SELECTED_SPACE })).toEqual(initialState); - }); - it('should return the state when action is empty', () => { - expect(reducer(initialState)).toEqual(initialState); - }); - it('should handle LOADING_SPACES', () => { - expect( - reducer(initialState, { - type: types.LOADING_SPACES, - payload: {}, - }), - ).toEqual({ - orgs: [], - details: {}, - loading: true, - selected: 0, - }); - }); - it('should handle GET_SPACES_SUCCESS', () => { - console.log( - reducer(initialState, { - type: types.GET_SPACES_SUCCESS, - payload: [space, space2], - }), - ); - expect( - reducer(initialState, { - type: types.GET_SPACES_SUCCESS, - payload: [space, space2], - }), - ).toEqual({ - orgs: [ - { - id: 1, - title: 'organization 1', - permission: [{ id: 1, role: 'owner' }], - applications: [{ id: 1, name: 'Dega' }], - spaces: [11], - }, - { - id: 2, - title: 'organization 2', - permission: [{ id: 2, role: 'owner' }], - applications: [ - { id: 1, name: 'Dega' }, - { id: 2, name: 'Dataful' }, - ], - spaces: [21, 22], - }, - ], - details: { - 11: { id: 11, name: 'Space 11' }, - 21: { id: 21, name: 'Space 21' }, - 22: { id: 22, name: 'Space 22' }, - }, - loading: false, - selected: 11, - }); - }); - it('should handle empty payload GET_SPACES_SUCCESS', () => { - expect( - reducer(initialState, { - type: types.GET_SPACES_SUCCESS, - payload: [], - }), - ).toEqual({ - orgs: [], - details: {}, - loading: false, - selected: 0, - }); - }); - it('should handle GET_SPACES_SUCCESS when spaces in payload does not exists in state', () => { - expect( - reducer( - { - orgs: [{ id: 1, organazation: 'Organization 1', spaces: [11] }], - details: { - 11: { id: 11, name: 'Space 11' }, - }, - loading: false, - selected: 11, - }, - { - type: types.GET_SPACES_SUCCESS, - payload: [space2], - }, - ), - ).toEqual({ - orgs: [ - { - id: 2, - title: 'organization 2', - permission: [{ id: 2, role: 'owner' }], - applications: [ - { id: 1, name: 'Dega' }, - { id: 2, name: 'Dataful' }, - ], - spaces: [21, 22], - }, - ], - details: { - 21: { id: 21, name: 'Space 21' }, - 22: { id: 22, name: 'Space 22' }, - }, - loading: false, - selected: 21, - }); - }); - it('should handle GET_SPACES_SUCCESS when some spaces in payload already exists in state', () => { - expect( - reducer( - { - orgs: [ - { - id: 1, - title: 'organization 1', - permission: [{ id: 1, role: 'owner' }], - applications: [{ id: 1, name: 'Dega' }], - spaces: [11], - }, - ], - details: { - 11: { id: 11, name: 'Space 11' }, - }, - loading: false, - selected: 11, - }, - { - type: types.GET_SPACES_SUCCESS, - payload: [space, space2], - }, - ), - ).toEqual({ - orgs: [ - { - id: 1, - title: 'organization 1', - permission: [{ id: 1, role: 'owner' }], - applications: [{ id: 1, name: 'Dega' }], - spaces: [11], - }, - { - id: 2, - title: 'organization 2', - permission: [{ id: 2, role: 'owner' }], - applications: [ - { id: 1, name: 'Dega' }, - { id: 2, name: 'Dataful' }, - ], - spaces: [21, 22], - }, - ], - details: { - 11: { id: 11, name: 'Space 11' }, - 21: { id: 21, name: 'Space 21' }, - 22: { id: 22, name: 'Space 22' }, - }, - loading: false, - selected: 11, - }); - }); - it('should handle ADD_SPACE_SUCCESS', () => { - expect( - reducer( - { - orgs: [{ id: 1, organazation: 'Organization 1', spaces: [11] }], - details: { - 11: { id: 11, name: 'Space 11' }, - }, - loading: false, - selected: 11, - }, - { - type: types.ADD_SPACE_SUCCESS, - payload: { - id: 12, - name: 'Space 12', - organisation_id: 1, - }, - }, - ), - ).toEqual({ - orgs: [{ id: 1, organazation: 'Organization 1', spaces: [12, 11] }], - details: { - 11: { id: 11, name: 'Space 11' }, - 12: { id: 12, name: 'Space 12', organisation_id: 1 }, - }, - loading: false, - selected: 12, - }); - }); - it('should handle SET_SELECTED_SPACE', () => { - expect( - reducer(initialState, { - type: types.SET_SELECTED_SPACE, - payload: 1, - }), - ).toEqual({ - orgs: [], - details: {}, - loading: true, - selected: 1, - }); - }); - it('should handle UPDATE_SPACE_SUCCESS', () => { - expect( - reducer( - { - orgs: [], - details: { 1: { id: 1, name: 'existing space' } }, - loading: false, - selected: 1, - }, - { - type: types.UPDATE_SPACE_SUCCESS, - payload: { id: 1, name: 'updated space' }, - }, - ), - ).toEqual({ - orgs: [], - details: { - 1: { id: 1, name: 'updated space' }, - }, - loading: false, - selected: 1, - }); - }); - it('should handle ADD_SPACE_USERS', () => { - expect( - reducer( - { - orgs: [ - { - id: 1, - title: 'organization 1', - permission: [{ id: 1, role: 'owner' }], - applications: [{ id: 1, name: 'Dega' }], - spaces: [11], - }, - { - id: 2, - title: 'organization 2', - permission: [{ id: 2, role: 'owner' }], - applications: [ - { id: 1, name: 'Dega' }, - { id: 2, name: 'Dataful' }, - ], - spaces: [21, 22], - }, - ], - details: { - 11: { id: 11, name: 'Space 11' }, - 21: { id: 21, name: 'Space 21' }, - 22: { id: 22, name: 'Space 22' }, - }, - loading: false, - selected: 11, - }, - { - type: types.ADD_SPACE_USERS, - payload: { - data: [ - { id: 1, email: 'testuser1@gmail.com' }, - { id: 2, email: 'testuser2@gmail.com' }, - ], - id: 11, - }, - }, - ), - ).toEqual({ - orgs: [ - { - id: 1, - title: 'organization 1', - permission: [{ id: 1, role: 'owner' }], - applications: [{ id: 1, name: 'Dega' }], - spaces: [11], - }, - { - id: 2, - title: 'organization 2', - permission: [{ id: 2, role: 'owner' }], - applications: [ - { id: 1, name: 'Dega' }, - { id: 2, name: 'Dataful' }, - ], - spaces: [21, 22], - }, - ], - details: { - 11: { - id: 11, - name: 'Space 11', - users: [ - { id: 1, email: 'testuser1@gmail.com' }, - { id: 2, email: 'testuser2@gmail.com' }, - ], - }, - 21: { id: 21, name: 'Space 21' }, - 22: { id: 22, name: 'Space 22' }, - }, - loading: false, - selected: 11, - }); - }); - it('should handle DELETE_SPACE_SUCCESS', () => { - expect( - reducer( - { - orgs: [], - details: { - 1: { id: 1, name: 'existing space' }, - }, - loading: false, - selected: 1, - }, - { - type: types.DELETE_SPACE_SUCCESS, - payload: 1, - }, - ), - ).toEqual({ - orgs: [], - details: {}, - loading: true, - selected: 0, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/tags.js b/studio/src/__tests__/reducers/tags.js deleted file mode 100644 index 292cbf81b..000000000 --- a/studio/src/__tests__/reducers/tags.js +++ /dev/null @@ -1,194 +0,0 @@ -import reducer from '../../reducers/tagsReducer'; -import * as types from '../../constants/tags'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('tags reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_TAGS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'tag' }], - loading: false, - }, - { - type: types.RESET_TAGS, - payload: {}, - }, - ), - ).toEqual({ - req: [], - details: [{ id: 1, name: 'tag' }], - loading: true, - }); - }); - it('should handle SET_TAGS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_TAGS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_TAGS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_TAGS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_TAGS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_TAGS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_TAGS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_TAGS', () => { - expect( - reducer(initialState, { - type: types.ADD_TAGS, - payload: [ - { id: 1, name: 'tag 1' }, - { id: 2, name: 'tag 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'tag 1' }, 2: { id: 2, name: 'tag 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_TAGS', () => { - expect( - reducer(initialState, { - type: types.ADD_TAGS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle GET_TAG', () => { - expect( - reducer(initialState, { - type: types.GET_TAG, - payload: { id: 1, name: 'new tag' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new tag' } }, - loading: true, - }); - }); - it('should handle GET_TAG when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing tag' } }, - loading: false, - }, - { - type: types.GET_TAG, - payload: { id: 2, name: 'new tag' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing tag' }, - 2: { id: 2, name: 'new tag' }, - }, - loading: false, - }); - }); - - it('should handle UPDATE_TAG when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing tag' }, - 2: { id: 2, name: 'new tag' }, - }, - loading: false, - }, - { - type: types.UPDATE_TAG, - payload: { id: 2, name: 'updated tag' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing tag' }, - 2: { id: 2, name: 'updated tag' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/users.js b/studio/src/__tests__/reducers/users.js deleted file mode 100644 index ed1cd9c2e..000000000 --- a/studio/src/__tests__/reducers/users.js +++ /dev/null @@ -1,76 +0,0 @@ -import reducer from '../../reducers/usersReducer'; -import * as types from '../../constants/users'; - -const initialState = { - details: [], - loading: true, -}; - -const user = { - id: 1, - created_at: '2020-09-23T06:11:01.39323Z', - updated_at: '2020-09-25T12:32:46.395603Z', - deleted_at: null, - email: 'ross@friends.in', - first_name: 'Ross', - last_name: 'Geller', - birth_date: '2020-09-02T18:02:41+05:30', - gender: 'male', - policies: [ - { - id: 'admin', - name: 'admin', - description: '', - }, - ], -}; - -describe('user reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - details: [user], - loading: false, - }), - ).toEqual({ - details: [user], - loading: false, - }); - }); - it('should handle SET_USERS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_USERS_LOADING, - payload: true, - }), - ).toEqual({ - details: [], - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_USERS_LOADING, - payload: false, - }), - ).toEqual({ - details: [], - loading: false, - }); - }); - it('should handle ADD_USERS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_USERS_REQUEST, - payload: { - data: [user], - }, - }), - ).toEqual({ - details: [user], - loading: true, - }); - }); -}); diff --git a/studio/src/__tests__/reducers/webhooks.js b/studio/src/__tests__/reducers/webhooks.js deleted file mode 100644 index 65c279357..000000000 --- a/studio/src/__tests__/reducers/webhooks.js +++ /dev/null @@ -1,189 +0,0 @@ -import reducer from '../../reducers/webhooksReducer'; -import * as types from '../../constants/webhooks'; - -const initialState = { - req: [], - details: {}, - loading: true, -}; - -describe('webhooks reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {})).toEqual(initialState); - }); - it('should return the state for default case', () => { - expect( - reducer({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: { 1: { id: 1, name: 'entity' } }, - loading: false, - }); - }); - it('should handle RESET_WEBHOOKS', () => { - expect( - reducer( - { - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: [{ id: 1, name: 'webhook' }], - loading: false, - }, - { - type: types.RESET_WEBHOOKS, - payload: {}, - }, - ), - ).toEqual(initialState); - }); - it('should handle SET_WEBHOOKS_LOADING', () => { - expect( - reducer(initialState, { - type: types.SET_WEBHOOKS_LOADING, - payload: true, - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - expect( - reducer(initialState, { - type: types.SET_WEBHOOKS_LOADING, - payload: false, - }), - ).toEqual({ - req: [], - details: {}, - loading: false, - }); - }); - it('should handle ADD_WEBHOOKS_REQUEST', () => { - expect( - reducer(initialState, { - type: types.ADD_WEBHOOKS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_WEBHOOKS_REQUEST when req already exists', () => { - expect( - reducer( - { - req: [{ data: [1, 2], query: { page: 1, limit: 5 }, total: 2 }], - details: {}, - loading: true, - }, - { - type: types.ADD_WEBHOOKS_REQUEST, - payload: { - data: [1, 2, 3], - query: { page: 1, limit: 5 }, - total: 3, - }, - }, - ), - ).toEqual({ - req: [{ data: [1, 2, 3], query: { page: 1, limit: 5 }, total: 3 }], - details: {}, - loading: true, - }); - }); - it('should handle ADD_WEBHOOKS', () => { - expect( - reducer(initialState, { - type: types.ADD_WEBHOOKS, - payload: [ - { id: 1, name: 'Webhook 1' }, - { id: 2, name: 'Webhook 2' }, - ], - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'Webhook 1' }, 2: { id: 2, name: 'Webhook 2' } }, - loading: true, - }); - }); - it('should handle empty payload ADD_WEBHOOKS', () => { - expect( - reducer(initialState, { - type: types.ADD_WEBHOOKS, - payload: [], - }), - ).toEqual({ - req: [], - details: {}, - loading: true, - }); - }); - it('should handle ADD_WEBHOOK', () => { - expect( - reducer(initialState, { - type: types.ADD_WEBHOOK, - payload: { id: 1, name: 'new webhook' }, - }), - ).toEqual({ - req: [], - details: { 1: { id: 1, name: 'new webhook' } }, - loading: true, - }); - }); - it('should handle ADD_WEBHOOK when details is non-empty', () => { - expect( - reducer( - { - req: [], - details: { 1: { id: 1, name: 'existing webhook' } }, - loading: false, - }, - { - type: types.ADD_WEBHOOK, - payload: { id: 2, name: 'new webhook' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing webhook' }, - 2: { id: 2, name: 'new webhook' }, - }, - loading: false, - }); - }); - it('should handle ADD_WEBHOOK when already exists', () => { - expect( - reducer( - { - req: [], - details: { - 1: { id: 1, name: 'existing webhook' }, - 2: { id: 2, name: 'new webhook' }, - }, - loading: false, - }, - { - type: types.ADD_WEBHOOK, - payload: { id: 2, name: 'updated webhook' }, - }, - ), - ).toEqual({ - req: [], - details: { - 1: { id: 1, name: 'existing webhook' }, - 2: { id: 2, name: 'updated webhook' }, - }, - loading: false, - }); - }); -}); diff --git a/studio/src/actions/authors.js b/studio/src/actions/authors.js deleted file mode 100644 index 7fd44f071..000000000 --- a/studio/src/actions/authors.js +++ /dev/null @@ -1,59 +0,0 @@ -import axios from 'axios'; -import { - SET_AUTHORS_LOADING, - ADD_AUTHORS, - AUTHORS_API, - ADD_AUTHORS_REQUEST, -} from '../constants/authors'; -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getAuthors = (query) => { - return (dispatch) => { - dispatch(loadingAuthors()); - return axios - .get(AUTHORS_API, { - params: query, - }) - .then((response) => { - dispatch(addAuthorsList(response.data.nodes)); - dispatch( - addAuthorsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopAuthorsLoading())); - }; -}; - -export const addAuthors = (authors) => { - return (dispatch) => { - dispatch(addAuthorsList(authors)); - }; -}; - -export const loadingAuthors = () => ({ - type: SET_AUTHORS_LOADING, - payload: true, -}); - -export const stopAuthorsLoading = () => ({ - type: SET_AUTHORS_LOADING, - payload: false, -}); - -export const addAuthorsList = (data) => ({ - type: ADD_AUTHORS, - payload: data, -}); - -export const addAuthorsRequest = (data) => ({ - type: ADD_AUTHORS_REQUEST, - payload: data, -}); diff --git a/studio/src/actions/authors.ts b/studio/src/actions/authors.ts new file mode 100644 index 000000000..ea9c5c29a --- /dev/null +++ b/studio/src/actions/authors.ts @@ -0,0 +1,89 @@ +import axios from "axios"; +import { + SET_AUTHORS_LOADING, + ADD_AUTHORS, + AUTHORS_API, + ADD_AUTHORS_REQUEST, +} from "../constants/authors"; +import { addErrorNotification } from "./notifications"; +import getError from "../utils/getError"; +import { Dispatch } from "redux"; + +// Define interfaces for the data structures +interface Author { + id: string | number; + [key: string]: any; // Additional author properties +} + +interface AuthorsResponse { + nodes: Author[]; + total: number; +} + +interface AuthorsRequestData { + data: (string | number)[]; + query: Record; + total: number; +} + +interface AuthorsAction { + type: string; + payload: any; +} + +// Define action creator return types +type AppThunk = ( + dispatch: Dispatch +) => ReturnType; + +export const getAuthors = ( + query: Record +): AppThunk> => { + return (dispatch: Dispatch) => { + dispatch(loadingAuthors()); + return axios + .get(AUTHORS_API, { + params: query, + }) + .then((response) => { + dispatch(addAuthorsList(response.data.nodes)); + dispatch( + addAuthorsRequest({ + data: response.data.nodes.map((item) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopAuthorsLoading())); + }; +}; + +export const addAuthors = (authors: Author[]): AppThunk => { + return (dispatch: Dispatch) => { + dispatch(addAuthorsList(authors)); + }; +}; + +export const loadingAuthors = (): AuthorsAction => ({ + type: SET_AUTHORS_LOADING, + payload: true, +}); + +export const stopAuthorsLoading = (): AuthorsAction => ({ + type: SET_AUTHORS_LOADING, + payload: false, +}); + +export const addAuthorsList = (data: Author[]): AuthorsAction => ({ + type: ADD_AUTHORS, + payload: data, +}); + +export const addAuthorsRequest = (data: AuthorsRequestData): AuthorsAction => ({ + type: ADD_AUTHORS_REQUEST, + payload: data, +}); diff --git a/studio/src/actions/categories.js b/studio/src/actions/categories.js deleted file mode 100644 index 272f4af17..000000000 --- a/studio/src/actions/categories.js +++ /dev/null @@ -1,186 +0,0 @@ -import axios from 'axios'; -import { - ADD_CATEGORIES, - ADD_CATEGORIES_REQUEST, - SET_CATEGORIES_LOADING, - RESET_CATEGORIES, - CATEGORIES_API, - GET_CATEGORY, - UPDATE_CATEGORY, -} from '../constants/categories'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addMedia } from './media'; -import getError from '../utils/getError'; - -// action to fetch all categories -export const getCategories = (query, setLoading = true) => { - return (dispatch, getState) => { - const currentSpaceID = getState().spaces?.selected; - if (currentSpaceID === 0) { - return; - } - if (setLoading) dispatch(loadingCategories()); - return axios - .get(CATEGORIES_API, { - params: query, - }) - .then((response) => { - dispatch( - addMedia( - response.data.nodes - .filter((category) => category.medium) - .map((category) => category.medium), - ), - ); - dispatch( - addCategoriesList( - response.data.nodes.map((category) => { - category.description = { - json: category.description, - html: category.description_html, - }; - return { ...category, medium: category.medium?.id }; - }), - ), - ); - dispatch( - addCategoriesRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - if (setLoading) dispatch(stopCategoriesLoading()); - }); - }; -}; - -// action to fetch category by id -export const getCategory = (id) => { - return (dispatch) => { - dispatch(loadingCategories()); - return axios - .get(CATEGORIES_API + '/' + id) - .then((response) => { - if (response.data.medium) dispatch(addMedia([response.data.medium])); - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch(addCategory(GET_CATEGORY, { ...response.data, medium: response.data.medium?.id })); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopCategoriesLoading())); - }; -}; - -// action to create category -export const createCategory = (data) => { - return (dispatch) => { - dispatch(loadingCategories()); - return axios - .post(CATEGORIES_API, data) - .then(() => { - dispatch(resetCategories()); - dispatch(addSuccessNotification('Category created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update category by id -export const updateCategory = (data) => { - return (dispatch) => { - dispatch(loadingCategories()); - return axios - .put(CATEGORIES_API + '/' + data.id, data) - .then((response) => { - if (response.data.medium) dispatch(addMedia([response.data.medium])); - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch( - addCategory(UPDATE_CATEGORY, { ...response.data, medium: response.data.medium?.id }), - ); - dispatch(addSuccessNotification('Category updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopCategoriesLoading())); - }; -}; - -// action to delete category by id -export const deleteCategory = (id) => { - return (dispatch) => { - dispatch(loadingCategories()); - return axios - .delete(CATEGORIES_API + '/' + id) - .then(() => { - dispatch(resetCategories()); - dispatch(addSuccessNotification('Category deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const addCategories = (categories) => { - return (dispatch) => { - dispatch( - addMedia(categories.filter((category) => category.medium).map((category) => category.medium)), - ); - dispatch( - addCategoriesList( - categories.map((category) => { - category.description = { - json: category.description, - html: category.description_html, - }; - return { ...category, medium: category.medium?.id }; - }), - ), - ); - }; -}; - -export const loadingCategories = () => ({ - type: SET_CATEGORIES_LOADING, - payload: true, -}); - -export const stopCategoriesLoading = () => ({ - type: SET_CATEGORIES_LOADING, - payload: false, -}); - -export const addCategory = (type, payload) => ({ - type, - payload, -}); - -export const addCategoriesList = (data) => ({ - type: ADD_CATEGORIES, - payload: data, -}); - -export const addCategoriesRequest = (data) => ({ - type: ADD_CATEGORIES_REQUEST, - payload: data, -}); - -export const resetCategories = () => ({ - type: RESET_CATEGORIES, -}); diff --git a/studio/src/actions/categories.ts b/studio/src/actions/categories.ts new file mode 100644 index 000000000..313334bb1 --- /dev/null +++ b/studio/src/actions/categories.ts @@ -0,0 +1,355 @@ +import axios from "axios"; +import { + ADD_CATEGORIES, + ADD_CATEGORIES_REQUEST, + SET_CATEGORIES_LOADING, + RESET_CATEGORIES, + CATEGORIES_API, + GET_CATEGORY, + UPDATE_CATEGORY, +} from "../constants/categories"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addMedia } from "./media"; +import getError from "../utils/getError"; +import { ThunkAction } from "redux-thunk"; +import { RootState } from "../store/index"; +import { AnyAction } from "redux"; + +// Define types +interface Medium { + id: number; + [key: string]: any; +} + +interface Description { + json: any; + html: string; +} + +interface Category { + id: string | number; + name: string; + description?: any; + description_html?: string; + medium?: Medium | null; + [key: string]: any; +} + +interface CategoryWithProcessedFields { + id: string | number; // Allow both string and number IDs + name: string; + description: Description; + medium?: number | null; + [key: string]: any; +} + +interface CategoryResponse { + nodes: Category[]; + total: number; +} + +interface GetCategoriesQuery { + [key: string]: any; +} + +interface CategoryRequest { + data: string[]; + query: GetCategoriesQuery; + total: number; +} + +// Define action types +interface SetCategoriesLoadingAction { + type: typeof SET_CATEGORIES_LOADING; + payload: boolean; +} + +interface AddCategoriesAction { + type: typeof ADD_CATEGORIES; + payload: CategoryWithProcessedFields[]; +} + +interface AddCategoriesRequestAction { + type: typeof ADD_CATEGORIES_REQUEST; + payload: CategoryRequest; +} + +interface ResetCategoriesAction { + type: typeof RESET_CATEGORIES; +} + +interface GetCategoryAction { + type: typeof GET_CATEGORY; + payload: CategoryWithProcessedFields; +} + +interface UpdateCategoryAction { + type: typeof UPDATE_CATEGORY; + payload: CategoryWithProcessedFields; +} + +type CategoryActionTypes = + | SetCategoriesLoadingAction + | AddCategoriesAction + | AddCategoriesRequestAction + | ResetCategoriesAction + | GetCategoryAction + | UpdateCategoryAction; + +type AppThunk = ThunkAction< + Promise, + RootState, + unknown, + AnyAction +>; + +// Helper function to process category data +const processCategory = (category: Category): CategoryWithProcessedFields => { + const { medium, description_html, parent_category, ...rest } = category; + + return { + ...rest, + description: { + json: category.description, + html: description_html || "", + }, + medium: medium?.id || null, + // Preserve parent_category data for use in UI + parent_category: parent_category + ? { + id: parent_category.id, + name: parent_category.name, + } + : undefined, + }; +}; + +// Helper to ensure the ID is properly formatted for API calls +const ensureValidId = (id: string | number): string => { + // If it's already a string, just return it + if (typeof id === "string") { + return id; + } + + // If it's a number, convert to string + return String(id); +}; + +// action to fetch all categories +export const getCategories = ( + query: GetCategoriesQuery, + setLoading: boolean = true +): AppThunk => { + return (dispatch, getState) => { + const currentSpaceID = getState().spaces?.selected; + if (currentSpaceID === "" || currentSpaceID === "0") { + return Promise.resolve(); + } + + if (setLoading) dispatch(loadingCategories()); + const querySnapshot = { ...query }; + + return axios + .get(CATEGORIES_API, { + params: querySnapshot, + }) + .then((response) => { + // Add media to store + const mediaItems = response.data.nodes + .filter((category): category is Category & { medium: Medium } => + Boolean(category.medium) + ) + .map((category) => category.medium); + + if (mediaItems.length > 0) { + dispatch(addMedia(mediaItems)); + } + + // Process and add categories with parent data + const processedCategories = response.data.nodes.map(processCategory); + dispatch(addCategoriesList(processedCategories)); + + // Add categories request + dispatch( + addCategoriesRequest({ + data: response.data.nodes.map((item) => String(item.id)), + query: querySnapshot, + total: response.data.total, + }) + ); + + return response; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); + }) + .finally(() => { + if (setLoading) dispatch(stopCategoriesLoading()); + }); + }; +}; + +// action to fetch category by id +export const getCategory = (id: string | number): AppThunk => { + return (dispatch) => { + // Validate id before making the API call + if (!id) { + dispatch(addErrorNotification("Invalid category ID")); + return Promise.reject(new Error("Invalid category ID")); + } + + const validId = ensureValidId(id); + + dispatch(loadingCategories()); + return axios + .get(`${CATEGORIES_API}/${validId}`) + .then((response) => { + if (response.data.medium) { + dispatch(addMedia([response.data.medium])); + } + + // Preserve the original ID format from the response + const processedCategory = processCategory(response.data); + dispatch(addCategory(GET_CATEGORY, processedCategory)); + return response; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); + }) + .finally(() => dispatch(stopCategoriesLoading())); + }; +}; + +// action to create category +export const createCategory = (data: Partial): AppThunk => { + return (dispatch) => { + dispatch(loadingCategories()); + return axios + .post(CATEGORIES_API, data) + .then((response) => { + dispatch(resetCategories()); + dispatch(addSuccessNotification("Category created")); + return response; // Important: Return the response for proper Promise chaining + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); + }) + .finally(() => dispatch(stopCategoriesLoading())); + }; +}; + +// action to update category by id +export const updateCategory = (data: Category): AppThunk => { + return (dispatch) => { + if (!data.id) { + dispatch(addErrorNotification("Category ID is required for update")); + return Promise.reject(new Error("Category ID is required")); + } + + const validId = ensureValidId(data.id); + + dispatch(loadingCategories()); + return axios + .put(`${CATEGORIES_API}/${validId}`, data) + .then((response) => { + if (response.data.medium) { + dispatch(addMedia([response.data.medium])); + } + + // Preserve the original ID format from the response + const processedCategory = processCategory(response.data); + dispatch(addCategory(UPDATE_CATEGORY, processedCategory)); + dispatch(addSuccessNotification("Category updated")); + return response; // Important: Return the response for proper Promise chaining + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); + }) + .finally(() => dispatch(stopCategoriesLoading())); + }; +}; + +export const deleteCategory = (id: string | number): AppThunk => { + return (dispatch) => { + if (!id) { + dispatch(addErrorNotification("Invalid category ID")); + return Promise.reject(new Error("Invalid category ID")); + } + + const validId = ensureValidId(id); + + dispatch(loadingCategories()); + return axios + .delete(`${CATEGORIES_API}/${validId}`) + .then((response) => { + dispatch(resetCategories()); + dispatch(addSuccessNotification("Category deleted")); + return response; // Return the response for chaining + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); // Propagate the error + }) + .finally(() => { + dispatch(stopCategoriesLoading()); + }); + }; +}; + +export const addCategories = (categories: Category[]): AppThunk => { + return (dispatch) => { + const mediaItems = categories + .filter((category): category is Category & { medium: Medium } => + Boolean(category.medium) + ) + .map((category) => category.medium); + + if (mediaItems.length > 0) { + dispatch(addMedia(mediaItems)); + } + + const processedCategories = categories.map(processCategory); + dispatch(addCategoriesList(processedCategories)); + return Promise.resolve(); + }; +}; + +export const loadingCategories = (): SetCategoriesLoadingAction => ({ + type: SET_CATEGORIES_LOADING, + payload: true, +}); + +export const stopCategoriesLoading = (): SetCategoriesLoadingAction => ({ + type: SET_CATEGORIES_LOADING, + payload: false, +}); + +export const addCategory = ( + type: typeof GET_CATEGORY | typeof UPDATE_CATEGORY, + payload: CategoryWithProcessedFields +): GetCategoryAction | UpdateCategoryAction => ({ + type, + payload, +}); + +export const addCategoriesList = ( + data: CategoryWithProcessedFields[] +): AddCategoriesAction => ({ + type: ADD_CATEGORIES, + payload: data, +}); + +export const addCategoriesRequest = ( + data: CategoryRequest +): AddCategoriesRequestAction => ({ + type: ADD_CATEGORIES_REQUEST, + payload: data, +}); + +export const resetCategories = (): ResetCategoriesAction => ({ + type: RESET_CATEGORIES, +}); diff --git a/studio/src/actions/claimants.js b/studio/src/actions/claimants.js deleted file mode 100644 index d46939624..000000000 --- a/studio/src/actions/claimants.js +++ /dev/null @@ -1,176 +0,0 @@ -import axios from 'axios'; -import { - ADD_CLAIMANTS, - ADD_CLAIMANTS_REQUEST, - SET_CLAIMANTS_LOADING, - RESET_CLAIMANTS, - CLAIMANTS_API, - UPDATE_CLAIMANT, - GET_CLAIMANT, -} from '../constants/claimants'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addMedia } from './media'; -import getError from '../utils/getError'; - -// action to fetch all claimants -export const getClaimants = (query) => { - return (dispatch) => { - dispatch(loadingClaimants()); - return axios - .get(CLAIMANTS_API, { - params: query, - }) - .then((response) => { - dispatch( - addMedia( - response.data.nodes - .filter((claimant) => claimant.medium) - .map((claimant) => claimant.medium), - ), - ); - dispatch( - addClaimantsList( - response.data.nodes.map((claimant) => { - claimant.description = { - json: claimant.description, - html: claimant.description_html, - }; - return { ...claimant, medium: claimant.medium?.id }; - }), - ), - ); - dispatch( - addClaimantsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopClaimantsLoading())); - }; -}; - -// action to fetch claimant by id -export const getClaimant = (id) => { - return (dispatch) => { - dispatch(loadingClaimants()); - return axios - .get(CLAIMANTS_API + '/' + id) - .then((response) => { - if (response.data.medium) dispatch(addMedia([response.data.medium])); - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch(addClaimant(GET_CLAIMANT, { ...response.data, medium: response.data.medium?.id })); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopClaimantsLoading())); - }; -}; - -// action to create claimant -export const createClaimant = (data) => { - return (dispatch) => { - dispatch(loadingClaimants()); - return axios - .post(CLAIMANTS_API, data) - .then(() => { - dispatch(resetClaimants()); - dispatch(addSuccessNotification('Claimant created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update claimant by id -export const updateClaimant = (data) => { - return (dispatch) => { - dispatch(loadingClaimants()); - return axios - .put(CLAIMANTS_API + '/' + data.id, data) - .then((response) => { - if (response.data.medium) dispatch(addMedia([response.data.medium])); - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch( - addClaimant(UPDATE_CLAIMANT, { ...response.data, medium: response.data.medium?.id }), - ); - dispatch(addSuccessNotification('Claimant updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopClaimantsLoading())); - }; -}; - -// action to delete claimant by id -export const deleteClaimant = (id) => { - return (dispatch) => { - dispatch(loadingClaimants()); - return axios - .delete(CLAIMANTS_API + '/' + id) - .then(() => { - dispatch(resetClaimants()); - dispatch(addSuccessNotification('Claimant deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const addClaimants = (claimants) => { - return (dispatch) => { - dispatch( - addMedia(claimants.filter((claimant) => claimant.medium).map((claimant) => claimant.medium)), - ); - dispatch( - addClaimantsList( - claimants.map((claimant) => { - return { ...claimant, medium: claimant.medium?.id }; - }), - ), - ); - }; -}; - -export const loadingClaimants = () => ({ - type: SET_CLAIMANTS_LOADING, - payload: true, -}); - -export const stopClaimantsLoading = () => ({ - type: SET_CLAIMANTS_LOADING, - payload: false, -}); - -export const addClaimant = (type, payload) => ({ - type, - payload, -}); - -export const addClaimantsList = (data) => ({ - type: ADD_CLAIMANTS, - payload: data, -}); - -export const addClaimantsRequest = (data) => ({ - type: ADD_CLAIMANTS_REQUEST, - payload: data, -}); - -export const resetClaimants = () => ({ - type: RESET_CLAIMANTS, -}); diff --git a/studio/src/actions/claimants.ts b/studio/src/actions/claimants.ts new file mode 100644 index 000000000..cd32510aa --- /dev/null +++ b/studio/src/actions/claimants.ts @@ -0,0 +1,251 @@ +import axios from "axios"; +import { + ADD_CLAIMANTS, + ADD_CLAIMANTS_REQUEST, + SET_CLAIMANTS_LOADING, + RESET_CLAIMANTS, + CLAIMANTS_API, + UPDATE_CLAIMANT, + GET_CLAIMANT, +} from "../constants/claimants"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addMedia } from "./media"; +import getError from "../utils/getError"; +import { Dispatch, AnyAction } from "redux"; + +// Define types +interface Description { + json: any; + html: string; +} + +interface Medium { + id: number; + [key: string]: any; +} + +interface Claimant { + id: number | string; + description?: Description; + description_html?: string; + medium?: Medium | null; + [key: string]: any; +} + +interface ClaimantWithMediumId extends Omit { + medium?: number; +} + +interface ClaimantsResponse { + nodes: Claimant[]; + total: number; +} + +interface QueryParams { + [key: string]: any; +} + +interface ClaimantsRequest { + data: (number | string)[]; + query: QueryParams; + total: number; +} + +// action to fetch all claimants +export const getClaimants = (query: QueryParams) => { + return (dispatch: Dispatch) => { + dispatch(loadingClaimants()); + return axios + .get(CLAIMANTS_API, { + params: query, + }) + .then((response) => { + // Add media to store if available + if (response.data.nodes.some((claimant) => claimant.medium)) { + dispatch( + addMedia( + response.data.nodes + .filter((claimant) => claimant.medium) + .map((claimant) => claimant.medium as Medium) + ) + ); + } + + // Process claimants and add to store + dispatch( + addClaimantsList( + response.data.nodes.map((claimant) => { + const updatedClaimant: ClaimantWithMediumId = { + ...claimant, + description: { + json: claimant.description, + html: claimant.description_html, + }, + medium: claimant.medium?.id, + }; + return updatedClaimant; + }) + ) + ); + + // Add request data to store + dispatch( + addClaimantsRequest({ + data: response.data.nodes.map((item) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopClaimantsLoading())); + }; +}; + +// action to fetch claimant by id +export const getClaimant = (id: number | string) => { + return (dispatch: Dispatch) => { + dispatch(loadingClaimants()); + return axios + .get(`${CLAIMANTS_API}/${id}`) + .then((response) => { + if (response.data.medium) dispatch(addMedia([response.data.medium])); + const updatedClaimant: ClaimantWithMediumId = { + ...response.data, + description: { + json: response.data.description, + html: response.data.description_html, + }, + medium: response.data.medium?.id, + }; + dispatch(addClaimant(GET_CLAIMANT, updatedClaimant)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopClaimantsLoading())); + }; +}; + +// action to create claimant +export const createClaimant = (data: Omit) => { + return (dispatch: Dispatch) => { + dispatch(loadingClaimants()); + return axios + .post(CLAIMANTS_API, data) + .then(() => { + dispatch(resetClaimants()); + dispatch(addSuccessNotification("Claimant created")); + return Promise.resolve(); // Return a promise to allow for chaining + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); // Return rejected promise for error handling + }) + .finally(() => dispatch(stopClaimantsLoading())); + }; +}; + +// action to update claimant by id +export const updateClaimant = (data: Claimant) => { + return (dispatch: Dispatch) => { + dispatch(loadingClaimants()); + return axios + .put(`${CLAIMANTS_API}/${data.id}`, data) + .then((response) => { + if (response.data.medium) dispatch(addMedia([response.data.medium])); + const updatedClaimant: ClaimantWithMediumId = { + ...response.data, + description: { + json: response.data.description, + html: response.data.description_html, + }, + medium: response.data.medium?.id, + }; + dispatch(addClaimant(UPDATE_CLAIMANT, updatedClaimant)); + dispatch(addSuccessNotification("Claimant updated")); + return Promise.resolve(); // Return a promise to allow for chaining + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); // Return rejected promise for error handling + }) + .finally(() => dispatch(stopClaimantsLoading())); + }; +}; + +// action to delete claimant by id +export const deleteClaimant = (id: number | string) => { + return (dispatch: Dispatch) => { + dispatch(loadingClaimants()); + return axios + .delete(`${CLAIMANTS_API}/${id}`) + .then(() => { + dispatch(resetClaimants()); + dispatch(addSuccessNotification("Claimant deleted")); + return Promise.resolve(); // Return a promise to allow for chaining + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + return Promise.reject(error); // Return rejected promise for error handling + }) + .finally(() => dispatch(stopClaimantsLoading())); + }; +}; + +export const addClaimants = (claimants: Claimant[]) => { + return (dispatch: Dispatch) => { + // Only dispatch addMedia if there are claimants with media + if (claimants.some((claimant) => claimant.medium)) { + dispatch( + addMedia( + claimants + .filter((claimant) => claimant.medium) + .map((claimant) => claimant.medium as Medium) + ) + ); + } + + dispatch( + addClaimantsList( + claimants.map((claimant) => { + return { + ...claimant, + medium: claimant.medium?.id, + } as ClaimantWithMediumId; + }) + ) + ); + }; +}; + +export const loadingClaimants = () => ({ + type: SET_CLAIMANTS_LOADING, + payload: true, +}); + +export const stopClaimantsLoading = () => ({ + type: SET_CLAIMANTS_LOADING, + payload: false, +}); + +export const addClaimant = (type: string, payload: ClaimantWithMediumId) => ({ + type, + payload, +}); + +export const addClaimantsList = (data: ClaimantWithMediumId[]) => ({ + type: ADD_CLAIMANTS, + payload: data, +}); + +export const addClaimantsRequest = (data: ClaimantsRequest) => ({ + type: ADD_CLAIMANTS_REQUEST, + payload: data, +}); + +export const resetClaimants = () => ({ + type: RESET_CLAIMANTS, +}); diff --git a/studio/src/actions/claims.js b/studio/src/actions/claims.js deleted file mode 100644 index c8e76428b..000000000 --- a/studio/src/actions/claims.js +++ /dev/null @@ -1,207 +0,0 @@ -import axios from 'axios'; -import { - ADD_CLAIMS, - ADD_CLAIMS_REQUEST, - SET_CLAIMS_LOADING, - RESET_CLAIMS, - CLAIMS_API, - GET_CLAIM, - UPDATE_CLAIM, -} from '../constants/claims'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addRatings } from './ratings'; -import { addClaimants } from './claimants'; -import getError from '../utils/getError'; - -// action to fetch all claims -export const getClaims = (query) => { - const params = new URLSearchParams(); - if (query.claimant && query.claimant.length > 0) { - query.claimant.map((each) => params.append('claimant', each)); - } - if (query.rating && query.rating.length > 0) { - query.rating.map((each) => params.append('rating', each)); - } - if (query.page) { - params.append('page', query.page); - } - if (query.limit) { - params.append('limit', query.limit); - } - if (query.sort) { - params.append('sort', query.sort); - } - if (query.q) { - params.append('q', query.q); - } - return (dispatch) => { - dispatch(loadingClaims()); - return axios - .get(CLAIMS_API, { - params: params, - }) - .then((response) => { - dispatch( - addClaimants( - response.data.nodes.filter((claim) => claim.claimant).map((claim) => claim.claimant), - ), - ); - dispatch( - addRatings( - response.data.nodes.filter((claim) => claim.rating).map((claim) => claim.rating), - ), - ); - dispatch( - addClaimsList( - response.data.nodes.map((claim) => { - claim.description = { json: claim.description, html: claim.description_html }; - return { ...claim, claimant: claim.claimant.id, rating: claim.rating.id }; - }), - ), - ); - dispatch( - addClaimsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopClaimsLoading())); - }; -}; - -// action to fetch claim by id -export const getClaim = (id) => { - return (dispatch) => { - dispatch(loadingClaims()); - return axios - .get(CLAIMS_API + '/' + id) - .then((response) => { - let claim = response.data; - claim.description = { json: claim.description, html: claim.description_html }; - dispatch(addClaimants([claim.claimant])); - dispatch(addRatings([claim.rating])); - - dispatch( - addClaim(GET_CLAIM, { ...claim, claimant: claim.claimant.id, rating: claim.rating.id }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopClaimsLoading())); - }; -}; - -// action to create claim -export const createClaim = (data) => { - return (dispatch) => { - dispatch(loadingClaims()); - return axios - .post(CLAIMS_API, data) - .then((response) => { - let claim = response.data; - claim.description = { json: claim.description, html: claim.description_html }; - dispatch(addClaimants([claim.claimant])); - dispatch(addRatings([claim.rating])); - - dispatch(resetClaims()); - dispatch(addSuccessNotification('Claim created')); - return claim; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update claim by id -export const updateClaim = (data) => { - return (dispatch) => { - dispatch(loadingClaims()); - return axios - .put(CLAIMS_API + '/' + data.id, data) - .then((response) => { - let claim = response.data; - claim.description = { json: claim.description, html: claim.description_html }; - dispatch(addClaimants([claim.claimant])); - dispatch(addRatings([claim.rating])); - - dispatch( - addClaim(UPDATE_CLAIM, { - ...claim, - claimant: claim.claimant.id, - rating: claim.rating.id, - }), - ); - dispatch(addSuccessNotification('Claim updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopClaimsLoading())); - }; -}; - -// action to delete claim by id -export const deleteClaim = (id) => { - return (dispatch) => { - dispatch(loadingClaims()); - return axios - .delete(CLAIMS_API + '/' + id) - .then(() => { - dispatch(resetClaims()); - dispatch(addSuccessNotification('Claim deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const addClaims = (claims) => { - return (dispatch) => { - dispatch(addClaimants(claims.filter((claim) => claim.claimant).map((claim) => claim.claimant))); - dispatch(addRatings(claims.filter((claim) => claim.rating).map((claim) => claim.rating))); - dispatch( - addClaimsList( - claims.map((claim) => { - return { ...claim, claimant: claim.claimant.id, rating: claim.rating.id }; - }), - ), - ); - }; -}; - -export const loadingClaims = () => ({ - type: SET_CLAIMS_LOADING, - payload: true, -}); - -export const stopClaimsLoading = () => ({ - type: SET_CLAIMS_LOADING, - payload: false, -}); - -export const addClaim = (type, payload) => ({ - type, - payload, -}); - -export const addClaimsList = (payload) => ({ - type: ADD_CLAIMS, - payload, -}); - -export const addClaimsRequest = (payload) => ({ - type: ADD_CLAIMS_REQUEST, - payload, -}); - -export const resetClaims = () => ({ - type: RESET_CLAIMS, -}); diff --git a/studio/src/actions/claims.ts b/studio/src/actions/claims.ts new file mode 100644 index 000000000..c7ca05ea9 --- /dev/null +++ b/studio/src/actions/claims.ts @@ -0,0 +1,400 @@ +import axios from "axios"; +import { + ADD_CLAIMS, + ADD_CLAIMS_REQUEST, + SET_CLAIMS_LOADING, + RESET_CLAIMS, + CLAIMS_API, + GET_CLAIM, + UPDATE_CLAIM, +} from "../constants/claims"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addRatings } from "./ratings"; +import { addClaimants } from "./claimants"; +import getError from "../utils/getError"; +import { ThunkAction } from "redux-thunk"; +import { AnyAction } from "redux"; +import { Rating as RatingFromRatings } from "./ratings"; + +// Types +interface Claimant { + id: string; + [key: string]: any; +} + +type Rating = RatingFromRatings; +interface Description { + json: any; + html: string; +} + +interface Claim { + id: string; + description?: Description; + description_html?: string; + claimant: string | Claimant; + rating: string | Rating | number; + [key: string]: any; +} + +interface ClaimNode { + id: string; + description: any; + description_html: string; + claimant: Claimant; + rating: Rating; + [key: string]: any; +} + +interface ClaimsResponse { + nodes: ClaimNode[]; + total: number; +} + +interface ClaimsQuery { + page?: number | string; + limit?: number | string; + sort?: string; + q?: string; + claimant?: string[] | string; + rating?: string[] | string; + [key: string]: any; +} + +interface ClaimsRequest { + data: string[]; + query: ClaimsQuery; + total: number; +} + +type AppThunk = ThunkAction< + ReturnType, + unknown, + unknown, + AnyAction +>; + +export const hasClaims = (json: any): boolean => { + if (!json || !json.content) { + return false; + } + + if (!Array.isArray(json.content)) { + return false; + } + + return json.content.some( + (node: any) => node.type === "claim" || (node.content && hasClaims(node)) + ); +}; + +export const extractClaimIdsAndOrder = (json: any) => { + const claimIds: number[] = []; + const claimOrder: number[] = []; + + if (!json || !json.content || !Array.isArray(json.content)) { + return { claimIds, claimOrder }; + } + + // Process the content to extract claims + json.content.forEach((node: any) => { + if (node.type === "claim" && node.attrs && node.attrs.id) { + const id = parseInt(node.attrs.id); + if (!isNaN(id) && !claimIds.includes(id)) { + claimIds.push(id); + claimOrder.push(id); + } + } else if (node.content) { + const { claimIds: nestedIds, claimOrder: nestedOrder } = + extractClaimIdsAndOrder(node); + nestedIds.forEach((id: number) => { + if (!claimIds.includes(id)) { + claimIds.push(id); + claimOrder.push(id); + } + }); + } + }); + + return { claimIds, claimOrder }; +}; + +// action to fetch all claims +export const getClaims = (query: ClaimsQuery): AppThunk => { + const params = new URLSearchParams(); + + // Handle claimant filter - could be array or single string + if (query.claimant) { + if (Array.isArray(query.claimant)) { + query.claimant.forEach((each) => { + if (each) params.append("claimant", each); + }); + } else if (typeof query.claimant === "string") { + params.append("claimant", query.claimant); + } + } + + // Handle rating filter - could be array or single string + if (query.rating) { + if (Array.isArray(query.rating)) { + query.rating.forEach((each) => { + if (each) params.append("rating", each); + }); + } else if (typeof query.rating === "string") { + params.append("rating", query.rating); + } + } + + // Handle other parameters + if (query.page) { + params.append("page", query.page.toString()); + } + if (query.limit) { + params.append("limit", query.limit.toString()); + } + if (query.sort) { + params.append("sort", query.sort); + } + if (query.q) { + params.append("q", query.q); + } + + return (dispatch) => { + dispatch(loadingClaims()); + return axios + .get(CLAIMS_API, { + params: params, + }) + .then((response) => { + dispatch( + addClaimants( + response.data.nodes + .filter((claim) => claim.claimant) + .map((claim) => claim.claimant) + ) + ); + dispatch( + addRatings( + response.data.nodes + .filter((claim) => claim.rating) + .map((claim) => claim.rating) + ) + ); + dispatch( + addClaimsList( + response.data.nodes.map((claim) => { + return { + ...claim, + description: { + json: claim.description, + html: claim.description_html, + }, + claimant: claim.claimant.id, + rating: claim.rating.id, + } as Claim; + }) + ) + ); + dispatch( + addClaimsRequest({ + data: response.data.nodes.map((item) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopClaimsLoading())); + }; +}; + +// action to fetch claim by id +export const getClaim = (id: string): AppThunk => { + return (dispatch) => { + dispatch(loadingClaims()); + return axios + .get(`${CLAIMS_API}/${id}`) + .then((response) => { + const claim = response.data; + const description = { + json: claim.description, + html: claim.description_html, + }; + dispatch(addClaimants([claim.claimant])); + dispatch(addRatings([claim.rating])); + + dispatch( + addClaim(GET_CLAIM, { + ...claim, + description, + claimant: claim.claimant.id, + rating: claim.rating.id, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopClaimsLoading())); + }; +}; + +// Fixed createClaim function +export const createClaim = ( + data: Omit +): ThunkAction, unknown, unknown, AnyAction> => { + return (dispatch) => { + dispatch(loadingClaims()); + return axios + .post(CLAIMS_API, data) + .then((response) => { + const claim = response.data; + const description = { + json: claim.description, + html: claim.description_html, + }; + dispatch(addClaimants([claim.claimant])); + dispatch(addRatings([claim.rating])); + + dispatch(resetClaims()); + dispatch(addSuccessNotification("Claim created")); + dispatch(stopClaimsLoading()); + return { + ...claim, + description, + claimant: + typeof claim.claimant === "object" + ? claim.claimant.id + : claim.claimant, + rating: + typeof claim.rating === "object" ? claim.rating.id : claim.rating, + }; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + dispatch(stopClaimsLoading()); + return undefined; + }); + }; +}; + +// action to update claim by id +export const updateClaim = (data: Claim): ThunkAction, unknown, unknown, AnyAction> => { + return (dispatch) => { + dispatch(loadingClaims()); + return axios + .put(`${CLAIMS_API}/${data.id}`, data) + .then((response) => { + const claim = response.data; + const description = { + json: claim.description, + html: claim.description_html, + }; + dispatch(addClaimants([claim.claimant])); + dispatch(addRatings([claim.rating])); + + dispatch( + addClaim(UPDATE_CLAIM, { + ...claim, + description, + claimant: claim.claimant.id, + rating: claim.rating.id, + }) + ); + dispatch(addSuccessNotification("Claim updated")); + + // Return the updated claim + return { + ...claim, + description, + claimant: typeof claim.claimant === "object" ? claim.claimant.id : claim.claimant, + rating: typeof claim.rating === "object" ? claim.rating.id : claim.rating, + }; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + dispatch(stopClaimsLoading()); + return undefined; + }); + }; +}; + +// action to delete claim by id +export const deleteClaim = (id: string): AppThunk => { + return (dispatch) => { + dispatch(loadingClaims()); + return axios + .delete(`${CLAIMS_API}/${id}`) + .then(() => { + dispatch(resetClaims()); + dispatch(addSuccessNotification("Claim deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const addClaims = (claims: ClaimNode[]): AppThunk => { + return (dispatch) => { + dispatch( + addClaimants( + claims.filter((claim) => claim.claimant).map((claim) => claim.claimant) + ) + ); + dispatch( + addRatings( + claims.filter((claim) => claim.rating).map((claim) => claim.rating) + ) + ); + dispatch( + addClaimsList( + claims.map((claim) => { + return { + ...claim, + claimant: + typeof claim.claimant === "object" + ? claim.claimant.id + : claim.claimant, + rating: + typeof claim.rating === "object" ? claim.rating.id : claim.rating, + } as Claim; + }) + ) + ); + }; +}; + +export const loadingClaims = () => ({ + type: SET_CLAIMS_LOADING, + payload: true, +}); + +export const stopClaimsLoading = () => ({ + type: SET_CLAIMS_LOADING, + payload: false, +}); + +export const addClaim = ( + type: typeof GET_CLAIM | typeof UPDATE_CLAIM, + payload: Claim +) => ({ + type, + payload, +}); + +export const addClaimsList = (payload: Claim[]) => ({ + type: ADD_CLAIMS, + payload, +}); + +export const addClaimsRequest = (payload: ClaimsRequest) => ({ + type: ADD_CLAIMS_REQUEST, + payload, +}); + +export const resetClaims = () => ({ + type: RESET_CLAIMS, +}); diff --git a/studio/src/actions/events.js b/studio/src/actions/events.js deleted file mode 100644 index 515b83477..000000000 --- a/studio/src/actions/events.js +++ /dev/null @@ -1,154 +0,0 @@ -import axios from 'axios'; -import { - ADD_EVENTS, - ADD_EVENTS_REQUEST, - RESET_EVENTS, - SET_EVENTS_LOADING, - EVENTS_API, - GET_EVENT, - UPDATE_EVENT, -} from '../constants/events'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -// action to fetch default events -export const addDefaultEvents = (query) => { - return (dispatch) => { - dispatch(loadingEvents()); - return axios - .post(EVENTS_API + '/default') - .then((response) => { - dispatch(addEvents(response.data.nodes)); - dispatch( - addEventsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopEventsLoading())); - }; -}; - -// action to fetch all events -export const getEvents = (query) => { - return (dispatch) => { - dispatch(loadingEvents()); - return axios - .get(EVENTS_API, { - params: query, - }) - .then((response) => { - dispatch(addEvents(response.data.nodes)); - dispatch( - addEventsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopEventsLoading())); - }; -}; - -// action to fetch event by id -export const getEvent = (id) => { - return (dispatch) => { - dispatch(loadingEvents()); - return axios - .get(EVENTS_API + '/' + id) - .then((response) => { - dispatch(addEvent(GET_EVENT, response.data)); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopEventsLoading())); - }; -}; - -// action to create event -export const createEvent = (data) => { - return (dispatch) => { - dispatch(loadingEvents()); - return axios - .post(EVENTS_API, data) - .then(() => { - dispatch(resetEvents()); - dispatch(addSuccessNotification('Event created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update event by id -export const updateEvent = (data) => { - return (dispatch) => { - dispatch(loadingEvents()); - return axios - .put(EVENTS_API + '/' + data.id, data) - .then((response) => { - dispatch(addEvent(UPDATE_EVENT, response.data)); - dispatch(addSuccessNotification('Event updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopEventsLoading())); - }; -}; - -// action to delete event by id -export const deleteEvent = (id) => { - return (dispatch) => { - dispatch(loadingEvents()); - return axios - .delete(EVENTS_API + '/' + id) - .then(() => { - dispatch(resetEvents()); - dispatch(addSuccessNotification('Event deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingEvents = () => ({ - type: SET_EVENTS_LOADING, - payload: true, -}); - -export const stopEventsLoading = () => ({ - type: SET_EVENTS_LOADING, - payload: false, -}); - -export const addEvent = (type, payload) => ({ - type, - payload, -}); - -export const addEvents = (payload) => ({ - type: ADD_EVENTS, - payload, -}); - -export const addEventsRequest = (payload) => ({ - type: ADD_EVENTS_REQUEST, - payload, -}); - -export const resetEvents = () => ({ - type: RESET_EVENTS, -}); diff --git a/studio/src/actions/events.ts b/studio/src/actions/events.ts new file mode 100644 index 000000000..6b59f2d6a --- /dev/null +++ b/studio/src/actions/events.ts @@ -0,0 +1,172 @@ +import axios from "axios"; +import { + ADD_EVENTS, + ADD_EVENTS_REQUEST, + RESET_EVENTS, + SET_EVENTS_LOADING, + EVENTS_API, + GET_EVENT, + UPDATE_EVENT, +} from "../constants/events"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; + +// Define interfaces +interface Event { + id: string; + [key: string]: any; +} + +interface EventAction { + type: string; + payload: any; +} + +interface EventRequestData { + data: string[]; + query: any; + total: number; +} + +// action to fetch default events +export const addDefaultEvents = (query: any) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingEvents()); + return axios + .post(`${EVENTS_API}/default`) + .then((response) => { + dispatch(addEvents(response.data.nodes)); + dispatch( + addEventsRequest({ + data: response.data.nodes.map((item: Event) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopEventsLoading())); + }; +}; + +// action to fetch all events +export const getEvents = (query: any) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingEvents()); + return axios + .get(EVENTS_API, { + params: query, + }) + .then((response) => { + dispatch(addEvents(response.data.nodes)); + dispatch( + addEventsRequest({ + data: response.data.nodes.map((item: Event) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopEventsLoading())); + }; +}; + +// action to fetch event by id +export const getEvent = (id: string) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingEvents()); + return axios + .get(`${EVENTS_API}/${id}`) + .then((response) => { + dispatch(addEvent(GET_EVENT, response.data)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopEventsLoading())); + }; +}; + +// action to create event +export const createEvent = (data: Omit) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingEvents()); + return axios + .post(EVENTS_API, data) + .then(() => { + dispatch(resetEvents()); + dispatch(addSuccessNotification("Event created")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +// action to update event by id +export const updateEvent = (data: Event) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingEvents()); + return axios + .put(`${EVENTS_API}/${data.id}`, data) + .then((response) => { + dispatch(addEvent(UPDATE_EVENT, response.data)); + dispatch(addSuccessNotification("Event updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopEventsLoading())); + }; +}; + +// action to delete event by id +export const deleteEvent = (id: string) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingEvents()); + return axios + .delete(`${EVENTS_API}/${id}`) + .then(() => { + dispatch(resetEvents()); + dispatch(addSuccessNotification("Event deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingEvents = (): EventAction => ({ + type: SET_EVENTS_LOADING, + payload: true, +}); + +export const stopEventsLoading = (): EventAction => ({ + type: SET_EVENTS_LOADING, + payload: false, +}); + +export const addEvent = (type: string, payload: Event): EventAction => ({ + type, + payload, +}); + +export const addEvents = (payload: Event[]): EventAction => ({ + type: ADD_EVENTS, + payload, +}); + +export const addEventsRequest = (payload: EventRequestData): EventAction => ({ + type: ADD_EVENTS_REQUEST, + payload, +}); + +export const resetEvents = (): EventAction => ({ + type: RESET_EVENTS, + payload: [], +}); diff --git a/studio/src/actions/forgotPassword.js b/studio/src/actions/forgotPassword.js deleted file mode 100644 index a7c209151..000000000 --- a/studio/src/actions/forgotPassword.js +++ /dev/null @@ -1,58 +0,0 @@ -export const requestPasswordReset = async (userId) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/password_reset`, - { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - sendLink: { - notificationType: 'NOTIFICATION_TYPE_Email', - urlTemplate: `${window.PUBLIC_URL}/auth/login/recovery?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}`, - }, - }), - }, - ); - - if (!response.ok) { - const error = await response.json(); - throw new Error(error.message || 'Failed to send reset email'); - } - - return response.json(); -}; - -export const resetPassword = async (userId, newPassword, verificationCode) => { - if (!userId || !newPassword || !verificationCode) { - throw new Error('Missing required parameters for password reset'); - } - - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/password`, - { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - newPassword: { - password: newPassword, - changeRequired: false, - }, - verificationCode: verificationCode, - }), - }, - ); - - if (!response.ok) { - const error = await response.json(); - throw new Error(error.message || 'Failed to reset password'); - } - - return response.json(); -}; diff --git a/studio/src/actions/forgotPassword.ts b/studio/src/actions/forgotPassword.ts new file mode 100644 index 000000000..7a5fc1d91 --- /dev/null +++ b/studio/src/actions/forgotPassword.ts @@ -0,0 +1,68 @@ +import { ErrorResponse, PasswordResetResponse } from "./types"; + +export const requestPasswordReset = async ( + userId: string +): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/users/${userId}/password_reset`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + sendLink: { + notificationType: "NOTIFICATION_TYPE_Email", + urlTemplate: `${ + import.meta.env.VITE_PUBLIC_URL + }/auth/login/recovery?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}`, + }, + }), + } + ); + + if (!response.ok) { + const error = (await response.json()) as ErrorResponse; + throw new Error(error.message || "Failed to send reset email"); + } + + return response.json(); +}; + +export const resetPassword = async ( + userId: string, + newPassword: string, + verificationCode: string +): Promise => { + if (!userId || !newPassword || !verificationCode) { + throw new Error("Missing required parameters for password reset"); + } + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/${userId}/password`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + newPassword: { + password: newPassword, + changeRequired: false, + }, + verificationCode: verificationCode, + }), + } + ); + + if (!response.ok) { + const error = (await response.json()) as ErrorResponse; + throw new Error(error.message || "Failed to reset password"); + } +}; diff --git a/studio/src/actions/formats.js b/studio/src/actions/formats.js deleted file mode 100644 index 0cca85d95..000000000 --- a/studio/src/actions/formats.js +++ /dev/null @@ -1,161 +0,0 @@ -import axios from 'axios'; -import { - ADD_FORMATS, - ADD_FORMATS_REQUEST, - SET_FORMATS_LOADING, - RESET_FORMATS, - FORMATS_API, - GET_FORMAT, - UPDATE_FORMAT, -} from '../constants/formats'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; -import { SET_REDIRECT } from '../constants/settings'; - -// action to fetch default formats -export const addDefaultFormats = (query) => { - return (dispatch) => { - dispatch(loadingFormats()); - return axios - .post(FORMATS_API + '/default') - .then((response) => { - dispatch(addFormats(response.data.nodes)); - dispatch( - addFormatsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopFormatsLoading())); - }; -}; - -// action to fetch all formats -export const getFormats = (query) => { - return (dispatch) => { - dispatch(loadingFormats()); - return axios - .get(FORMATS_API, { - params: query, - }) - .then((response) => { - dispatch(addFormats(response.data.nodes)); - dispatch( - addFormatsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - if (error && error.response && error.response.status === 307) dispatch(setRedirect(307)); - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopFormatsLoading())); - }; -}; - -// action to fetch format by id -export const getFormat = (id) => { - return (dispatch) => { - dispatch(loadingFormats()); - return axios - .get(FORMATS_API + '/' + id) - .then((response) => { - dispatch(addFormat(GET_FORMAT, response.data)); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopFormatsLoading())); - }; -}; - -// action to create format -export const createFormat = (data) => { - return (dispatch) => { - dispatch(loadingFormats()); - return axios - .post(FORMATS_API, data) - .then(() => { - dispatch(resetFormats()); - dispatch(addSuccessNotification('Format created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update format by id -export const updateFormat = (data) => { - return (dispatch) => { - dispatch(loadingFormats()); - return axios - .put(FORMATS_API + '/' + data.id, data) - .then((response) => { - dispatch(addFormat(UPDATE_FORMAT, response.data)); - dispatch(addSuccessNotification('Format updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopFormatsLoading())); - }; -}; - -// action to delete format by id -export const deleteFormat = (id) => { - return (dispatch) => { - dispatch(loadingFormats()); - return axios - .delete(FORMATS_API + '/' + id) - .then(() => { - dispatch(resetFormats()); - dispatch(addSuccessNotification('Format deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const setRedirect = (code) => ({ - type: SET_REDIRECT, - payload: code, -}); - -export const loadingFormats = () => ({ - type: SET_FORMATS_LOADING, - payload: true, -}); - -export const stopFormatsLoading = () => ({ - type: SET_FORMATS_LOADING, - payload: false, -}); - -export const addFormat = (type, payload) => ({ - type, - payload, -}); - -export const addFormats = (payload) => ({ - type: ADD_FORMATS, - payload, -}); - -export const addFormatsRequest = (payload) => ({ - type: ADD_FORMATS_REQUEST, - payload, -}); - -export const resetFormats = () => ({ - type: RESET_FORMATS, -}); diff --git a/studio/src/actions/formats.ts b/studio/src/actions/formats.ts new file mode 100644 index 000000000..f6ce92184 --- /dev/null +++ b/studio/src/actions/formats.ts @@ -0,0 +1,175 @@ +import axios from "axios"; +import { Dispatch, AnyAction } from "redux"; + +import { + ADD_FORMATS, + ADD_FORMATS_REQUEST, + SET_FORMATS_LOADING, + RESET_FORMATS, + FORMATS_API, + GET_FORMAT, + UPDATE_FORMAT, +} from "../constants/formats"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; +import { SET_REDIRECT } from "../constants/settings"; + +// Define types +export interface Format { + id: string; + [key: string]: any; // Add specific properties based on your format object structure +} + +interface FormatRequest { + data: string[]; + query: any; + total: number; +} + +// action to fetch default formats +export const addDefaultFormats = (query: any) => { + return (dispatch: Dispatch) => { + dispatch(loadingFormats()); + return axios + .post(`${FORMATS_API}/default`) + .then((response) => { + dispatch(addFormats(response.data.nodes)); + dispatch( + addFormatsRequest({ + data: response.data.nodes.map((item: Format) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopFormatsLoading())); + }; +}; + +// action to fetch all formats +export const getFormats = (query: any) => { + return (dispatch: Dispatch) => { + dispatch(loadingFormats()); + return axios + .get(FORMATS_API, { + params: query, + }) + .then((response) => { + dispatch(addFormats(response.data.nodes)); + dispatch( + addFormatsRequest({ + data: response.data.nodes.map((item: Format) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + if (error?.response?.status === 307) dispatch(setRedirect(307)); + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopFormatsLoading())); + }; +}; + +// action to fetch format by id +export const getFormat = (id: string) => { + return (dispatch: Dispatch) => { + dispatch(loadingFormats()); + return axios + .get(`${FORMATS_API}/${id}`) + .then((response) => { + dispatch(addFormat(GET_FORMAT, response.data)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopFormatsLoading())); + }; +}; + +// action to create format +export const createFormat = (data: Format) => { + return (dispatch: Dispatch) => { + dispatch(loadingFormats()); + return axios + .post(FORMATS_API, data) + .then(() => { + dispatch(resetFormats()); + dispatch(addSuccessNotification("Format created")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +// action to update format by id +export const updateFormat = (data: Format) => { + return (dispatch: Dispatch) => { + dispatch(loadingFormats()); + return axios + .put(`${FORMATS_API}/${data.id}`, data) + .then((response) => { + dispatch(addFormat(UPDATE_FORMAT, response.data)); + dispatch(addSuccessNotification("Format updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopFormatsLoading())); + }; +}; + +// action to delete format by id +export const deleteFormat = (id: string) => { + return (dispatch: Dispatch) => { + dispatch(loadingFormats()); + return axios + .delete(`${FORMATS_API}/${id}`) + .then(() => { + dispatch(resetFormats()); + dispatch(addSuccessNotification("Format deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const setRedirect = (code: number) => ({ + type: SET_REDIRECT, + payload: code, +}); + +export const loadingFormats = () => ({ + type: SET_FORMATS_LOADING, + payload: true, +}); + +export const stopFormatsLoading = () => ({ + type: SET_FORMATS_LOADING, + payload: false, +}); + +export const addFormat = (type: string, payload: any) => ({ + type, + payload, +}); + +export const addFormats = (payload: Format[]) => ({ + type: ADD_FORMATS, + payload, +}); + +export const addFormatsRequest = (payload: FormatRequest) => ({ + type: ADD_FORMATS_REQUEST, + payload, +}); + +export const resetFormats = () => ({ + type: RESET_FORMATS, +}); diff --git a/studio/src/actions/googleFactChecks.js b/studio/src/actions/googleFactChecks.js deleted file mode 100644 index 45d5af743..000000000 --- a/studio/src/actions/googleFactChecks.js +++ /dev/null @@ -1,47 +0,0 @@ -import axios from 'axios'; -import { - GOOGLE_FACT_CHECKS_API, - ADD_GOOGLE_FACT_CHECKS_REQUEST, - SET_GOOGLE_FACT_CHECKS_LOADING, -} from '../constants/googleFactChecks'; -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getGoogleFactChecks = (query) => { - return (dispatch) => { - dispatch(loadingGoogleFactChecks()); - return axios - .get(GOOGLE_FACT_CHECKS_API, { - params: query, - }) - .then((response) => { - dispatch( - addRequest({ - data: response.data.nodes, - query: query, - total: response.data.total, - nextPage: response.data.nextPage, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopLoading())); - }; -}; - -export const addRequest = (data) => ({ - type: ADD_GOOGLE_FACT_CHECKS_REQUEST, - payload: data, -}); - -export const loadingGoogleFactChecks = () => ({ - type: SET_GOOGLE_FACT_CHECKS_LOADING, - payload: true, -}); - -export const stopLoading = () => ({ - type: SET_GOOGLE_FACT_CHECKS_LOADING, - payload: false, -}); diff --git a/studio/src/actions/googleFactChecks.ts b/studio/src/actions/googleFactChecks.ts new file mode 100644 index 000000000..2f7d1b240 --- /dev/null +++ b/studio/src/actions/googleFactChecks.ts @@ -0,0 +1,81 @@ +import axios from "axios"; +import { + GOOGLE_FACT_CHECKS_API, + ADD_GOOGLE_FACT_CHECKS_REQUEST, + SET_GOOGLE_FACT_CHECKS_LOADING, +} from "../constants/googleFactChecks"; +import { addErrorNotification } from "./notifications"; +import getError from "../utils/getError"; + +interface GoogleFactCheckNode { + id: string; + [key: string]: any; +} + +interface GoogleFactChecksResponse { + nodes: GoogleFactCheckNode[]; + total: number; + nextPage?: string; +} + +export interface Query { + [key: string]: string | number | boolean | undefined; +} + +interface RequestPayload { + data: GoogleFactCheckNode[]; + query: Query; + total: number; + nextPage?: string; +} + +interface AddRequestAction { + type: typeof ADD_GOOGLE_FACT_CHECKS_REQUEST; + payload: RequestPayload; +} + +interface SetLoadingAction { + type: typeof SET_GOOGLE_FACT_CHECKS_LOADING; + payload: boolean; +} + +type GoogleFactChecksAction = AddRequestAction | SetLoadingAction; + +export const getGoogleFactChecks = (query: Query) => { + return (dispatch: (action: GoogleFactChecksAction | any) => void) => { + dispatch(loadingGoogleFactChecks()); + return axios + .get(GOOGLE_FACT_CHECKS_API, { + params: query, + }) + .then((response) => { + dispatch( + addRequest({ + data: response.data.nodes, + query: query, + total: response.data.total, + nextPage: response.data.nextPage, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopLoading())); + }; +}; + +export const addRequest = (data: RequestPayload): AddRequestAction => ({ + type: ADD_GOOGLE_FACT_CHECKS_REQUEST, + payload: data, +}); + +export const loadingGoogleFactChecks = (): SetLoadingAction => ({ + type: SET_GOOGLE_FACT_CHECKS_LOADING, + payload: true, +}); + +export const stopLoading = (): SetLoadingAction => ({ + type: SET_GOOGLE_FACT_CHECKS_LOADING, + payload: false, +}); diff --git a/studio/src/actions/idp.js b/studio/src/actions/idp.js deleted file mode 100644 index bfaf3eda5..000000000 --- a/studio/src/actions/idp.js +++ /dev/null @@ -1,226 +0,0 @@ -export const getProviderInformation = async (intentId, token) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/idp_intents/${intentId}`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - idpIntentToken: token, - }), - }); - - if (!response.ok) { - throw new Error('Failed to get provider information'); - } - - return response.json(); -}; - -export const checkUserExists = async (email) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - query: { - offset: '0', - limit: 1, - asc: true, - }, - queries: [ - { - emailQuery: { - emailAddress: email, - method: 'TEXT_QUERY_METHOD_EQUALS', - }, - }, - ], - }), - }); - - if (!response.ok) { - throw new Error('Failed to check user existence'); - } - - const data = await response.json(); - if (data.result && data.result.length > 0) { - const userId = data.result[0].userId; - localStorage.setItem('userId', userId); - return data.result[0]; - } else { - return null; - } -}; - -export const linkExistingUser = async (userId, providerData) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/links`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - idpLink: { - idpId: window.REACT_APP_ZITADEL_IDP_ID, - userId: providerData.idpInformation?.rawInformation?.User?.sub, - userName: providerData.idpInformation?.rawInformation?.User?.name, - }, - }), - }); - - if (!response.ok) { - throw new Error('Failed to link user to IDP'); - } - - return response.json(); -}; - -export const createSession = async (userId, intentId = null, token = null) => { - const body = { - checks: { - user: { - userId: userId, - }, - }, - }; - - if (intentId && token) { - body.checks.idpIntent = { - idpIntentId: intentId, - idpIntentToken: token, - }; - } - - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify(body), - }); - - if (!response.ok) { - throw new Error('Failed to create session'); - } - - return response.json(); -}; - -export const registerUser = async (userData, intentId, token) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/human`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - username: userData.email, - profile: { - givenName: userData.given_name, - familyName: userData.family_name, - displayName: userData.name, - }, - email: { - email: userData.email, - isVerified: userData.email_verified, - }, - idpLinks: [ - { - idpId: window.REACT_APP_ZITADEL_IDP_ID, - idpExternalId: userData.sub, - userId: userData.sub, - userName: userData.email, - }, - ], - }), - }); - - if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.message || 'Failed to register user'); - } - - return response.json(); -}; - -export const initiateGoogleSignIn = async () => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/idp_intents`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - idpId: window.REACT_APP_ZITADEL_IDP_ID, - urls: { - successUrl: `${window.PUBLIC_URL}/auth/login`, - failureUrl: `${window.PUBLIC_URL}`, - }, - }), - }); - - if (!response.ok) { - throw new Error('Failed to initiate Google Sign-In'); - } - - return response.json(); -}; - -export const getAuthRequestDetails = async (authRequestId) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/oidc/auth_requests/${authRequestId}`, - { - method: 'GET', - headers: { - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - Accept: 'application/json', - }, - }, - ); - - if (!response.ok) { - throw new Error('Failed to get auth request details'); - } - - return response.json(); -}; - -export const finalizeAuthRequest = async (authRequestId, sessionId, sessionToken) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/oidc/auth_requests/${authRequestId}`, - { - method: 'POST', - headers: { - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - session: { - sessionId: sessionId, - sessionToken: sessionToken, - }, - }), - }, - ); - - if (!response.ok) { - const errorData = await response.json(); - console.error('Error finalizing auth request:', errorData); - throw new Error( - 'Failed to finalize auth request: ' + (errorData.message || response.statusText), - ); - } - - return response.json(); -}; diff --git a/studio/src/actions/idp.ts b/studio/src/actions/idp.ts new file mode 100644 index 000000000..eced721c7 --- /dev/null +++ b/studio/src/actions/idp.ts @@ -0,0 +1,297 @@ +import type { + ProviderInformation, + UserSearchResult, + SessionData, + UserQuery, + IdpLinkRequest, + SessionRequest, + HumanUserRegistration, + GoogleSignInRequest, + AuthRequestDetails, + AuthRequestFinalization, + ApiResponse, +} from "./types"; + +export const getProviderInformation = async ( + intentId: string, + token: string +): Promise => { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/idp_intents/${intentId}`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + idpIntentToken: token, + }), + } + ); + + if (!response.ok) { + throw new Error("Failed to get provider information"); + } + + return response.json(); +}; + +export const checkUserExists = async ( + email: string +): Promise => { + const userQuery: UserQuery = { + query: { + offset: "0", + limit: 1, + asc: true, + }, + queries: [ + { + emailQuery: { + emailAddress: email, + method: "TEXT_QUERY_METHOD_EQUALS", + }, + }, + ], + }; + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify(userQuery), + } + ); + + if (!response.ok) { + throw new Error("Failed to check user existence"); + } + + const data: UserSearchResult = await response.json(); + if (data.result && data.result.length > 0) { + const userId = data.result[0].userId; + localStorage.setItem("userId", userId); + return data.result[0]; + } + return null; +}; + +export const linkExistingUser = async ( + userId: string, + providerData: ProviderInformation +): Promise => { + const linkRequest: IdpLinkRequest = { + idpLink: { + idpId: import.meta.env.VITE_ZITADEL_IDP_ID, + userId: providerData.idpInformation?.rawInformation?.User?.sub || "", + userName: providerData.idpInformation?.rawInformation?.User?.name || "", + }, + }; + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/${userId}/links`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify(linkRequest), + } + ); + + if (!response.ok) { + throw new Error("Failed to link user to IDP"); + } +}; + +export const createSession = async ( + userId: string, + intentId: string | null = null, + token: string | null = null +): Promise => { + const sessionRequest: SessionRequest = { + checks: { + user: { + userId, + }, + }, + }; + + if (intentId && token) { + sessionRequest.checks.idpIntent = { + idpIntentId: intentId, + idpIntentToken: token, + }; + } + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify(sessionRequest), + } + ); + + if (!response.ok) { + throw new Error("Failed to create session"); + } + + return response.json(); +}; + +export const registerUser = async (userData: { + email: string; + given_name: string; + family_name: string; + name: string; + email_verified: boolean; + sub: string; +}): Promise> => { + const registrationData: HumanUserRegistration = { + username: userData.email, + profile: { + givenName: userData.given_name, + familyName: userData.family_name, + displayName: userData.name, + }, + email: { + email: userData.email, + isVerified: userData.email_verified, + }, + idpLinks: [ + { + idpId: import.meta.env.VITE_ZITADEL_IDP_ID, + idpExternalId: userData.sub, + userId: userData.sub, + userName: userData.email, + }, + ], + }; + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/human`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify(registrationData), + } + ); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.message || "Failed to register user"); + } + + return response.json(); +}; + +export const initiateGoogleSignIn = async (): Promise< + ApiResponse<{ authUrl: string }> +> => { + const signInRequest: GoogleSignInRequest = { + idpId: import.meta.env.VITE_ZITADEL_IDP_ID, + urls: { + successUrl: `${import.meta.env.VITE_PUBLIC_URL}/auth/login`, + failureUrl: `${import.meta.env.VITE_PUBLIC_URL}`, + }, + }; + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/idp_intents`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify(signInRequest), + } + ); + + if (!response.ok) { + throw new Error("Failed to initiate Google Sign-In"); + } + + return response.json(); +}; + +export const getAuthRequestDetails = async ( + authRequestId: string +): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/oidc/auth_requests/${authRequestId}`, + { + method: "GET", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + Accept: "application/json", + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to get auth request details"); + } + + return response.json(); +}; + +export const finalizeAuthRequest = async ( + authRequestId: string, + sessionId: string, + sessionToken: string +): Promise<{ callbackUrl: string }> => { + const finalizationData: AuthRequestFinalization = { + session: { + sessionId, + sessionToken, + }, + }; + + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/oidc/auth_requests/${authRequestId}`, + { + method: "POST", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(finalizationData), + } + ); + + if (!response.ok) { + const errorData = await response.json(); + console.error("Error finalizing auth request:", errorData); + throw new Error( + "Failed to finalize auth request: " + + (errorData.message || response.statusText) + ); + } + + return response.json(); +}; diff --git a/studio/src/actions/info.js b/studio/src/actions/info.js deleted file mode 100644 index 27437b128..000000000 --- a/studio/src/actions/info.js +++ /dev/null @@ -1,32 +0,0 @@ -import axios from 'axios'; -import { ADD_INFO, INFO_API, SET_INFO_LOADING } from '../constants/info'; -import getError from '../utils/getError'; -import { addErrorNotification } from './notifications'; - -export const getInfo = () => { - return (dispatch) => { - dispatch(loadingInfo(true)); - - return axios - .get(INFO_API) - .then((response) => { - dispatch(addInfo(response.data)); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - dispatch(loadingInfo(false)); - }); - }; -}; - -export const addInfo = (data) => ({ - type: ADD_INFO, - payload: data, -}); - -export const loadingInfo = (payload) => ({ - type: SET_INFO_LOADING, - payload, -}); diff --git a/studio/src/actions/info.ts b/studio/src/actions/info.ts new file mode 100644 index 000000000..24abc5299 --- /dev/null +++ b/studio/src/actions/info.ts @@ -0,0 +1,53 @@ +import axios from "axios"; +import { ADD_INFO, INFO_API, SET_INFO_LOADING } from "../constants/info"; +import getError from "../utils/getError"; +import { addErrorNotification, NotificationAction } from "./notifications"; +import { Dispatch, Action } from "redux"; + +// Define types for our actions +interface AddInfoAction extends Action { + type: typeof ADD_INFO; + payload: any; +} + +interface SetInfoLoadingAction extends Action { + type: typeof SET_INFO_LOADING; + payload: boolean; +} + +// Union type for all info actions +type InfoActionTypes = + | AddInfoAction + | SetInfoLoadingAction + | NotificationAction; + +// Thunk action creator type +type ThunkResult = (dispatch: Dispatch) => R; + +export const getInfo = (): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingInfo(true)); + + return axios + .get(INFO_API) + .then((response) => { + dispatch(addInfo(response.data)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => { + dispatch(loadingInfo(false)); + }); + }; +}; + +export const addInfo = (data: any): AddInfoAction => ({ + type: ADD_INFO, + payload: data, +}); + +export const loadingInfo = (payload: boolean): SetInfoLoadingAction => ({ + type: SET_INFO_LOADING, + payload, +}); diff --git a/studio/src/actions/login.js b/studio/src/actions/login.js deleted file mode 100644 index 9793e8ed1..000000000 --- a/studio/src/actions/login.js +++ /dev/null @@ -1,221 +0,0 @@ -export const checkUser = async (emailAddress) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - query: { - limit: 1, - }, - queries: [ - { - emailQuery: { - emailAddress, - method: 'TEXT_QUERY_METHOD_EQUALS', - }, - }, - ], - }), - }); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message.split('(')[0].trim(); - throw new Error(errorMessage || 'User not found'); - } - - return response.json(); -}; - -export const createSession = async (userId) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - checks: { - user: { - userId, - }, - }, - }), - }); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message.split('(')[0].trim(); - throw new Error(errorMessage || 'Failed to create session'); - } - - return response.json(); -}; - -export const getUserDetails = async (sessionId) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, { - method: 'GET', - headers: { - Accept: 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - }); - - if (!response.ok) { - throw new Error('Failed to fetch user details'); - } - - return response.json(); -}; - -export const verifyPassword = async (sessionId, sessionToken, password) => { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, { - method: 'PATCH', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - sessionToken: sessionToken, - checks: { - password: { - password: password, - }, - }, - }), - }); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message.split('(')[0].trim(); - throw new Error(errorMessage || 'Invalid password'); - } - - return response.json(); -}; - -export const verifyUserEmail = async (userId, verificationCode) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/email/verify`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - verificationCode: verificationCode, - }), - }, - ); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message?.split('(')[0].trim(); - throw new Error(errorMessage || 'Failed to verify email'); - } - - return response.json(); -}; - -export const checkEmailVerification = async (userId) => { - if (!userId) { - throw new Error('User ID is required'); - } - - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}`, { - method: 'GET', - headers: { - Accept: 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - }); - - if (!response.ok) { - throw new Error('Failed to check email verification status'); - } - - const userData = await response.json(); - return userData.user.human.email.isVerified; -}; - -export const resendVerificationEmail = async (userId, sessionToken) => { - if (!userId || !sessionToken) { - throw new Error('User ID and session token are required'); - } - - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/email/send`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - sendCode: { - urlTemplate: `${window.PUBLIC_URL}/auth/verify?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}`, - }, - }), - }, - ); - - if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.message || 'Failed to resend verification email'); - } - - return response.json(); -}; - -export const getAuthRequestDetails = async (authRequestId) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/oidc/auth_requests/${authRequestId}`, - { - method: 'GET', - headers: { - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - Accept: 'application/json', - }, - }, - ); - - if (!response.ok) { - throw new Error('Failed to get auth request details'); - } - - return response.json(); -}; - -export const finalizeAuthRequest = async (authRequestId, sessionId, sessionToken) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/oidc/auth_requests/${authRequestId}`, - { - method: 'POST', - headers: { - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - session: { - sessionId: sessionId, - sessionToken: sessionToken, - }, - }), - }, - ); - - if (!response.ok) { - throw new Error('Failed to finalize auth request'); - } - - return response.json(); -}; diff --git a/studio/src/actions/login.ts b/studio/src/actions/login.ts new file mode 100644 index 000000000..e2a59a460 --- /dev/null +++ b/studio/src/actions/login.ts @@ -0,0 +1,272 @@ +import type { + UserResponse, + SessionResponse, + ErrorResponse, + UserDetails, + AuthRequestResponse, +} from "./types"; + +export const checkUser = async ( + emailAddress: string +): Promise => { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + query: { + limit: 1, + }, + queries: [ + { + emailQuery: { + emailAddress, + method: "TEXT_QUERY_METHOD_EQUALS", + }, + }, + ], + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + const errorMessage = errorData.message.split("(")[0].trim(); + throw new Error(errorMessage || "User not found"); + } + + return response.json(); +}; + +export const createSession = async ( + userId: string +): Promise => { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + checks: { + user: { + userId, + }, + }, + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + const errorMessage = errorData.message.split("(")[0].trim(); + throw new Error(errorMessage || "Failed to create session"); + } + + return response.json(); +}; + +export const getUserDetails = async ( + sessionId: string +): Promise => { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, + { + method: "GET", + headers: { + Accept: "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to fetch user details"); + } + + return response.json(); +}; + +export const verifyPassword = async ( + sessionId: string, + sessionToken: string, + password: string +): Promise => { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, + { + method: "PATCH", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + sessionToken, + checks: { + password: { + password, + }, + }, + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + const errorMessage = errorData.message.split("(")[0].trim(); + throw new Error(errorMessage || "Invalid password"); + } + + return response.json(); +}; + +export const verifyUserEmail = async ( + userId: string, + verificationCode: string +): Promise => { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/${userId}/email/verify`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + verificationCode, + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + const errorMessage = errorData.message?.split("(")[0].trim(); + throw new Error(errorMessage || "Failed to verify email"); + } + + return response.json(); +}; + +export const checkEmailVerification = async ( + userId: string +): Promise => { + if (!userId) { + throw new Error("User ID is required"); + } + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/${userId}`, + { + method: "GET", + headers: { + Accept: "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to check email verification status"); + } + + const userData = (await response.json()) as UserDetails; + return userData.user.human.email.isVerified; +}; + +export const resendVerificationEmail = async ( + userId: string, + sessionToken: string +): Promise => { + if (!userId || !sessionToken) { + throw new Error("User ID and session token are required"); + } + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/${userId}/email/send`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + sendCode: { + urlTemplate: `${ + import.meta.env.VITE_PUBLIC_URL + }/auth/verify?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}`, + }, + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + throw new Error(errorData.message || "Failed to resend verification email"); + } +}; + +export const getAuthRequestDetails = async ( + authRequestId: string +): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/oidc/auth_requests/${authRequestId}`, + { + method: "GET", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + Accept: "application/json", + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to get auth request details"); + } + + return response.json(); +}; + +export const finalizeAuthRequest = async ( + authRequestId: string, + sessionId: string, + sessionToken: string +): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/oidc/auth_requests/${authRequestId}`, + { + method: "POST", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + session: { + sessionId, + sessionToken, + }, + }), + } + ); + + if (!response.ok) { + throw new Error("Failed to finalize auth request"); + } + + return response.json(); +}; diff --git a/studio/src/actions/media.js b/studio/src/actions/media.js deleted file mode 100644 index 881bb68dd..000000000 --- a/studio/src/actions/media.js +++ /dev/null @@ -1,127 +0,0 @@ -import axios from 'axios'; -import { - ADD_MEDIA, - ADD_MEDIA_REQUEST, - SET_MEDIA_LOADING, - RESET_MEDIA, - MEDIA_API, - GET_MEDIUM, - UPDATE_MEDIUM, -} from '../constants/media'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -// action to fetch media -export const getMedia = (query, profile) => { - return (dispatch) => { - dispatch(loadingMedia()); - return axios - .get(MEDIA_API, { - params: query, - }) - .then((response) => { - dispatch(addMedia(response.data.nodes)); - dispatch( - addMediaRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopMediaLoading())); - }; -}; - -// action to fetch medium by id -export const getMedium = (id, profile) => { - return (dispatch) => { - dispatch(loadingMedia()); - return axios - .get(MEDIA_API + '/' + id) - .then((response) => { - dispatch({ type: GET_MEDIUM, payload: response.data }); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopMediaLoading())); - }; -}; - -// action to create medium -export const createMedium = (data, profile) => { - return (dispatch) => { - dispatch(loadingMedia()); - return axios - .post(MEDIA_API, profile ? data[0] : data) - .then((response) => { - dispatch(resetMedia()); - dispatch(addSuccessNotification('Medium created')); - return profile ? response.data : response.data.nodes[0]; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update medium -export const updateMedium = (data) => { - return (dispatch) => { - dispatch(loadingMedia()); - return axios - .put(MEDIA_API + '/' + data.id, data) - .then((response) => { - dispatch({ type: UPDATE_MEDIUM, payload: response.data }); - dispatch(addSuccessNotification('Medium updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopMediaLoading())); - }; -}; - -// action to delete medium by id -export const deleteMedium = (id) => { - return (dispatch) => { - dispatch(loadingMedia()); - return axios - .delete(MEDIA_API + '/' + id) - .then(() => { - dispatch(resetMedia()); - dispatch(addSuccessNotification('Medium deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingMedia = () => ({ - type: SET_MEDIA_LOADING, - payload: true, -}); - -export const stopMediaLoading = () => ({ - type: SET_MEDIA_LOADING, - payload: false, -}); - -export const addMedia = (data) => ({ - type: ADD_MEDIA, - payload: data, -}); - -export const addMediaRequest = (data) => ({ - type: ADD_MEDIA_REQUEST, - payload: data, -}); - -export const resetMedia = () => ({ - type: RESET_MEDIA, -}); diff --git a/studio/src/actions/media.ts b/studio/src/actions/media.ts new file mode 100644 index 000000000..5a8b9e210 --- /dev/null +++ b/studio/src/actions/media.ts @@ -0,0 +1,232 @@ +import axios from "axios"; +import { + ADD_MEDIA, + ADD_MEDIA_REQUEST, + SET_MEDIA_LOADING, + RESET_MEDIA, + MEDIA_API, + GET_MEDIUM, + UPDATE_MEDIUM, +} from "../constants/media"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; +import { Dispatch } from "redux"; +import { AppThunk } from "../store/types"; + +// Types +export interface Medium { + id?: string | number; + name: string; + alt_text?: string; + caption?: string; + description?: string; + meta_fields?: string | Record; + url?: { + proxy?: string; + raw?: string; + }; + dimensions?: string; + file_size?: number; + slug?: string; + title?: string; + type?: string; +} + +interface MediaRequestPayload { + data: (string | number)[]; + query: Record; + total: number; +} + +interface MediaAction { + type: string; + payload?: any; +} + +// Helper function to get space ID +const getSpaceId = (): string => { + return localStorage.getItem("space") || ""; +}; + +// Action to fetch media +export const getMedia = (query: Record): AppThunk => { + return (dispatch: Dispatch) => { + dispatch(loadingMedia()); + + // Get the space ID + const spaceId = getSpaceId(); + + return axios + .get(MEDIA_API, { + params: query, + headers: { + "X-Space": spaceId, + }, + }) + .then((response) => { + dispatch(addMedia(response.data.nodes)); + dispatch( + addMediaRequest({ + data: response.data.nodes.map((item: Medium) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopMediaLoading())); + }; +}; + +// Action to fetch medium by id +export const getMedium = (id: string | number): AppThunk> => { + return (dispatch: Dispatch) => { + dispatch(loadingMedia()); + const spaceId = getSpaceId(); + + return axios + .get(`${MEDIA_API}/${id}`, { + headers: { + "X-Space": spaceId, + }, + }) + .then((response) => { + dispatch({ type: GET_MEDIUM, payload: response.data }); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopMediaLoading())); + }; +}; + +// Action to create medium +export const createMedium = ( + data: Medium | Medium[], + profile?: boolean +): AppThunk> => { + return (dispatch: Dispatch) => { + dispatch(loadingMedia()); + const spaceId = getSpaceId(); + + return axios + .post( + MEDIA_API, + profile ? (Array.isArray(data) ? data[0] : data) : data, + { + headers: { + "X-Space": spaceId, + }, + } + ) + .then((response) => { + // Reset the media state completely to force a refresh on next fetch + dispatch(resetMedia()); + + // Immediately fetch the updated media list with the latest data + const latestQuery = { page: 1, limit: 10, sort: "desc" }; + dispatch(getMedia(latestQuery)); + + dispatch(addSuccessNotification("Medium created")); + + return profile + ? response.data + : Array.isArray(response.data.nodes) + ? response.data.nodes[0] + : response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; // Re-throw to allow error handling in components + }) + .finally(() => dispatch(stopMediaLoading())); + }; +}; + +// Action to update medium +export const updateMedium = (data: Medium): AppThunk> => { + return (dispatch: Dispatch) => { + dispatch(loadingMedia()); + const spaceId = getSpaceId(); + + return axios + .put(`${MEDIA_API}/${data.id}`, data, { + headers: { + "X-Space": spaceId, + }, + }) + .then((response) => { + dispatch({ type: UPDATE_MEDIUM, payload: response.data }); + dispatch(addSuccessNotification("Medium updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopMediaLoading())); + }; +}; + +// Action to delete medium by id +export const deleteMedium = (id: string | number): AppThunk> => { + return (dispatch: Dispatch) => { + dispatch(loadingMedia()); + const spaceId = getSpaceId(); + + return new Promise((resolve, reject) => { + axios + .delete(`${MEDIA_API}/${id}`, { + headers: { + "X-Space": spaceId, + }, + }) + .then(() => { + // First reset the media state completely + dispatch(resetMedia()); + + // Add a longer delay before fetching updated data + // This ensures the backend has time to process the deletion + setTimeout(() => { + // Then fetch the updated media list with the latest data + const latestQuery = { page: 1, limit: 10, sort: "desc" }; + dispatch(getMedia(latestQuery)) + .then(() => { + dispatch(addSuccessNotification("Medium deleted")); + resolve(); + }) + .catch(reject); + }, 800); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + reject(error); + }) + .finally(() => dispatch(stopMediaLoading())); + }); + }; +}; + +export const loadingMedia = (): MediaAction => ({ + type: SET_MEDIA_LOADING, + payload: true, +}); + +export const stopMediaLoading = (): MediaAction => ({ + type: SET_MEDIA_LOADING, + payload: false, +}); + +export const addMedia = (data: Medium[]): MediaAction => ({ + type: ADD_MEDIA, + payload: data, +}); + +export const addMediaRequest = (data: MediaRequestPayload): MediaAction => ({ + type: ADD_MEDIA_REQUEST, + payload: data, +}); + +export const resetMedia = (): MediaAction => ({ + type: RESET_MEDIA, +}); diff --git a/studio/src/actions/meiliReindex.js b/studio/src/actions/meiliReindex.js deleted file mode 100644 index cb9a9e90a..000000000 --- a/studio/src/actions/meiliReindex.js +++ /dev/null @@ -1,29 +0,0 @@ -import axios from 'axios'; -import { MEILI_REINDEX_API } from '../constants/meiliReindex'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -export const reindexSpace = (id) => { - return (dispatch) => { - return axios - .post(MEILI_REINDEX_API + '/space/' + id) - .then((response) => { - if (response.status === 200) dispatch(addSuccessNotification('Successfully Reindexed')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; -export const reindex = () => { - return (dispatch) => { - return axios - .post(MEILI_REINDEX_API + '/all') - .then((response) => { - if (response.status === 200) dispatch(addSuccessNotification('Successfully Reindexed')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; diff --git a/studio/src/actions/meiliReindex.ts b/studio/src/actions/meiliReindex.ts new file mode 100644 index 000000000..26596b766 --- /dev/null +++ b/studio/src/actions/meiliReindex.ts @@ -0,0 +1,37 @@ +import axios, { AxiosResponse } from "axios"; +import { MEILI_REINDEX_API } from "../constants/meiliReindex"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; +import { Dispatch, AnyAction } from "redux"; + +export const reindexSpace = ( + id: string +): ((dispatch: Dispatch) => Promise) => { + return (dispatch: Dispatch): Promise => { + return axios + .post(`${MEILI_REINDEX_API}/space/${id}`) + .then((response: AxiosResponse): void => { + if (response.status === 200) + dispatch(addSuccessNotification("Successfully Reindexed")); + }) + .catch((error: unknown): void => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const reindex = (): (( + dispatch: Dispatch +) => Promise) => { + return (dispatch: Dispatch): Promise => { + return axios + .post(`${MEILI_REINDEX_API}/all`) + .then((response: AxiosResponse): void => { + if (response.status === 200) + dispatch(addSuccessNotification("Successfully Reindexed")); + }) + .catch((error: unknown): void => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; diff --git a/studio/src/actions/menu.js b/studio/src/actions/menu.js deleted file mode 100644 index 6a18eeaa3..000000000 --- a/studio/src/actions/menu.js +++ /dev/null @@ -1,131 +0,0 @@ -import axios from 'axios'; -import { - ADD_MENUS, - ADD_MENUS_REQUEST, - SET_MENUS_LOADING, - RESET_MENUS, - MENUS_API, - GET_MENU, - UPDATE_MENU, -} from '../constants/menu'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -// action to fetch all menus -export const getMenus = (query) => { - return (dispatch) => { - dispatch(loadingMenus()); - return axios - .get(MENUS_API, { - params: query, - }) - .then((response) => { - dispatch(addMenus(response.data.nodes)); - dispatch( - addMenusRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopMenusLoading())); - }; -}; - -// action to fetch menu by id -export const getMenu = (id) => { - return (dispatch) => { - dispatch(loadingMenus()); - return axios - .get(MENUS_API + '/' + id) - .then((response) => { - dispatch(addMenu(GET_MENU, response.data)); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopMenusLoading())); - }; -}; - -// action to create menu -export const createMenu = (data) => { - return (dispatch) => { - dispatch(loadingMenus()); - return axios - .post(MENUS_API, data) - .then(() => { - dispatch(resetMenus()); - dispatch(addSuccessNotification('Menu created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update menu -export const updateMenu = (data) => { - return (dispatch) => { - dispatch(loadingMenus()); - return axios - .put(MENUS_API + '/' + data.id, data) - .then((response) => { - dispatch(addMenu(UPDATE_MENU, response.data)); - dispatch(addSuccessNotification('Menu updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopMenusLoading())); - }; -}; - -// action to delete menu by id -export const deleteMenu = (id) => { - return (dispatch) => { - dispatch(loadingMenus()); - return axios - .delete(MENUS_API + '/' + id) - .then(() => { - dispatch(resetMenus()); - dispatch(addSuccessNotification('Menu deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingMenus = () => ({ - type: SET_MENUS_LOADING, - payload: true, -}); - -export const stopMenusLoading = () => ({ - type: SET_MENUS_LOADING, - payload: false, -}); - -export const addMenu = (type, payload) => ({ - type, - payload, -}); - -export const addMenus = (payload) => ({ - type: ADD_MENUS, - payload, -}); - -export const addMenusRequest = (payload) => ({ - type: ADD_MENUS_REQUEST, - payload, -}); - -export const resetMenus = () => ({ - type: RESET_MENUS, -}); diff --git a/studio/src/actions/menu.ts b/studio/src/actions/menu.ts new file mode 100644 index 000000000..3d736ae53 --- /dev/null +++ b/studio/src/actions/menu.ts @@ -0,0 +1,174 @@ +import axios from "axios"; +import { + ADD_MENUS, + ADD_MENUS_REQUEST, + SET_MENUS_LOADING, + RESET_MENUS, + MENUS_API, + GET_MENU, + UPDATE_MENU, +} from "../constants/menu"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; +import { AppThunk } from "../store/types"; + +// Define types +export interface Menu { + id: string | number; + name: string; + menu?: MenuItem[]; + meta_fields?: any; + [key: string]: any; // Additional menu properties +} + +export interface MenuItem { + name: string; + title?: string; + url?: string; + menu?: MenuItem[]; + [key: string]: any; +} + +interface MenusResponse { + nodes: Menu[]; + total: number; +} + +interface MenusRequestPayload { + data: (string | number)[]; + query: Record; + total: number; +} + +type MenuActionType = typeof GET_MENU | typeof UPDATE_MENU; + +// action to fetch all menus +export const getMenus = (query: Record): AppThunk => { + return (dispatch) => { + dispatch(loadingMenus()); + return axios + .get(MENUS_API, { + params: query, + }) + .then((response) => { + dispatch(addMenus(response.data.nodes)); + dispatch( + addMenusRequest({ + data: response.data.nodes.map((item) => item.id), + query: query, + total: response.data.total, + }) + ); + return response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }) + .finally(() => dispatch(stopMenusLoading())); + }; +}; + +// action to fetch menu by id +export const getMenu = (id: string | number): AppThunk => { + return (dispatch) => { + dispatch(loadingMenus()); + return axios + .get(`${MENUS_API}/${id}`) + .then((response) => { + dispatch(addMenu(GET_MENU, response.data)); + return response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }) + .finally(() => dispatch(stopMenusLoading())); + }; +}; + +// action to create menu +export const createMenu = (data: Omit): AppThunk> => { + return (dispatch) => { + dispatch(loadingMenus()); + return axios + .post(MENUS_API, data) + .then((response) => { + dispatch(resetMenus()); + dispatch(addSuccessNotification("Menu created successfully")); + return response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }) + .finally(() => dispatch(stopMenusLoading())); + }; +}; + +// action to update menu +export const updateMenu = (data: Menu): AppThunk> => { + return (dispatch) => { + dispatch(loadingMenus()); + return axios + .put(`${MENUS_API}/${data.id}`, data) + .then((response) => { + dispatch(addMenu(UPDATE_MENU, response.data)); + dispatch(addSuccessNotification("Menu updated successfully")); + return response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }) + .finally(() => dispatch(stopMenusLoading())); + }; +}; + +// action to delete menu by id +export const deleteMenu = (id: string | number): AppThunk> => { + return (dispatch) => { + dispatch(loadingMenus()); + return axios + .delete(`${MENUS_API}/${id}`) + .then((response) => { + dispatch(resetMenus()); + dispatch(addSuccessNotification("Menu deleted successfully")); + return response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }) + .finally(() => dispatch(stopMenusLoading())); + }; +}; + +export const loadingMenus = () => ({ + type: SET_MENUS_LOADING, + payload: true, +}); + +export const stopMenusLoading = () => ({ + type: SET_MENUS_LOADING, + payload: false, +}); + +export const addMenu = (type: MenuActionType, payload: Menu) => ({ + type, + payload, +}); + +export const addMenus = (payload: Menu[]) => ({ + type: ADD_MENUS, + payload, +}); + +export const addMenusRequest = (payload: MenusRequestPayload) => ({ + type: ADD_MENUS_REQUEST, + payload, +}); + +export const resetMenus = () => ({ + type: RESET_MENUS, +}); diff --git a/studio/src/actions/mfa.js b/studio/src/actions/mfa.js deleted file mode 100644 index 4fcece5bb..000000000 --- a/studio/src/actions/mfa.js +++ /dev/null @@ -1,77 +0,0 @@ -export const startTOTPRegistration = async (userId, token, data = {}) => { - try { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/totp`, { - method: 'POST', - headers: { - Accept: 'application/json', - Authorization: `Bearer ${token}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify(data), - }); - - if (!response.ok) { - throw new Error('Failed to start TOTP registration'); - } - return await response.json(); - } catch (error) { - console.error('Error starting TOTP registration:', error); - throw error; - } -}; - -export const verifyTOTPRegistration = async (userId, token, code) => { - try { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/${userId}/totp/verify`, - { - method: 'POST', - headers: { - Accept: 'application/json', - Authorization: `Bearer ${token}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ code }), - }, - ); - - if (!response.ok) { - throw new Error('Failed to verify TOTP registration'); - } - - return await response.json(); - } catch (error) { - console.error('Error verifying TOTP registration:', error); - throw error; - } -}; - -export const checkTOTP = async (sessionId, sessionToken, code) => { - try { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, { - method: 'PATCH', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - sessionToken, - checks: { - totp: { - code, - }, - }, - }), - }); - - if (!response.ok) { - throw new Error('Failed to check TOTP'); - } - - return await response.json(); - } catch (error) { - console.error('Error checking TOTP:', error); - throw error; - } -}; diff --git a/studio/src/actions/mfa.ts b/studio/src/actions/mfa.ts new file mode 100644 index 000000000..9ed331e22 --- /dev/null +++ b/studio/src/actions/mfa.ts @@ -0,0 +1,97 @@ +export const startTOTPRegistration = async ( + userId: string, + token: string, + data = {} +) => { + try { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/${userId}/totp`, + { + method: "POST", + headers: { + Accept: "application/json", + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + } + ); + + if (!response.ok) { + throw new Error("Failed to start TOTP registration"); + } + return await response.json(); + } catch (error) { + console.error("Error starting TOTP registration:", error); + throw error; + } +}; + +export const verifyTOTPRegistration = async ( + userId: string, + token: string, + code: string +) => { + try { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/users/${userId}/totp/verify`, + { + method: "POST", + headers: { + Accept: "application/json", + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ code }), + } + ); + + if (!response.ok) { + throw new Error("Failed to verify TOTP registration"); + } + + return await response.json(); + } catch (error) { + console.error("Error verifying TOTP registration:", error); + throw error; + } +}; + +export const checkTOTP = async ( + sessionId: string, + sessionToken: string, + code: string +) => { + try { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, + { + method: "PATCH", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + sessionToken, + checks: { + totp: { + code, + }, + }, + }), + } + ); + + if (!response.ok) { + throw new Error("Failed to check TOTP"); + } + + return await response.json(); + } catch (error) { + console.error("Error checking TOTP:", error); + throw error; + } +}; diff --git a/studio/src/actions/notifications.js b/studio/src/actions/notifications.js deleted file mode 100644 index dc940eb15..000000000 --- a/studio/src/actions/notifications.js +++ /dev/null @@ -1,21 +0,0 @@ -import { ADD_NOTIFICATION } from '../constants/notifications'; - -export const addErrorNotification = (data) => ({ - type: ADD_NOTIFICATION, - payload: { - type: 'error', - title: 'Error', - message: data, - time: Date.now(), - }, -}); - -export const addSuccessNotification = (data) => ({ - type: ADD_NOTIFICATION, - payload: { - type: 'success', - title: 'Success', - message: data, - time: Date.now(), - }, -}); diff --git a/studio/src/actions/notifications.ts b/studio/src/actions/notifications.ts new file mode 100644 index 000000000..b3dbcd232 --- /dev/null +++ b/studio/src/actions/notifications.ts @@ -0,0 +1,60 @@ +import { ADD_NOTIFICATION } from "../constants/notifications"; +import { Dispatch, AnyAction } from "redux"; + +// Notification types +export type NotificationType = "error" | "success"; + +export interface NotificationPayload { + type: NotificationType; + title: string; + message: string; + time: number; +} + +export interface NotificationAction extends AnyAction { + type: typeof ADD_NOTIFICATION; + payload: NotificationPayload; +} + +export interface ErrorNotificationData { + message: string; +} + +export const addErrorNotification = ( + data: string | ErrorNotificationData +): NotificationAction => ({ + type: ADD_NOTIFICATION, + payload: { + type: "error", + title: "Error", + message: typeof data === "string" ? data : data.message, + time: Date.now(), + }, +}); + +export interface SuccessNotificationData { + message: string; +} + +export const addSuccessNotification = ( + data: string | SuccessNotificationData +): NotificationAction => ({ + type: ADD_NOTIFICATION, + payload: { + type: "success", + title: "Success", + message: typeof data === "string" ? data : data.message, + time: Date.now(), + }, +}); + +// Helper thunk to allow for timed notifications +export const showNotification = (type: NotificationType, message: string) => { + return (dispatch: Dispatch) => { + if (type === "error") { + dispatch(addErrorNotification(message)); + } else { + dispatch(addSuccessNotification(message)); + } + }; +}; diff --git a/studio/src/actions/organisation.ts b/studio/src/actions/organisation.ts new file mode 100644 index 000000000..32828413c --- /dev/null +++ b/studio/src/actions/organisation.ts @@ -0,0 +1,118 @@ +interface SearchQuery { + offset: number; + limit: number; + asc: boolean; +} + +export interface Member { + userId: string; + displayName?: string; + email?: string; + roles?: string[]; +} + +interface SearchResponse { + result: Member[]; +} + +interface OrganisationResult { + result?: any[]; +} + +// User information interface for getRole function +interface UserInfo { + [key: string]: { + [role: string]: { + [orgId: string]: boolean; + }; + }; +} + +export const searchMembers = async (): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/management/v1/orgs/me/members/_search`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + query: { + offset: 0, + limit: 100, + asc: true, + } as SearchQuery, + }), + } + ); + + if (!response.ok) { + throw new Error("Failed to fetch members"); + } + + return response.json(); +}; + +export const removeMember = async (userId: string): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/management/v1/orgs/me/members/${userId}`, + { + method: "DELETE", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to remove member"); + } + + return response; +}; + +export const getOrganisations = (): Promise => { + return fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/auth/v1/global/projectorgs/_search`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${localStorage.getItem("sessionToken")}`, + }, + credentials: "include", + } + ) + .then((response) => { + if (response.status === 200) { + return response.json() as Promise; + } else { + throw response; + } + }) + .then((data) => { + return data.result || []; + }) + .catch((error) => { + throw error; + }); +}; + +export const getRole = (orgId: string, userInfo: UserInfo): string => { + const roleKey = `urn:zitadel:iam:org:project:${ + import.meta.env.VITE_ZITADEL_PROJECT_ID + }:roles`; + + const roles = userInfo[roleKey]; + + if (roles?.["admin"]?.[orgId]) return "admin"; + if (roles?.["member"]?.[orgId]) return "member"; + return ""; +}; diff --git a/studio/src/actions/pages.js b/studio/src/actions/pages.js deleted file mode 100644 index 031a425ee..000000000 --- a/studio/src/actions/pages.js +++ /dev/null @@ -1,271 +0,0 @@ -import axios from 'axios'; -import { - ADD_PAGE, - ADD_PAGES, - ADD_PAGES_REQUEST, - RESET_PAGES, - SET_PAGES_LOADING, - PAGES_API, -} from '../constants/pages'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addMedia } from './media'; -import { addAuthors } from './authors'; -import { addTags } from './tags'; -import { addCategories } from './categories'; -import { addFormats } from './formats'; -import getError from '../utils/getError'; - -export const getPages = (query) => { - return (dispatch, getState) => { - const currentSpaceID = getState().spaces?.selected; - if (currentSpaceID === 0) { - return; - } - dispatch(loadingPages()); - const params = new URLSearchParams(); - - if (query.category && query.category.length > 0) { - query.category.map((each) => params.append('category', each)); - } - if (query.tag && query.tag.length > 0) { - query.tag.map((each) => params.append('tag', each)); - } - if (query.format && query.format.length > 0) { - query.format.map((each) => params.append('format', each)); - } - if (query.page) { - params.append('page', query.page); - } - if (query.limit) { - params.append('limit', query.limit); - } - if (query.sort) { - params.append('sort', query.sort); - } - if (query.q) { - params.append('q', query.q); - } - if (query.status) { - params.append('status', query.status); - } - if (query.author) { - query.author.map((each) => params.append('author', each)); - } - - return axios - .get(PAGES_API, { - params: params, - }) - .then((response) => { - dispatch( - addAuthors( - response.data.nodes - .filter((page) => page.authors.length > 0) - .map((page) => { - return page.authors; - }) - .flat(1), - ), - ); - dispatch( - addTags( - response.data.nodes - .filter((page) => page.tags.length > 0) - .map((page) => { - return page.tags; - }) - .flat(1), - ), - ); - dispatch( - addCategories( - response.data.nodes - .filter((page) => page.categories.length > 0) - .map((page) => { - return page.categories; - }) - .flat(1), - ), - ); - dispatch( - addFormats( - response.data.nodes - .filter((page) => page.format) - .map((page) => { - return page.format; - }) - .flat(1), - ), - ); - dispatch( - addMedia(response.data.nodes.filter((page) => page.medium).map((page) => page.medium)), - ); - dispatch( - addPagesList( - response.data.nodes.map((page) => { - page.description = { json: page.description, html: page.description_html }; - return { - ...page, - medium: page.medium?.id, - categories: page.categories.map((category) => category.id), - tags: page.tags.map((tag) => tag.id), - authors: page.authors.map((author) => author.id), - format: page.format.id, - }; - }), - ), - ); - dispatch( - addPagesRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPagesLoading())); - }; -}; - -export const getPage = (id) => { - return (dispatch) => { - dispatch(loadingPages()); - return axios - .get(PAGES_API + '/' + id) - .then((response) => { - let page = response.data; - page.description = { json: page.description, html: page.description_html }; - dispatch(addTags(page.tags)); - dispatch(addAuthors(page.authors)); - dispatch(addCategories(page.categories)); - if (page.medium) dispatch(addMedia([page.medium])); - - dispatch( - getPageByID({ - ...page, - authors: page.authors.map((author) => author.id), - categories: page.categories.map((category) => category.id), - tags: page.tags.map((tag) => tag.id), - medium: page.medium?.id, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPagesLoading())); - }; -}; - -export const addPage = (data) => { - return (dispatch) => { - dispatch(loadingPages()); - return axios - .post(PAGES_API, data) - .then((response) => { - let page = response.data; - page.description = { json: page.description, html: page.description_html }; - dispatch(addTags(page.tags)); - dispatch(addCategories(page.categories)); - dispatch(addAuthors(page.authors)); - if (page.medium) dispatch(addMedia([page.medium])); - - dispatch(resetPages()); - page.status === 'publish' - ? dispatch(addSuccessNotification(`Page Published`)) - : page.status === 'future' - ? dispatch(addSuccessNotification('Page added & Scheduled for future publish')) - : page.status === 'draft' - ? dispatch(addSuccessNotification('Page added')) - : dispatch(addSuccessNotification('Page added & Ready to Publish')); - return page; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const updatePage = (data) => { - return (dispatch) => { - dispatch(loadingPages()); - return axios - .put(PAGES_API + '/' + data.id, data) - .then((response) => { - let page = response.data; - page.description = { json: page.description, html: page.description_html }; - dispatch(addTags(page.tags)); - dispatch(addCategories(page.categories)); - dispatch(addAuthors(page.authors)); - if (page.medium) dispatch(addMedia([page.medium])); - - dispatch( - getPageByID({ - ...page, - authors: page.authors.map((author) => author.id), - categories: page.categories.map((category) => category.id), - tags: page.tags.map((tag) => tag.id), - medium: page.medium?.id, - }), - ); - page.status === 'publish' - ? dispatch(addSuccessNotification(`Page Published`)) - : page.status === 'future' - ? dispatch(addSuccessNotification('Page saved & Scheduled for future publish')) - : page.status === 'draft' - ? dispatch(addSuccessNotification('Draft Saved')) - : dispatch(addSuccessNotification('Draft saved & Ready to Publish')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPagesLoading())); - }; -}; - -export const deletePage = (id) => { - return (dispatch) => { - dispatch(loadingPages()); - return axios - .delete(PAGES_API + '/' + id) - .then(() => { - dispatch(resetPages()); - dispatch(addSuccessNotification('Page deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingPages = () => ({ - type: SET_PAGES_LOADING, - payload: true, -}); - -export const stopPagesLoading = () => ({ - type: SET_PAGES_LOADING, - payload: false, -}); - -export const getPageByID = (data) => ({ - type: ADD_PAGE, - payload: data, -}); - -export const addPagesList = (data) => ({ - type: ADD_PAGES, - payload: data, -}); - -export const addPagesRequest = (data) => ({ - type: ADD_PAGES_REQUEST, - payload: data, -}); - -export const resetPages = () => ({ - type: RESET_PAGES, -}); diff --git a/studio/src/actions/pages.ts b/studio/src/actions/pages.ts new file mode 100644 index 000000000..1b8037549 --- /dev/null +++ b/studio/src/actions/pages.ts @@ -0,0 +1,357 @@ +import axios from "axios"; +import { + ADD_PAGE, + ADD_PAGES, + ADD_PAGES_REQUEST, + RESET_PAGES, + SET_PAGES_LOADING, + PAGES_API, +} from "../constants/pages"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addMedia } from "./media"; +import { addAuthors } from "./authors"; +import { addTags } from "./tags"; +import { addCategories } from "./categories"; +import { addFormats } from "./formats"; +import getError from "../utils/getError"; +import { AppThunk } from "../store/types"; + +interface PageQueryParams { + category?: string[]; + tag?: string[]; + format?: string[]; + page?: number; + limit?: number; + sort?: string; + q?: string; + status?: string; + author?: string[]; +} + +interface PageData { + id: number; + title: string; + slug: string; + description: any; + description_html?: string; + status: "publish" | "draft" | "future" | string; + medium?: { id: number } | null; + categories: Array<{ id: number }>; + tags: Array<{ id: number }>; + authors: Array<{ id: number }>; + format: { id: number }; +} + +interface PageRequestData { + data: number[]; + query: PageQueryParams; + total: number; +} + +interface PageFormData { + id: number; + title: string; + slug: string; + status?: "publish" | "draft" | "ready" | "future"; + featured_medium_id?: number; + medium?: any; + published_date: string | null; + categories?: number[]; + tags?: number[]; + authors?: number[]; + claims?: number[]; + description?: any; + format?: number; + [key: string]: any; +} + +export const getPages = (query: PageQueryParams): AppThunk => { + return (dispatch, getState) => { + const currentSpaceID = getState().spaces?.selected; + if (currentSpaceID === "" || currentSpaceID === "0") { + return; + } + dispatch(loadingPages()); + const params = new URLSearchParams(); + + if (query.category && query.category.length > 0) { + query.category.forEach((each) => params.append("category", each)); + } + if (query.tag && query.tag.length > 0) { + query.tag.forEach((each) => params.append("tag", each)); + } + if (query.format && query.format.length > 0) { + query.format.forEach((each) => params.append("format", each)); + } + if (query.page) { + params.append("page", query.page.toString()); + } + if (query.limit) { + params.append("limit", query.limit.toString()); + } + if (query.sort) { + params.append("sort", query.sort); + } + if (query.q) { + params.append("q", query.q); + } + if (query.status) { + params.append("status", query.status); + } + if (query.author) { + query.author.forEach((each) => params.append("author", each)); + } + + return axios + .get(PAGES_API, { + params: params, + }) + .then((response) => { + dispatch( + addAuthors( + response.data.nodes + .filter((page: any) => page.authors.length > 0) + .map((page: any) => { + return page.authors; + }) + .flat(1) + ) + ); + dispatch( + addTags( + response.data.nodes + .filter((page: any) => page.tags.length > 0) + .map((page: any) => { + return page.tags; + }) + .flat(1) + ) + ); + dispatch( + addCategories( + response.data.nodes + .filter((page: any) => page.categories.length > 0) + .map((page: any) => { + return page.categories; + }) + .flat(1) + ) + ); + dispatch( + addFormats( + response.data.nodes + .filter((page: any) => page.format) + .map((page: any) => { + return page.format; + }) + .flat(1) + ) + ); + dispatch( + addMedia( + response.data.nodes + .filter((page: any) => page.medium) + .map((page: any) => page.medium) + ) + ); + dispatch( + addPagesList( + response.data.nodes.map((page: any) => { + page.description = { + json: page.description, + html: page.description_html, + }; + return { + ...page, + medium: page.medium?.id, + categories: page.categories.map((category: any) => category.id), + tags: page.tags.map((tag: any) => tag.id), + authors: page.authors.map((author: any) => author.id), + format: page.format.id, + }; + }) + ) + ); + dispatch( + addPagesRequest({ + data: response.data.nodes.map((item: any) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + dispatch( + addPagesRequest({ + data: [], + query: query, + total: 0, + }) + ); + }) + .finally(() => dispatch(stopPagesLoading())); + }; +}; + +export const getPage = (id: number | string): AppThunk => { + return (dispatch) => { + dispatch(loadingPages()); + return axios + .get(`${PAGES_API}/${id}`) + .then((response) => { + const page = response.data; + page.description = { + json: page.description, + html: page.description_html, + }; + dispatch(addTags(page.tags)); + dispatch(addAuthors(page.authors)); + dispatch(addCategories(page.categories)); + if (page.medium) dispatch(addMedia([page.medium])); + + dispatch( + getPageByID({ + ...page, + authors: page.authors.map((author: any) => author.id), + categories: page.categories.map((category: any) => category.id), + tags: page.tags.map((tag: any) => tag.id), + medium: page.medium?.id, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPagesLoading())); + }; +}; + +export const addPage = (data: PageFormData): AppThunk => { + return (dispatch) => { + dispatch(loadingPages()); + return axios + .post(PAGES_API, data) + .then((response) => { + const page = response.data; + page.description = { + json: page.description, + html: page.description_html, + }; + dispatch(addTags(page.tags)); + dispatch(addCategories(page.categories)); + dispatch(addAuthors(page.authors)); + if (page.medium) dispatch(addMedia([page.medium])); + + dispatch(resetPages()); + if (page.status === "publish") { + dispatch(addSuccessNotification(`Page Published`)); + } else if (page.status === "future") { + dispatch( + addSuccessNotification("Page added & Scheduled for future publish") + ); + } else if (page.status === "draft") { + dispatch(addSuccessNotification("Page added")); + } else { + dispatch(addSuccessNotification("Page added & Ready to Publish")); + } + return page; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }); + }; +}; + +export const updatePage = (data: PageFormData): AppThunk => { + return (dispatch) => { + dispatch(loadingPages()); + return axios + .put(`${PAGES_API}/${data.id}`, data) + .then((response) => { + const page = response.data; + page.description = { + json: page.description, + html: page.description_html, + }; + dispatch(addTags(page.tags)); + dispatch(addCategories(page.categories)); + dispatch(addAuthors(page.authors)); + if (page.medium) dispatch(addMedia([page.medium])); + + dispatch( + getPageByID({ + ...page, + authors: page.authors.map((author: any) => author.id), + categories: page.categories.map((category: any) => category.id), + tags: page.tags.map((tag: any) => tag.id), + medium: page.medium?.id, + }) + ); + + if (page.status === "publish") { + dispatch(addSuccessNotification(`Page Published`)); + } else if (page.status === "future") { + dispatch( + addSuccessNotification("Page saved & Scheduled for future publish") + ); + } else if (page.status === "draft") { + dispatch(addSuccessNotification("Draft Saved")); + } else { + dispatch(addSuccessNotification("Draft saved & Ready to Publish")); + } + + return page; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; // Re-throw error to allow further catch handling + }) + .finally(() => dispatch(stopPagesLoading())); + }; +}; + +export const deletePage = (id: number): AppThunk => { + return (dispatch) => { + dispatch(loadingPages()); + return axios + .delete(`${PAGES_API}/${id}`) + .then(() => { + dispatch(resetPages()); + dispatch(addSuccessNotification("Page deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingPages = () => ({ + type: SET_PAGES_LOADING, + payload: true, +}); + +export const stopPagesLoading = () => ({ + type: SET_PAGES_LOADING, + payload: false, +}); + +export const getPageByID = (data: PageData) => ({ + type: ADD_PAGE, + payload: data, +}); + +export const addPagesList = (data: PageData[]) => ({ + type: ADD_PAGES, + payload: data, +}); + +export const addPagesRequest = (data: PageRequestData) => ({ + type: ADD_PAGES_REQUEST, + payload: data, +}); + +export const resetPages = () => ({ + type: RESET_PAGES, +}); diff --git a/studio/src/actions/permissions.js b/studio/src/actions/permissions.js deleted file mode 100644 index 636bcae29..000000000 --- a/studio/src/actions/permissions.js +++ /dev/null @@ -1,47 +0,0 @@ -import axios from 'axios'; -import { - PERMISSIONS_API, - ADD_PERMISSIONS_REQUEST, - SET_PERMISSIONS_LOADING, - ADD_PERMISSIONS, -} from '../constants/permissions'; -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getPermissions = (id) => { - return (dispatch) => { - dispatch(loadingPermissions()); - return axios - .get(PERMISSIONS_API + id + '/permissions') - .then((response) => { - dispatch(addPermission({ data: response.data, user_id: parseInt(id) })); - dispatch(addRequest([parseInt(id)])); - - return { data: response.data, user_id: parseInt(id) }; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopLoading())); - }; -}; - -export const addPermission = (data) => ({ - type: ADD_PERMISSIONS, - payload: data, -}); - -export const addRequest = (data) => ({ - type: ADD_PERMISSIONS_REQUEST, - payload: data, -}); - -export const loadingPermissions = () => ({ - type: SET_PERMISSIONS_LOADING, - payload: true, -}); - -export const stopLoading = () => ({ - type: SET_PERMISSIONS_LOADING, - payload: false, -}); diff --git a/studio/src/actions/permissions.ts b/studio/src/actions/permissions.ts new file mode 100644 index 000000000..3d71fa132 --- /dev/null +++ b/studio/src/actions/permissions.ts @@ -0,0 +1,66 @@ +import axios from "axios"; +import { + PERMISSIONS_API, + ADD_PERMISSIONS_REQUEST, + SET_PERMISSIONS_LOADING, + ADD_PERMISSIONS, +} from "../constants/permissions"; +import { addErrorNotification } from "./notifications"; +import getError from "../utils/getError"; + +// Define interfaces +interface Permission { + [key: string]: any; +} + +interface PermissionPayload { + data: Permission; + user_id: number; +} + +interface PermissionAction { + type: string; + payload: any; +} + +export const getPermissions = (id: string | number) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingPermissions()); + return axios + .get(`${PERMISSIONS_API}${id}/permissions`) + .then((response) => { + const payload: PermissionPayload = { + data: response.data, + user_id: parseInt(id.toString()), + }; + dispatch(addPermission(payload)); + dispatch(addRequest([parseInt(id.toString())])); + + return payload; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopLoading())); + }; +}; + +export const addPermission = (data: PermissionPayload): PermissionAction => ({ + type: ADD_PERMISSIONS, + payload: data, +}); + +export const addRequest = (data: number[]): PermissionAction => ({ + type: ADD_PERMISSIONS_REQUEST, + payload: data, +}); + +export const loadingPermissions = (): PermissionAction => ({ + type: SET_PERMISSIONS_LOADING, + payload: true, +}); + +export const stopLoading = (): PermissionAction => ({ + type: SET_PERMISSIONS_LOADING, + payload: false, +}); diff --git a/studio/src/actions/policies.js b/studio/src/actions/policies.js deleted file mode 100644 index b3a16d1fa..000000000 --- a/studio/src/actions/policies.js +++ /dev/null @@ -1,154 +0,0 @@ -import axios from 'axios'; -import { - ADD_POLICIES, - ADD_POLICIES_REQUEST, - SET_POLICIES_LOADING, - RESET_POLICIES, - POLICIES_API, - UPDATE_POLICY, - GET_POLICY, -} from '../constants/policies'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -// action to fetch all policies -export const addDefaultPolicies = (query) => { - return (dispatch) => { - dispatch(loadingPolicies()); - return axios - .post(POLICIES_API + '/default') - .then((response) => { - dispatch(addPolicies(response.data)); - dispatch( - addPoliciesRequest({ - data: response.data.map((item) => item.id), - query: query, - total: response.data.length, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPoliciesLoading())); - }; -}; - -// action to fetch all policies -export const getPolicies = (query) => { - return (dispatch) => { - dispatch(loadingPolicies()); - return axios - .get(POLICIES_API, { - params: query, - }) - .then((response) => { - dispatch(addPolicies(response.data.nodes)); - dispatch( - addPoliciesRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPoliciesLoading())); - }; -}; - -// action to fetch policy by id -export const getPolicy = (id) => { - return (dispatch) => { - dispatch(loadingPolicies()); - return axios - .get(POLICIES_API + '/' + id) - .then((response) => { - dispatch(addPolicy(GET_POLICY, response.data)); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPoliciesLoading())); - }; -}; - -// action to create policy -export const createPolicy = (data) => { - return (dispatch) => { - dispatch(loadingPolicies()); - return axios - .post(POLICIES_API, data) - .then(() => { - dispatch(resetPolicies()); - dispatch(addSuccessNotification('Policy created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update policy by id -export const updatePolicy = (data) => { - return (dispatch) => { - dispatch(loadingPolicies()); - return axios - .put(POLICIES_API + '/' + data.id, data) - .then((response) => { - dispatch(addPolicy(UPDATE_POLICY, response.data)); - dispatch(addSuccessNotification('Policy updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPoliciesLoading())); - }; -}; - -// action to delete policy by id -export const deletePolicy = (id) => { - return (dispatch) => { - dispatch(loadingPolicies()); - return axios - .delete(POLICIES_API + '/' + id) - .then(() => { - dispatch(resetPolicies()); - dispatch(addSuccessNotification('Policy deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingPolicies = () => ({ - type: SET_POLICIES_LOADING, - payload: true, -}); - -export const stopPoliciesLoading = () => ({ - type: SET_POLICIES_LOADING, - payload: false, -}); - -export const addPolicy = (type, payload) => ({ - type, - payload, -}); - -export const addPolicies = (payload) => ({ - type: ADD_POLICIES, - payload, -}); - -export const addPoliciesRequest = (payload) => ({ - type: ADD_POLICIES_REQUEST, - payload, -}); - -export const resetPolicies = () => ({ - type: RESET_POLICIES, -}); diff --git a/studio/src/actions/policies.ts b/studio/src/actions/policies.ts new file mode 100644 index 000000000..973dbadb4 --- /dev/null +++ b/studio/src/actions/policies.ts @@ -0,0 +1,187 @@ +import axios from "axios"; +import { + ADD_POLICIES, + ADD_POLICIES_REQUEST, + SET_POLICIES_LOADING, + RESET_POLICIES, + POLICIES_API, + UPDATE_POLICY, + GET_POLICY, +} from "../constants/policies"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; +import { ThunkAction } from "redux-thunk"; +import { Action } from "redux"; +import { RootState } from "../store"; + +// Define interfaces +export interface Policy { + id: string; + name: string; + description?: string; + permissions?: { + resource: string; + actions: string[]; + }[]; + [key: string]: any; +} + +export interface PolicyAction { + type: string; + payload: any; +} + +export interface PolicyRequestData { + data: string[]; + query: any; + total: number; +} + +type ThunkResult = ThunkAction>; + +// action to fetch all policies +export const addDefaultPolicies = (query: any): ThunkResult> => { + return (dispatch) => { + dispatch(loadingPolicies()); + return axios + .post(`${POLICIES_API}/default`) + .then((response) => { + dispatch(addPolicies(response.data)); + dispatch( + addPoliciesRequest({ + data: response.data.map((item: Policy) => item.id), + query: query, + total: response.data.length, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPoliciesLoading())); + }; +}; + +// action to fetch all policies +export const getPolicies = (query: any): ThunkResult> => { + return (dispatch) => { + dispatch(loadingPolicies()); + return axios + .get(POLICIES_API, { + params: query, + }) + .then((response) => { + dispatch(addPolicies(response.data.nodes)); + dispatch( + addPoliciesRequest({ + data: response.data.nodes.map((item: Policy) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPoliciesLoading())); + }; +}; + +// action to fetch policy by id +export const getPolicy = (id: string): ThunkResult> => { + return (dispatch) => { + dispatch(loadingPolicies()); + return axios + .get(`${POLICIES_API}/${id}`) + .then((response) => { + dispatch(addPolicy(GET_POLICY, response.data)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPoliciesLoading())); + }; +}; + +// action to create policy +export const createPolicy = ( + data: Omit +): ThunkResult> => { + return (dispatch) => { + dispatch(loadingPolicies()); + return axios + .post(POLICIES_API, data) + .then(() => { + dispatch(resetPolicies()); + dispatch(addSuccessNotification("Policy created")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +// action to update policy by id +export const updatePolicy = (data: Policy): ThunkResult> => { + return (dispatch) => { + dispatch(loadingPolicies()); + return axios + .put(`${POLICIES_API}/${data.id}`, data) + .then((response) => { + dispatch(addPolicy(UPDATE_POLICY, response.data)); + dispatch(addSuccessNotification("Policy updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPoliciesLoading())); + }; +}; + +// action to delete policy by id +export const deletePolicy = (id: string): ThunkResult> => { + return (dispatch) => { + dispatch(loadingPolicies()); + return axios + .delete(`${POLICIES_API}/${id}`) + .then(() => { + dispatch(resetPolicies()); + dispatch(addSuccessNotification("Policy deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingPolicies = (): PolicyAction => ({ + type: SET_POLICIES_LOADING, + payload: true, +}); + +export const stopPoliciesLoading = (): PolicyAction => ({ + type: SET_POLICIES_LOADING, + payload: false, +}); + +export const addPolicy = (type: string, payload: Policy): PolicyAction => ({ + type, + payload, +}); + +export const addPolicies = (payload: Policy[]): PolicyAction => ({ + type: ADD_POLICIES, + payload, +}); + +export const addPoliciesRequest = ( + payload: PolicyRequestData +): PolicyAction => ({ + type: ADD_POLICIES_REQUEST, + payload, +}); + +export const resetPolicies = (): PolicyAction => ({ + type: RESET_POLICIES, + payload: [], +}); diff --git a/studio/src/actions/posts.js b/studio/src/actions/posts.js deleted file mode 100644 index 285ddd397..000000000 --- a/studio/src/actions/posts.js +++ /dev/null @@ -1,403 +0,0 @@ -import axios from 'axios'; -import { - ADD_POST, - ADD_POSTS, - ADD_POSTS_REQUEST, - SET_POSTS_LOADING, - RESET_POSTS, - POSTS_API, -} from '../constants/posts'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addCategories } from './categories'; -import { addTags } from './tags'; -import { addFormats } from './formats'; -import { addMedia } from './media'; -import { addAuthors } from './authors'; -import { addClaims } from './claims'; -import getError from '../utils/getError'; - -export const getPosts = (query) => { - return (dispatch, getState) => { - const currentSpaceID = getState().spaces?.selected; - if (currentSpaceID === 0) { - return; - } - dispatch(loadingPosts()); - - const params = new URLSearchParams(); - if (query.category && query.category.length > 0) { - query.category.map((each) => params.append('category', each)); - } - if (query.tag && query.tag.length > 0) { - query.tag.map((each) => params.append('tag', each)); - } - if (query.format && query.format.length > 0) { - query.format.map((each) => params.append('format', each)); - } - if (query.page) { - params.append('page', query.page); - } - if (query.limit) { - params.append('limit', query.limit); - } - if (query.sort) { - params.append('sort', query.sort); - } - if (query.q) { - params.append('q', query.q); - } - if (query.status) { - params.append('status', query.status); - } - if (query.author) { - query.author.map((each) => params.append('author', each)); - } - return axios - .get(POSTS_API, { - params: params, - }) - .then((response) => { - dispatch( - addAuthors( - response.data.nodes - .filter((post) => post.authors.length > 0) - .map((post) => { - return post.authors; - }) - .flat(1), - ), - ); - dispatch( - addTags( - response.data.nodes - .filter((post) => post.tags.length > 0) - .map((post) => { - return post.tags; - }) - .flat(1), - ), - ); - dispatch( - addCategories( - response.data.nodes - .filter((post) => post.categories.length > 0) - .map((post) => { - return post.categories; - }) - .flat(1), - ), - ); - dispatch( - addFormats( - response.data.nodes - .filter((post) => post.format) - .map((post) => { - return post.format; - }) - .flat(1), - ), - ); - dispatch( - addClaims( - response.data.nodes - .filter((post) => post.claims.length > 0) - .map((post) => { - return post.claims; - }) - .flat(1), - ), - ); - dispatch( - addMedia( - response.data.nodes - .filter((post) => post.medium) - .map((post) => { - return post.medium; - }), - ), - ); - dispatch( - addPostsList( - response.data.nodes.map((post) => { - post.description = { json: post.description, html: post.description_html }; - return { - ...post, - categories: post.categories.map((category) => category.id), - tags: post.tags.map((tag) => tag.id), - authors: post.authors.map((author) => author.id), - format: post.format.id, - claims: post.claims.map((claim) => claim.id), - medium: post.medium?.id, - }; - }), - ), - ); - dispatch( - addPostsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPostsLoading())); - }; -}; - -export const getPost = (id) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .get(POSTS_API + '/' + id) - .then((response) => { - let post = response.data; - post.description = { json: post.description, html: post.description_html }; - dispatch(addTags(post.tags)); - dispatch(addAuthors(post.authors)); - dispatch(addCategories(post.categories)); - dispatch(addClaims(post.claims)); - dispatch(addFormats([post.format])); - if (post.medium) dispatch(addMedia([post.medium])); - - dispatch( - getPostByID({ - ...post, - authors: post.authors.map((author) => author.id), - categories: post.categories.map((category) => category.id), - claims: post.claims.map((claim) => claim.id), - tags: post.tags.map((tag) => tag.id), - format: post.format.id, - medium: post.medium?.id, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPostsLoading())); - }; -}; - -export const addPost = (data) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .post(POSTS_API, data) - .then((response) => { - let post = response.data; - post.description = { json: post.description, html: post.description_html }; - dispatch(addTags(post.tags)); - dispatch(addCategories(post.categories)); - dispatch(addAuthors(post.authors)); - dispatch(addClaims(post.claims)); - dispatch(addFormats([post.format])); - if (post.medium) dispatch(addMedia([post.medium])); - - dispatch(resetPosts()); - post.status === 'publish' - ? dispatch(addSuccessNotification(`${post.format.name} Published`)) - : post.status === 'future' - ? dispatch(addSuccessNotification('Post added & Scheduled for future publish')) - : post.status === 'draft' - ? dispatch(addSuccessNotification('Post added')) - : dispatch(addSuccessNotification('Post added & Ready to Publish')); - return post; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const publish = (data) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .post(POSTS_API + '/publish', data) - .then((response) => { - let post = response.data; - post.description = { json: post.description, html: post.description_html }; - dispatch(addTags(post.tags)); - dispatch(addCategories(post.categories)); - dispatch(addAuthors(post.authors)); - dispatch(addClaims(post.claims)); - dispatch(addFormats([post.format])); - if (post.medium) dispatch(addMedia([post.medium])); - - dispatch( - getPostByID({ - ...post, - authors: post.authors.map((author) => author.id), - categories: post.categories.map((category) => category.id), - tags: post.tags.map((tag) => tag.id), - format: post.format.id, - claims: post.claims.map((claim) => claim.id), - medium: post.medium?.id, - }), - ); - dispatch(addSuccessNotification('Post published')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPostsLoading())); - }; -}; - -export const addTemplate = (data) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .post(POSTS_API + '/templates', data) - .then((response) => { - let post = response.data; - post.description = { json: post.description, html: post.description_html }; - dispatch(addTags(post.tags)); - dispatch(addCategories(post.categories)); - dispatch(addAuthors(post.authors || [])); - dispatch(addClaims(post.claims || [])); - dispatch(addFormats([post.format])); - if (post.medium) dispatch(addMedia([post.medium])); - - dispatch( - getPostByID({ - ...post, - authors: (post.authors && post.authors.map((author) => author.id)) || [], - categories: post.categories.map((category) => category.id), - tags: post.tags.map((tag) => tag.id), - format: post.format.id, - claims: (post.claims && post.claims.map((claim) => claim.id)) || [], - medium: post.medium?.id, - }), - ); - dispatch(addSuccessNotification('Template created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPostsLoading())); - }; -}; - -export const publishPost = (data) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .put(POSTS_API + '/' + data.id + '/publish', data) - .then((response) => { - let post = response.data; - post.description = { json: post.description, html: post.description_html }; - dispatch(addTags(post.tags)); - dispatch(addCategories(post.categories)); - dispatch(addAuthors(post.authors)); - dispatch(addClaims(post.claims)); - dispatch(addFormats([post.format])); - if (post.medium) dispatch(addMedia([post.medium])); - - dispatch( - getPostByID({ - ...post, - authors: post.authors.map((author) => author.id), - categories: post.categories.map((category) => category.id), - tags: post.tags.map((tag) => tag.id), - format: post.format.id, - claims: post.claims.map((claim) => claim.id), - medium: post.medium?.id, - }), - ); - dispatch(addSuccessNotification('Post published')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPostsLoading())); - }; -}; - -export const updatePost = (data) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .put(POSTS_API + '/' + data.id, data) - .then((response) => { - let post = response.data; - post.description = { json: post.description, html: post.description_html }; - dispatch(addTags(post.tags)); - dispatch(addCategories(post.categories)); - dispatch(addAuthors(post.authors)); - dispatch(addClaims(post.claims)); - dispatch(addFormats([post.format])); - if (post.medium) dispatch(addMedia([post.medium])); - - dispatch( - getPostByID({ - ...post, - authors: post.authors.map((author) => author.id), - categories: post.categories.map((category) => category.id), - tags: post.tags.map((tag) => tag.id), - format: post.format.id, - claims: post.claims.map((claim) => claim.id), - medium: post.medium?.id, - }), - ); - data.status === 'publish' - ? dispatch(addSuccessNotification(`${post.format.name} Published`)) - : post.status === 'future' - ? dispatch(addSuccessNotification('Post saved & Scheduled for future publish')) - : data.status === 'draft' - ? dispatch(addSuccessNotification('Draft Saved')) - : dispatch(addSuccessNotification('Draft saved & Ready to Publish')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopPostsLoading())); - }; -}; - -export const deletePost = (id) => { - return (dispatch) => { - dispatch(loadingPosts()); - return axios - .delete(POSTS_API + '/' + id) - .then(() => { - dispatch(resetPosts()); - dispatch(addSuccessNotification('Post deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingPosts = () => ({ - type: SET_POSTS_LOADING, - payload: true, -}); - -export const stopPostsLoading = () => ({ - type: SET_POSTS_LOADING, - payload: false, -}); - -export const getPostByID = (data) => ({ - type: ADD_POST, - payload: data, -}); - -export const addPostsList = (data) => ({ - type: ADD_POSTS, - payload: data, -}); - -export const addPostsRequest = (data) => ({ - type: ADD_POSTS_REQUEST, - payload: data, -}); - -export const resetPosts = () => ({ - type: RESET_POSTS, -}); diff --git a/studio/src/actions/posts.ts b/studio/src/actions/posts.ts new file mode 100644 index 000000000..155782abb --- /dev/null +++ b/studio/src/actions/posts.ts @@ -0,0 +1,561 @@ +import axios from "axios"; +import { + ADD_POST, + ADD_POSTS, + ADD_POSTS_REQUEST, + SET_POSTS_LOADING, + RESET_POSTS, + POSTS_API, +} from "../constants/posts"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addCategories } from "./categories"; +import { addTags } from "./tags"; +import { addFormats } from "./formats"; +import { addMedia } from "./media"; +import { addAuthors } from "./authors"; +import { addClaims } from "./claims"; +import getError from "../utils/getError"; +import { Dispatch, AnyAction } from "redux"; +import { ThunkAction } from "redux-thunk"; +import { RootState } from "../store/index"; + +// Define types for our data structures +interface Category { + id: number; + name?: string; +} + +interface Tag { + id: number; + name?: string; +} + +interface Author { + id: number; + name?: string; +} + +interface Format { + id: number; + name: string; +} + +interface Claim { + id: number; + name?: string; +} + +interface Medium { + id: number; + name?: string; +} + +interface Description { + json: any; + html: string; +} + +interface Post { + updated_at?: string; + created_at?: string; + published_date: string | null; + tag_ids?: number[]; + category_ids?: number[]; + author_ids?: number[]; + authors?: number[] | Array<{ id: number; display_name: string }>; + id: number; + title: string; + slug: string; + status?: "publish" | "draft" | "ready" | "future"; + categories?: number[]; + tags?: number[]; + claims?: number[]; + [key: string]: any; +} + +interface PostResponse { + nodes: Post[]; + total: number; +} + +interface PostsQueryParams { + category?: number[]; + tag?: number[]; + format?: number[]; + page?: number; + limit?: number; + sort?: string; + q?: string; + status?: string; + author?: number[]; +} + +interface PostsRequestAction { + data: number[]; + query: PostsQueryParams; + total: number; +} + +type ThunkResult = ThunkAction; + +export const getPosts = ( + query: PostsQueryParams +): ThunkResult | void> => { + return ( + dispatch: Dispatch, + getState: () => RootState + ): Promise | void => { + const currentSpaceID = getState().spaces?.selected; + if (currentSpaceID === "" || currentSpaceID === "0") { + return; + } + dispatch(loadingPosts()); + + const params = new URLSearchParams(); + if (query.category && query.category.length > 0) { + query.category.forEach((each) => + params.append("category", each.toString()) + ); + } + if (query.tag && query.tag.length > 0) { + query.tag.forEach((each) => params.append("tag", each.toString())); + } + if (query.format && query.format.length > 0) { + query.format.forEach((each) => params.append("format", each.toString())); + } + if (query.page) { + params.append("page", query.page.toString()); + } + if (query.limit) { + params.append("limit", query.limit.toString()); + } + if (query.sort) { + params.append("sort", query.sort); + } + if (query.q) { + params.append("q", query.q); + } + if (query.status) { + params.append("status", query.status); + } + if (query.author) { + query.author.forEach((each) => params.append("author", each.toString())); + } + return axios + .get(POSTS_API, { + params: params, + }) + .then((response) => { + dispatch( + addAuthors( + response.data.nodes + .filter( + (post) => Array.isArray(post.authors) && post.authors.length > 0 + ) + .map((post) => { + return post.authors as Author[]; + }) + .flat(1) + ) + ); + dispatch( + addTags( + response.data.nodes + .filter( + (post) => Array.isArray(post.tags) && post.tags.length > 0 + ) + .map((post) => { + return post.tags as Tag[]; + }) + .flat(1) + ) + ); + dispatch( + addCategories( + response.data.nodes + .filter( + (post) => + Array.isArray(post.categories) && post.categories.length > 0 + ) + .map((post) => { + return post.categories as Category[]; + }) + .flat(1) + ) + ); + dispatch( + addFormats( + response.data.nodes + .filter((post) => post.format) + .map((post) => { + return post.format as Format; + }) + .flat(1) + ) + ); + dispatch( + addClaims( + response.data.nodes + .filter( + (post) => Array.isArray(post.claims) && post.claims.length > 0 + ) + .map((post) => { + return post.claims as Claim[]; + }) + .flat(1) + ) + ); + dispatch( + addMedia( + response.data.nodes + .filter((post) => post.medium) + .map((post) => { + return post.medium as Medium; + }) + ) + ); + dispatch( + addPostsList( + response.data.nodes.map((post) => { + const postWithDescription = { + ...post, + description: { + json: post.description, + html: post.description_html, + }, + categories: (post.categories as Category[]).map( + (category) => category.id + ), + tags: (post.tags as Tag[]).map((tag) => tag.id), + authors: (post.authors as Author[]).map((author) => author.id), + format: (post.format as Format).id, + claims: (post.claims as Claim[]).map((claim) => claim.id), + medium: post.medium ? (post.medium as Medium).id : undefined, + }; + return postWithDescription; + }) + ) + ); + dispatch( + addPostsRequest({ + data: response.data.nodes.map((item) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPostsLoading())); + }; +}; + +export const getPost = (id: number | string): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .get(`${POSTS_API}/${id}`) + .then((response) => { + let post = response.data; + post.description = { + json: post.description, + html: post.description_html as string, + }; + dispatch(addTags(post.tags as Tag[])); + dispatch(addAuthors(post.authors as Author[])); + dispatch(addCategories(post.categories as Category[])); + dispatch(addClaims(post.claims as Claim[])); + dispatch(addFormats([post.format as Format])); + if (post.medium) dispatch(addMedia([post.medium as Medium])); + + dispatch( + getPostByID({ + ...post, + authors: (post.authors as Author[]).map((author) => author.id), + categories: (post.categories as Category[]).map( + (category) => category.id + ), + claims: (post.claims as Claim[]).map((claim) => claim.id), + tags: (post.tags as Tag[]).map((tag) => tag.id), + format: (post.format as Format).id, + medium: post.medium ? (post.medium as Medium).id : undefined, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPostsLoading())); + }; +}; + +export const addPost = ( + data: Partial +): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .post(POSTS_API, data) + .then((response) => { + const post = response.data; + post.description = { + json: post.description, + html: post.description_html as string, + }; + dispatch(addTags(post.tags as Tag[])); + dispatch(addCategories(post.categories as Category[])); + dispatch(addAuthors(post.authors as Author[])); + dispatch(addClaims(post.claims as Claim[])); + dispatch(addFormats([post.format as Format])); + if (post.medium) dispatch(addMedia([post.medium as Medium])); + + dispatch(resetPosts()); + post.status === "publish" + ? dispatch( + addSuccessNotification( + `${(post.format as Format).name} Published` + ) + ) + : post.status === "future" + ? dispatch( + addSuccessNotification( + "Post added & Scheduled for future publish" + ) + ) + : post.status === "draft" + ? dispatch(addSuccessNotification("Post added")) + : dispatch(addSuccessNotification("Post added & Ready to Publish")); + return post; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const publish = (data: Partial): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .post(`${POSTS_API}/publish`, data) + .then((response) => { + let post = response.data; + post.description = { + json: post.description, + html: post.description_html as string, + }; + dispatch(addTags(post.tags as Tag[])); + dispatch(addCategories(post.categories as Category[])); + dispatch(addAuthors(post.authors as Author[])); + dispatch(addClaims(post.claims as Claim[])); + dispatch(addFormats([post.format as Format])); + if (post.medium) dispatch(addMedia([post.medium as Medium])); + + dispatch( + getPostByID({ + ...post, + authors: (post.authors as Author[]).map((author) => author.id), + categories: (post.categories as Category[]).map( + (category) => category.id + ), + tags: (post.tags as Tag[]).map((tag) => tag.id), + format: (post.format as Format).id, + claims: (post.claims as Claim[]).map((claim) => claim.id), + medium: post.medium ? (post.medium as Medium).id : undefined, + }) + ); + dispatch(addSuccessNotification("Post published")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPostsLoading())); + }; +}; + +export const addTemplate = ( + data: Partial +): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .post(`${POSTS_API}/templates`, data) + .then((response) => { + let post = response.data; + post.description = { + json: post.description, + html: post.description_html as string, + }; + dispatch(addTags(post.tags as Tag[])); + dispatch(addCategories(post.categories as Category[])); + dispatch(addAuthors((post.authors || []) as Author[])); + dispatch(addClaims((post.claims || []) as Claim[])); + dispatch(addFormats([post.format as Format])); + if (post.medium) dispatch(addMedia([post.medium as Medium])); + + dispatch( + getPostByID({ + ...post, + authors: + (post.authors && + (post.authors as Author[]).map((author) => author.id)) || + [], + categories: (post.categories as Category[]).map( + (category) => category.id + ), + tags: (post.tags as Tag[]).map((tag) => tag.id), + format: (post.format as Format).id, + claims: + (post.claims && + (post.claims as Claim[]).map((claim) => claim.id)) || + [], + medium: post.medium ? (post.medium as Medium).id : undefined, + }) + ); + dispatch(addSuccessNotification("Template created")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPostsLoading())); + }; +}; + +export const publishPost = (data: Post): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .put(`${POSTS_API}/${data.id}/publish`, data) + .then((response) => { + let post = response.data; + post.description = { + json: post.description, + html: post.description_html as string, + }; + dispatch(addTags(post.tags as Tag[])); + dispatch(addCategories(post.categories as Category[])); + dispatch(addAuthors(post.authors as Author[])); + dispatch(addClaims(post.claims as Claim[])); + dispatch(addFormats([post.format as Format])); + if (post.medium) dispatch(addMedia([post.medium as Medium])); + + dispatch( + getPostByID({ + ...post, + authors: (post.authors as Author[]).map((author) => author.id), + categories: (post.categories as Category[]).map( + (category) => category.id + ), + tags: (post.tags as Tag[]).map((tag) => tag.id), + format: (post.format as Format).id, + claims: (post.claims as Claim[]).map((claim) => claim.id), + medium: post.medium ? (post.medium as Medium).id : undefined, + }) + ); + dispatch(addSuccessNotification("Post published")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPostsLoading())); + }; +}; + +export const updatePost = (data: Post): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .put(`${POSTS_API}/${data.id}`, data) + .then((response) => { + let post = response.data; + post.description = { + json: post.description, + html: post.description_html as string, + }; + dispatch(addTags(post.tags as Tag[])); + dispatch(addCategories(post.categories as Category[])); + dispatch(addAuthors(post.authors as Author[])); + dispatch(addClaims(post.claims as Claim[])); + dispatch(addFormats([post.format as Format])); + if (post.medium) dispatch(addMedia([post.medium as Medium])); + + dispatch( + getPostByID({ + ...post, + authors: (post.authors as Author[]).map((author) => author.id), + categories: (post.categories as Category[]).map( + (category) => category.id + ), + tags: (post.tags as Tag[]).map((tag) => tag.id), + format: (post.format as Format).id, + claims: (post.claims as Claim[]).map((claim) => claim.id), + medium: post.medium ? (post.medium as Medium).id : undefined, + }) + ); + data.status === "publish" + ? dispatch( + addSuccessNotification( + `${(post.format as Format).name} Published` + ) + ) + : post.status === "future" + ? dispatch( + addSuccessNotification( + "Post saved & Scheduled for future publish" + ) + ) + : data.status === "draft" + ? dispatch(addSuccessNotification("Draft Saved")) + : dispatch(addSuccessNotification("Draft saved & Ready to Publish")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopPostsLoading())); + }; +}; + +export const deletePost = (id: number): ThunkResult> => { + return (dispatch: Dispatch): Promise => { + dispatch(loadingPosts()); + return axios + .delete(`${POSTS_API}/${id}`) + .then(() => { + dispatch(resetPosts()); + dispatch(addSuccessNotification("Post deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingPosts = () => ({ + type: SET_POSTS_LOADING, + payload: true, +}); + +export const stopPostsLoading = () => ({ + type: SET_POSTS_LOADING, + payload: false, +}); + +export const getPostByID = (data: Post) => ({ + type: ADD_POST, + payload: data, +}); + +export const addPostsList = (data: Post[]) => ({ + type: ADD_POSTS, + payload: data, +}); + +export const addPostsRequest = (data: PostsRequestAction) => ({ + type: ADD_POSTS_REQUEST, + payload: data, +}); + +export const resetPosts = () => ({ + type: RESET_POSTS, +}); diff --git a/studio/src/actions/profile.js b/studio/src/actions/profile.js deleted file mode 100644 index 0aca2c0f5..000000000 --- a/studio/src/actions/profile.js +++ /dev/null @@ -1,48 +0,0 @@ -import axios from 'axios'; -import { SET_PROFILE_LOADING, ADD_PROFILE, PROFILE_API } from '../constants/profile'; -import { addErrorNotification, addSuccessNotification } from './notifications'; - -export const getUserProfile = () => { - return (dispatch, getState) => { - dispatch(loadingProfile()); - return axios - .get(PROFILE_API) - .then((response) => { - dispatch(getProfile(response.data)); - dispatch(stopProfileLoading()); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }); - }; -}; -export const updateProfile = (data) => { - return (dispatch, getState) => { - dispatch(loadingProfile()); - return axios - .put(PROFILE_API, data) - .then((response) => { - dispatch(getProfile(response.data)); - dispatch(stopProfileLoading()); - dispatch(addSuccessNotification('Profile Updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }); - }; -}; - -export const loadingProfile = () => ({ - type: SET_PROFILE_LOADING, - payload: true, -}); - -export const stopProfileLoading = () => ({ - type: SET_PROFILE_LOADING, - payload: false, -}); - -export const getProfile = (data) => ({ - type: ADD_PROFILE, - payload: data, -}); diff --git a/studio/src/actions/profile.ts b/studio/src/actions/profile.ts new file mode 100644 index 000000000..88f718989 --- /dev/null +++ b/studio/src/actions/profile.ts @@ -0,0 +1,63 @@ +import axios from "axios"; +import { + SET_PROFILE_LOADING, + ADD_PROFILE, + PROFILE_API, +} from "../constants/profile"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; + +// Define interfaces +interface Profile { + [key: string]: any; +} + +interface ProfileAction { + type: string; + payload: any; +} + +export const getUserProfile = () => { + return (dispatch: (action: any) => void, getState: () => any) => { + dispatch(loadingProfile()); + return axios + .get(PROFILE_API) + .then((response) => { + dispatch(getProfile(response.data)); + dispatch(stopProfileLoading()); + }) + .catch((error) => { + dispatch(addErrorNotification(error.message)); + }); + }; +}; + +export const updateProfile = (data: Partial) => { + return (dispatch: (action: any) => void, getState: () => any) => { + dispatch(loadingProfile()); + return axios + .put(PROFILE_API, data) + .then((response) => { + dispatch(getProfile(response.data)); + dispatch(stopProfileLoading()); + dispatch(addSuccessNotification("Profile Updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(error.message)); + }); + }; +}; + +export const loadingProfile = (): ProfileAction => ({ + type: SET_PROFILE_LOADING, + payload: true, +}); + +export const stopProfileLoading = (): ProfileAction => ({ + type: SET_PROFILE_LOADING, + payload: false, +}); + +export const getProfile = (data: Profile): ProfileAction => ({ + type: ADD_PROFILE, + payload: data, +}); diff --git a/studio/src/actions/ratings.js b/studio/src/actions/ratings.js deleted file mode 100644 index a47d87de5..000000000 --- a/studio/src/actions/ratings.js +++ /dev/null @@ -1,194 +0,0 @@ -import axios from 'axios'; -import { - ADD_RATINGS, - ADD_RATINGS_REQUEST, - SET_RATINGS_LOADING, - RESET_RATINGS, - RATINGS_API, - GET_RATING, - UPDATE_RATING, -} from '../constants/ratings'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addMedia } from './media'; -import getError from '../utils/getError'; - -// action to create default ratings -export const addDefaultRatings = (query) => { - return (dispatch) => { - dispatch(loadingRatings()); - return axios - .post(RATINGS_API + '/default') - .then((response) => { - dispatch( - addRatingsList( - response.data.nodes.map((rating) => { - rating.description = { json: rating.description, html: rating.description_html }; - return { ...rating, medium: rating.medium?.id }; - }), - ), - ); - dispatch( - addRatingsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopRatingsLoading())); - }; -}; - -// action to fetch all ratings -export const getRatings = (query) => { - return (dispatch) => { - dispatch(loadingRatings()); - return axios - .get(RATINGS_API, { - params: query, - }) - .then((response) => { - dispatch( - addMedia( - response.data.nodes.filter((rating) => rating.medium).map((rating) => rating.medium), - ), - ); - dispatch( - addRatingsList( - response.data.nodes.map((rating) => { - rating.description = { json: rating.description, html: rating.description_html }; - return { ...rating, medium: rating.medium?.id }; - }), - ), - ); - dispatch( - addRatingsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopRatingsLoading())); - }; -}; - -// action to fetch rating by id -export const getRating = (id) => { - return (dispatch) => { - dispatch(loadingRatings()); - return axios - .get(RATINGS_API + '/' + id) - .then((response) => { - if (response.data.medium) dispatch(addMedia([response.data.medium])); - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch(addRating(GET_RATING, { ...response.data, medium: response.data.medium?.id })); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopRatingsLoading())); - }; -}; - -// action to create rating -export const createRating = (data) => { - return (dispatch) => { - dispatch(loadingRatings()); - return axios - .post(RATINGS_API, data) - .then(() => { - dispatch(resetRatings()); - dispatch(addSuccessNotification('Rating created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update rating by id -export const updateRating = (data) => { - return (dispatch) => { - dispatch(loadingRatings()); - return axios - .put(RATINGS_API + '/' + data.id, data) - .then((response) => { - const rating = response.data; - if (rating.medium) dispatch(addMedia([rating.medium])); - rating.description = { json: rating.description, html: rating.description_html }; - dispatch(addRating(UPDATE_RATING, { ...rating, medium: rating.medium?.id })); - dispatch(addSuccessNotification('Rating updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopRatingsLoading())); - }; -}; - -// action to delete rating by id -export const deleteRating = (id) => { - return (dispatch) => { - dispatch(loadingRatings()); - return axios - .delete(RATINGS_API + '/' + id) - .then(() => { - dispatch(resetRatings()); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const addRatings = (ratings) => { - return (dispatch) => { - dispatch(addMedia(ratings.filter((rating) => rating.medium).map((rating) => rating.medium))); - dispatch( - addRatingsList( - ratings.map((rating) => { - return { ...rating, medium: rating.medium?.id }; - }), - ), - ); - }; -}; - -export const loadingRatings = () => ({ - type: SET_RATINGS_LOADING, - payload: true, -}); - -export const stopRatingsLoading = () => ({ - type: SET_RATINGS_LOADING, - payload: false, -}); - -export const addRating = (type, payload) => ({ - type, - payload, -}); - -export const addRatingsList = (payload) => ({ - type: ADD_RATINGS, - payload, -}); - -export const addRatingsRequest = (payload) => ({ - type: ADD_RATINGS_REQUEST, - payload, -}); - -export const resetRatings = () => ({ - type: RESET_RATINGS, -}); diff --git a/studio/src/actions/ratings.ts b/studio/src/actions/ratings.ts new file mode 100644 index 000000000..6919b9975 --- /dev/null +++ b/studio/src/actions/ratings.ts @@ -0,0 +1,310 @@ +import axios from "axios"; +import { + ADD_RATINGS, + ADD_RATINGS_REQUEST, + SET_RATINGS_LOADING, + RESET_RATINGS, + RATINGS_API, + GET_RATING, + UPDATE_RATING, +} from "../constants/ratings"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addMedia } from "./media"; +import getError from "../utils/getError"; + +export interface Rating { + id: number | string; + description: any; + description_html?: string; + medium?: { + id: number; + } | null; + [key: string]: any; +} + +interface RatingTransformed { + id: number | string; + description: { + json: any; + html: string; + }; + medium?: number | null; + [key: string]: any; +} + +interface RatingsResponse { + nodes: Rating[]; + total: number; +} + +interface RatingsRequestPayload { + data: (number | string)[]; + query: any; + total: number; +} + +interface ActionWithPayload { + type: T; + payload: P; +} + +type ThunkResult = (dispatch: (action: any) => any) => R; + +// action to create default ratings +export const addDefaultRatings = (query: any): ThunkResult> => { + return (dispatch) => { + dispatch(loadingRatings()); + return axios + .post(`${RATINGS_API}/default`) + .then((response) => { + const data: RatingsResponse = response.data; + dispatch( + addRatingsList( + data.nodes.map((rating: Rating) => { + const transformedRating: RatingTransformed = { + ...rating, + description: { + json: rating.description, + html: rating.description_html || "", + }, + medium: rating.medium?.id || null, + }; + return transformedRating; + }) + ) + ); + dispatch( + addRatingsRequest({ + data: data.nodes.map((item: Rating) => item.id), + query: query, + total: data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopRatingsLoading())); + }; +}; + +// action to fetch all ratings +export const getRatings = (query: any): ThunkResult> => { + return (dispatch) => { + dispatch(loadingRatings()); + return axios + .get(RATINGS_API, { + params: query, + }) + .then((response) => { + const data: RatingsResponse = response.data; + dispatch( + addMedia( + data.nodes + .filter((rating: Rating) => rating.medium) + .map((rating: Rating) => rating.medium!) + ) + ); + dispatch( + addRatingsList( + data.nodes.map((rating: Rating) => { + const transformedRating: RatingTransformed = { + ...rating, + description: { + json: rating.description, + html: rating.description_html || "", + }, + medium: rating.medium?.id || null, + }; + return transformedRating; + }) + ) + ); + dispatch( + addRatingsRequest({ + data: data.nodes.map((item: Rating) => item.id), + query: query, + total: data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopRatingsLoading())); + }; +}; + +// action to fetch rating by id +export const getRating = (id: number | string): ThunkResult> => { + return (dispatch) => { + dispatch(loadingRatings()); + return axios + .get(`${RATINGS_API}/${id}`) + .then((response) => { + const data: Rating = response.data; + if (data.medium) dispatch(addMedia([data.medium])); + + const transformedRating: RatingTransformed = { + ...data, + description: { + json: data.description, + html: data.description_html || "", + }, + medium: data.medium?.id || null, + }; + dispatch(addRating(GET_RATING, transformedRating)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopRatingsLoading())); + }; +}; + +// action to create rating +export const createRating = ( + data: Omit +): ThunkResult> => { + return (dispatch) => { + dispatch(loadingRatings()); + return axios + .post(RATINGS_API, data) + .then(() => { + dispatch(resetRatings()); + dispatch(addSuccessNotification("Rating created")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +// action to update rating by id +export const updateRating = ( + data: RatingTransformed +): ThunkResult> => { + return (dispatch) => { + dispatch(loadingRatings()); + return axios + .put(`${RATINGS_API}/${data.id}`, data) + .then((response) => { + const rating: Rating = response.data; + if (rating.medium) dispatch(addMedia([rating.medium])); + + const transformedRating: RatingTransformed = { + ...rating, + description: { + json: rating.description, + html: rating.description_html || "", + }, + medium: rating.medium?.id || null, + }; + dispatch(addRating(UPDATE_RATING, transformedRating)); + dispatch(addSuccessNotification("Rating updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopRatingsLoading())); + }; +}; + +// Fixed deleteRating action function +export const deleteRating = ( + id: string | number +): ThunkResult> => { + return (dispatch) => { + // Validate ID to prevent NaN in URL + if (id === undefined || id === null || id === "") { + return Promise.reject(new Error("Invalid ID provided for deletion")); + } + + dispatch(loadingRatings()); + + // Use the ID as-is without conversion + const url = `${RATINGS_API}/${id}`; + + return axios + .delete(url) + .then(() => { + dispatch(resetRatings()); + dispatch(addSuccessNotification("Rating deleted successfully")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }) + .finally(() => { + dispatch(stopRatingsLoading()); + }); + }; +}; + +export const addRatings = (ratings: Rating[]): ThunkResult => { + return (dispatch) => { + dispatch( + addMedia( + ratings + .filter((rating) => rating.medium) + .map((rating) => rating.medium!) + ) + ); + dispatch( + addRatingsList( + ratings.map((rating) => { + return { + ...rating, + description: { + json: rating.description, + html: rating.description_html || "", + }, + medium: rating.medium?.id || null, + }; + }) + ) + ); + }; +}; + +export const loadingRatings = (): ActionWithPayload< + typeof SET_RATINGS_LOADING, + boolean +> => ({ + type: SET_RATINGS_LOADING, + payload: true, +}); + +export const stopRatingsLoading = (): ActionWithPayload< + typeof SET_RATINGS_LOADING, + boolean +> => ({ + type: SET_RATINGS_LOADING, + payload: false, +}); + +export const addRating = ( + type: T, + payload: RatingTransformed +): ActionWithPayload => ({ + type, + payload, +}); + +export const addRatingsList = ( + payload: RatingTransformed[] +): ActionWithPayload => ({ + type: ADD_RATINGS, + payload, +}); + +export const addRatingsRequest = ( + payload: RatingsRequestPayload +): ActionWithPayload => ({ + type: ADD_RATINGS_REQUEST, + payload, +}); + +export const resetRatings = () => ({ + type: RESET_RATINGS, +}); diff --git a/studio/src/actions/registration.js b/studio/src/actions/registration.js deleted file mode 100644 index 8a0f82121..000000000 --- a/studio/src/actions/registration.js +++ /dev/null @@ -1,138 +0,0 @@ -export const registerUser = async (registrationData) => { - try { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/users/human`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - ...registrationData, - email: { - ...registrationData.email, - sendCode: { - urlTemplate: `${window.PUBLIC_URL}/auth/verify?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}`, - }, - }, - }), - }); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message.split('(')[0].trim(); - throw new Error(errorMessage || 'Failed to register user'); - } - - return await response.json(); - } catch (error) { - console.error('Error registering user:', error); - throw error; - } -}; - -export const createSession = async (loginName) => { - try { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions`, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - checks: { - user: { - loginName, - }, - }, - }), - }); - - if (!response.ok) { - throw new Error('Failed to create session'); - } - - return await response.json(); - } catch (error) { - console.error('Error creating session:', error); - throw error; - } -}; - -export const verifyPassword = async (sessionId, sessionToken, password) => { - try { - const response = await fetch(`${window.REACT_APP_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, { - method: 'PATCH', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - }, - body: JSON.stringify({ - sessionToken: sessionToken, - checks: { - password: { - password: password, - }, - }, - }), - }); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message.split('(')[0].trim(); - throw new Error(errorMessage || 'Failed to verify password'); - } - - return await response.json(); - } catch (error) { - console.error('Error verifying password:', error); - throw error; - } -}; - -export const getAuthRequestDetails = async (authRequestId) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/oidc/auth_requests/${authRequestId}`, - { - method: 'GET', - headers: { - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - Accept: 'application/json', - }, - }, - ); - - if (!response.ok) { - throw new Error('Failed to get auth request details'); - } - - return response.json(); -}; - -export const finalizeAuthRequest = async (authRequestId, sessionId, sessionToken) => { - const response = await fetch( - `${window.REACT_APP_ZITADEL_AUTHORITY}/v2/oidc/auth_requests/${authRequestId}`, - { - method: 'POST', - headers: { - Authorization: `Bearer ${window.REACT_APP_ZITADEL_PAT}`, - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - session: { - sessionId: sessionId, - sessionToken: sessionToken, - }, - }), - }, - ); - - if (!response.ok) { - throw new Error('Failed to finalize auth request'); - } - - return response.json(); -}; diff --git a/studio/src/actions/registration.ts b/studio/src/actions/registration.ts new file mode 100644 index 000000000..32158c90b --- /dev/null +++ b/studio/src/actions/registration.ts @@ -0,0 +1,174 @@ +import { + RegistrationData, + SessionResponse, + AuthRequestResponse, + ErrorResponse, +} from "./types"; + +export const registerUser = async ( + registrationData: RegistrationData +): Promise<{ userId: string }> => { + try { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/users/human`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + ...registrationData, + email: { + ...registrationData.email, + sendCode: { + urlTemplate: `${ + import.meta.env.VITE_PUBLIC_URL + }/auth/verify?userID={{.UserID}}&code={{.Code}}&orgID={{.OrgID}}`, + }, + }, + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + const errorMessage = errorData.message.split("(")[0].trim(); + throw new Error(errorMessage || "Failed to register user"); + } + + return await response.json(); + } catch (error) { + console.error("Error registering user:", error); + throw error; + } +}; + +export const createSession = async ( + loginName: string +): Promise => { + try { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions`, + { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + checks: { + user: { + loginName, + }, + }, + }), + } + ); + + if (!response.ok) { + throw new Error("Failed to create session"); + } + + return await response.json(); + } catch (error) { + console.error("Error creating session:", error); + throw error; + } +}; + +export const verifyPassword = async ( + sessionId: string, + sessionToken: string, + password: string +): Promise => { + try { + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/v2/sessions/${sessionId}`, + { + method: "PATCH", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + }, + body: JSON.stringify({ + sessionToken, + checks: { + password: { + password, + }, + }, + }), + } + ); + + if (!response.ok) { + const errorData = (await response.json()) as ErrorResponse; + const errorMessage = errorData.message.split("(")[0].trim(); + throw new Error(errorMessage || "Failed to verify password"); + } + + return await response.json(); + } catch (error) { + console.error("Error verifying password:", error); + throw error; + } +}; + +export const getAuthRequestDetails = async ( + authRequestId: string +): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/oidc/auth_requests/${authRequestId}`, + { + method: "GET", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + Accept: "application/json", + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to get auth request details"); + } + + return response.json(); +}; + +export const finalizeAuthRequest = async ( + authRequestId: string, + sessionId: string, + sessionToken: string +): Promise => { + const response = await fetch( + `${ + import.meta.env.VITE_ZITADEL_AUTHORITY + }/v2/oidc/auth_requests/${authRequestId}`, + { + method: "POST", + headers: { + Authorization: `Bearer ${import.meta.env.VITE_ZITADEL_PAT}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + session: { + sessionId, + sessionToken, + }, + }), + } + ); + + if (!response.ok) { + throw new Error("Failed to finalize auth request"); + } + + return response.json(); +}; diff --git a/studio/src/actions/sachFactChecks.js b/studio/src/actions/sachFactChecks.js deleted file mode 100644 index 37b159af0..000000000 --- a/studio/src/actions/sachFactChecks.js +++ /dev/null @@ -1,72 +0,0 @@ -import { - SACH_FACT_CHECKS_API, - ADD_SACH_FACT_CHECKS, - SET_SACH_FACT_CHECKS_LOADING, -} from '../constants/sachFactChecks'; - -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getSachFactChecks = (reqBody, setTotalMatches, setResultStats) => { - return (dispatch) => { - dispatch(loadingSachFactChecks()); - fetch(`${window.REACT_APP_SACH_API_URL}${SACH_FACT_CHECKS_API}`, { - method: 'POST', - body: JSON.stringify(reqBody), - }) - .then((res) => { - if (res.status === 200) { - return res.json(); - } else { - throw new Error(res.status); - } - }) - .then((res) => { - dispatch(addFactChecks(res.results)); - setTotalMatches(res.total); - setResultStats(res.resultStats); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopLoading())); - }; -}; - -export const getSachFilters = (setLanguage, setPublisher, setCountries) => { - return (dispatch) => { - dispatch(loadingSachFactChecks()); - fetch(`${window.REACT_APP_SACH_API_URL}${SACH_FACT_CHECKS_API}/filters`) - .then((res) => { - if (res.status === 200) { - return res.json(); - } else { - throw new Error(res.status); - } - }) - .then((res) => { - setCountries(res.countries); - setLanguage(res.languages); - setPublisher(res.publishers); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopLoading())); - }; -}; - -export const loadingSachFactChecks = () => ({ - type: SET_SACH_FACT_CHECKS_LOADING, - payload: true, -}); - -export const stopLoading = () => ({ - type: SET_SACH_FACT_CHECKS_LOADING, - payload: false, -}); - -export const addFactChecks = (data) => ({ - type: ADD_SACH_FACT_CHECKS, - payload: data, -}); diff --git a/studio/src/actions/sachFactChecks.ts b/studio/src/actions/sachFactChecks.ts new file mode 100644 index 000000000..25e0cf005 --- /dev/null +++ b/studio/src/actions/sachFactChecks.ts @@ -0,0 +1,121 @@ +import { + SACH_FACT_CHECKS_API, + ADD_SACH_FACT_CHECKS, + SET_SACH_FACT_CHECKS_LOADING, +} from "../constants/sachFactChecks"; + +import { addErrorNotification } from "./notifications"; +import getError from "../utils/getError"; + +// Define types for our data structures +interface FactCheck { + id: string; + [key: string]: any; +} + +interface ResultStats { + [key: string]: any; +} + +interface SachResponseData { + results: FactCheck[]; + total: number; + resultStats: ResultStats; +} + +interface FiltersResponseData { + countries: string[]; + languages: string[]; + publishers: string[]; +} + +interface RequestBody { + [key: string]: any; +} + +// Action types +interface LoadingSachFactChecksAction { + type: typeof SET_SACH_FACT_CHECKS_LOADING; + payload: boolean; +} + +interface AddFactChecksAction { + type: typeof ADD_SACH_FACT_CHECKS; + payload: FactCheck[]; +} + +export type SachFactChecksActionTypes = + | LoadingSachFactChecksAction + | AddFactChecksAction; + +export const getSachFactChecks = ( + reqBody: RequestBody, + setTotalMatches: (total: number) => void, + setResultStats: (stats: ResultStats) => void +) => { + return (dispatch: (action: SachFactChecksActionTypes | any) => void) => { + dispatch(loadingSachFactChecks()); + fetch(`${import.meta.env.VITE_SACH_API_URL}${SACH_FACT_CHECKS_API}`, { + method: "POST", + body: JSON.stringify(reqBody), + }) + .then((res) => { + if (res.status === 200) { + return res.json() as Promise; + } else { + throw new Error(res.status.toString()); + } + }) + .then((res) => { + dispatch(addFactChecks(res.results)); + setTotalMatches(res.total); + setResultStats(res.resultStats); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopLoading())); + }; +}; + +export const getSachFilters = ( + setLanguage: (languages: string[]) => void, + setPublisher: (publishers: string[]) => void, + setCountries: (countries: string[]) => void +) => { + return (dispatch: (action: SachFactChecksActionTypes | any) => void) => { + dispatch(loadingSachFactChecks()); + fetch(`${import.meta.env.VITE_SACH_API_URL}${SACH_FACT_CHECKS_API}/filters`) + .then((res) => { + if (res.status === 200) { + return res.json() as Promise; + } else { + throw new Error(res.status.toString()); + } + }) + .then((res) => { + setCountries(res.countries); + setLanguage(res.languages); + setPublisher(res.publishers); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopLoading())); + }; +}; + +export const loadingSachFactChecks = (): LoadingSachFactChecksAction => ({ + type: SET_SACH_FACT_CHECKS_LOADING, + payload: true, +}); + +export const stopLoading = (): LoadingSachFactChecksAction => ({ + type: SET_SACH_FACT_CHECKS_LOADING, + payload: false, +}); + +export const addFactChecks = (data: FactCheck[]): AddFactChecksAction => ({ + type: ADD_SACH_FACT_CHECKS, + payload: data, +}); diff --git a/studio/src/actions/search.js b/studio/src/actions/search.js deleted file mode 100644 index fd0958b48..000000000 --- a/studio/src/actions/search.js +++ /dev/null @@ -1,45 +0,0 @@ -import axios from 'axios'; -import { - ADD_SEARCH_DETAIL, - SET_SEARCH_DETAILS_LOADING, - SEARCH_DETAILS_API, -} from '../constants/search'; -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getSearchDetails = (query) => { - return (dispatch, getState) => { - dispatch(loadingSearchDetails()); - - return axios - .post(SEARCH_DETAILS_API, query) - .then((response) => { - const state = getState(); - dispatch( - addSearchDetails({ - data: response.data, - formats: state.formats.details, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopLoading())); - }; -}; - -export const addSearchDetails = (data) => ({ - type: ADD_SEARCH_DETAIL, - payload: data, -}); - -export const loadingSearchDetails = () => ({ - type: SET_SEARCH_DETAILS_LOADING, - payload: true, -}); - -export const stopLoading = () => ({ - type: SET_SEARCH_DETAILS_LOADING, - payload: false, -}); diff --git a/studio/src/actions/search.ts b/studio/src/actions/search.ts new file mode 100644 index 000000000..4b9c03a61 --- /dev/null +++ b/studio/src/actions/search.ts @@ -0,0 +1,79 @@ +import axios from "axios"; +import { + ADD_SEARCH_DETAIL, + SET_SEARCH_DETAILS_LOADING, + SEARCH_DETAILS_API, +} from "../constants/search"; +import { addErrorNotification } from "./notifications"; +import getError from "../utils/getError"; +import { ThunkAction, ThunkDispatch } from "redux-thunk"; +import { AnyAction } from "redux"; + +// Define interfaces for our state and actions +interface RootState { + formats: { + details: any; + }; +} + +interface SearchDetail { + data: any; + formats: any; +} + +interface AddSearchDetailAction { + type: typeof ADD_SEARCH_DETAIL; + payload: SearchDetail; +} + +interface SetSearchDetailsLoadingAction { + type: typeof SET_SEARCH_DETAILS_LOADING; + payload: boolean; +} + +type SearchActionTypes = AddSearchDetailAction | SetSearchDetailsLoadingAction; + +// Thunk action creator +export const getSearchDetails = ( + query: any +): ThunkAction, RootState, unknown, AnyAction> => { + return async ( + dispatch: ThunkDispatch, + getState: () => RootState + ): Promise => { + dispatch(loadingSearchDetails()); + + try { + const response = await axios.post(SEARCH_DETAILS_API, query); + const state = getState(); + dispatch( + addSearchDetails({ + data: response.data, + formats: state.formats.details, + }) + ); + } catch (error) { + dispatch(addErrorNotification(getError(error))); + } finally { + dispatch(stopLoading()); + } + }; +}; + +// Action creators +export const addSearchDetails = ( + data: SearchDetail +): AddSearchDetailAction => ({ + type: ADD_SEARCH_DETAIL, + payload: data, +}); + +export const loadingSearchDetails = (): SetSearchDetailsLoadingAction => ({ + type: SET_SEARCH_DETAILS_LOADING, + payload: true, +}); + +export const stopLoading = (): SetSearchDetailsLoadingAction => ({ + type: SET_SEARCH_DETAILS_LOADING, + payload: false, +}); diff --git a/studio/src/actions/session.js b/studio/src/actions/session.js deleted file mode 100644 index ed5bfa13e..000000000 --- a/studio/src/actions/session.js +++ /dev/null @@ -1,32 +0,0 @@ -import { ADD_SESSION, SET_SESSIONS_LOADING } from '../constants/session'; -import { getUserInfo } from '../utils/zitadel'; - -export const getSession = () => { - return (dispatch) => { - dispatch(setLoading(true)); - - return getUserInfo() - .then((res) => { - if (res.error) { - return { success: false, noToken: false }; - } - dispatch(addSession(res.data)); - return { success: true, noToken: false }; - }) - .catch((error) => { - console.error('Error in getSession:', error); - return { success: false, noToken: false }; - }) - .finally(() => { - dispatch(setLoading(false)); - }); - }; -}; - -const addSession = (session) => { - return { type: ADD_SESSION, payload: session }; -}; - -const setLoading = (loading) => { - return { type: SET_SESSIONS_LOADING, payload: loading }; -}; diff --git a/studio/src/actions/session.ts b/studio/src/actions/session.ts new file mode 100644 index 000000000..590f0aa78 --- /dev/null +++ b/studio/src/actions/session.ts @@ -0,0 +1,104 @@ +import { Dispatch } from "redux"; +import { ThunkAction } from "redux-thunk"; +import { ADD_SESSION, SET_SESSIONS_LOADING } from "../constants/session"; +import { + SessionData, + AddSessionAction, + SetLoadingAction, + SessionActionTypes, + SessionResponse, + RootState, +} from "./types"; + +export interface GetSessionResponse { + success: boolean; + noToken?: boolean; +} + +export interface UserInfoResponse { + data?: any; + error?: string; +} + +// Action creators +export const getUserInfo = async (): Promise => { + try { + const token = localStorage.getItem("sessionToken"); + if (!token) { + return { error: "No session token found" }; + } + + const response = await fetch( + `${import.meta.env.VITE_ZITADEL_AUTHORITY}/oidc/v1/userinfo`, + { + method: "GET", + headers: { + Authorization: `Bearer ${token}`, + }, + credentials: "include", + } + ); + + if (response.status === 200) { + const data = await response.json(); + return { data }; + } + + return { error: `Request failed with status: ${response.status}` }; + } catch (error) { + console.error("UserInfo error:", error); + return { + error: + error instanceof Error ? error.message : "Error fetching user info", + }; + } +}; + +export const getSession = (): ThunkAction< + Promise, + RootState, + unknown, + SessionActionTypes +> => { + return async ( + dispatch: Dispatch + ): Promise => { + dispatch(setLoading(true)); + + try { + const res: UserInfoResponse = await getUserInfo(); + + if (res.error) { + return { success: false, noToken: false }; + } + + if (res.data) { + dispatch(addSession(res.data)); + return { success: true, noToken: false }; + } + + return { success: false, noToken: false }; + } catch (error) { + console.error("Error in getSession:", error); + return { success: false, noToken: false }; + } finally { + dispatch(setLoading(false)); + } + }; +}; + +const addSession = (session: SessionData): AddSessionAction => { + return { + type: ADD_SESSION, + payload: session, + }; +}; + +const setLoading = (loading: boolean): SetLoadingAction => { + return { + type: SET_SESSIONS_LOADING, + payload: loading, + }; +}; + +export type { SessionData, SessionResponse, SessionActionTypes }; \ No newline at end of file diff --git a/studio/src/actions/sidebar.js b/studio/src/actions/sidebar.js deleted file mode 100644 index c79567bfb..000000000 --- a/studio/src/actions/sidebar.js +++ /dev/null @@ -1,9 +0,0 @@ -import { SET_COLLAPSE } from '../constants/sidebar'; -export const setCollapse = (collapsed) => { - return (dispatch) => { - dispatch({ - type: SET_COLLAPSE, - payload: collapsed, - }); - }; -}; diff --git a/studio/src/actions/sidebar.ts b/studio/src/actions/sidebar.ts new file mode 100644 index 000000000..428dddc01 --- /dev/null +++ b/studio/src/actions/sidebar.ts @@ -0,0 +1,20 @@ +import { Dispatch, Action } from "redux"; +import { SET_COLLAPSE } from "../constants/sidebar"; + +// Define action interface +interface SetCollapseAction extends Action { + type: typeof SET_COLLAPSE; + payload: boolean; +} + +// Action creator +export const setCollapse = ( + collapsed: boolean +): ((dispatch: Dispatch) => void) => { + return (dispatch: Dispatch): void => { + dispatch({ + type: SET_COLLAPSE, + payload: collapsed, + }); + }; +}; diff --git a/studio/src/actions/spaceSelectorPage.js b/studio/src/actions/spaceSelectorPage.js deleted file mode 100644 index cc7de4373..000000000 --- a/studio/src/actions/spaceSelectorPage.js +++ /dev/null @@ -1,10 +0,0 @@ -import { SET_VISIBLE } from './../constants/spaceSelectorPage'; - -export const setSpaceSelectorPage = (visible) => { - return (dispatch) => { - dispatch({ - type: SET_VISIBLE, - payload: visible, - }); - }; -}; diff --git a/studio/src/actions/spaceSelectorPage.ts b/studio/src/actions/spaceSelectorPage.ts new file mode 100644 index 000000000..bb4548c0f --- /dev/null +++ b/studio/src/actions/spaceSelectorPage.ts @@ -0,0 +1,20 @@ +import { Dispatch } from "redux"; +import { SET_VISIBLE } from "../constants/spaceSelectorPage"; + +// Action interface +interface SetSpaceSelectorPageAction { + type: typeof SET_VISIBLE; + payload: boolean; +} + +// Type for all possible actions in this file +export type SpaceSelectorPageActionTypes = SetSpaceSelectorPageAction; + +export const setSpaceSelectorPage = (visible: boolean) => { + return (dispatch: Dispatch) => { + dispatch({ + type: SET_VISIBLE, + payload: visible, + }); + }; +}; diff --git a/studio/src/actions/spaceUsers.js b/studio/src/actions/spaceUsers.js deleted file mode 100644 index d78df3270..000000000 --- a/studio/src/actions/spaceUsers.js +++ /dev/null @@ -1,98 +0,0 @@ -import axios from 'axios'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { - ADD_SPACE_USERS, - ADD_SPACE_USERS_REQUEST, - SET_SPACE_USERS_LOADING, - SPACE_USERS_API, -} from '../constants/spaceUsers'; -import getError from '../utils/getError'; - -export const addSpaceUsers = (payload) => ({ - type: ADD_SPACE_USERS, - payload, -}); - -export const getSpaceUsers = (query) => { - return (dispatch) => { - dispatch(loadingSpaceUsers(true)); - return axios - .get(SPACE_USERS_API, { - params: query, - }) - .then((res) => { - dispatch(addSpaceUsers(res.data.nodes)); - dispatch( - addUsersRequest({ - data: res.data.nodes.map((item) => item.id), - query: query, - total: res.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }) - .finally(() => { - dispatch(loadingSpaceUsers(false)); - }); - }; -}; - -export const updateSpaceUsers = (data) => { - return (dispatch) => { - dispatch(loadingSpaceUsers(true)); - return axios - .put(`/core/spaces/users`, data) - .then((response) => { - dispatch(addSuccessNotification('User Added Successfully')); - return response.data; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - dispatch(loadingSpaceUsers(false)); - }); - }; -}; - -export const addSpaceUser = (data, setUser, setShowModal) => { - return (dispatch) => { - return axios - .post(SPACE_USERS_API, { - name: data.name, - description: data.description, - }) - .then((res) => { - setUser(res.data.user); - setShowModal(true); - dispatch(addSuccessNotification('User Added Successfully')); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }); - }; -}; -export const deleteSpaceUser = (id) => { - return (dispatch) => { - return axios - .delete(`${SPACE_USERS_API}/${id}`) - .then(() => { - dispatch(addSuccessNotification('User Deleted Successfully')); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }); - }; -}; - -export const loadingSpaceUsers = (payload) => ({ - type: SET_SPACE_USERS_LOADING, - payload, -}); - -export const addUsersRequest = (data) => ({ - type: ADD_SPACE_USERS_REQUEST, - payload: data, -}); diff --git a/studio/src/actions/spaceUsers.ts b/studio/src/actions/spaceUsers.ts new file mode 100644 index 000000000..74da61c9c --- /dev/null +++ b/studio/src/actions/spaceUsers.ts @@ -0,0 +1,200 @@ +import axios, { AxiosError } from "axios"; +import { Dispatch } from "redux"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { + ADD_SPACE_USERS, + ADD_SPACE_USERS_REQUEST, + SET_SPACE_USERS_LOADING, + SPACE_USERS_API, +} from "../constants/spaceUsers"; +import getError from "../utils/getError"; + +// Define interfaces for the data structures +interface SpaceUser { + id: string; + display_name: string; + email: string; + name?: string; + description?: string; + [key: string]: any; +} + +interface UsersRequestData { + data: string[]; + query: SpaceUserQuery; + total: number; +} + +interface SpaceUserQuery { + page?: number | string | null; + limit?: number | string | null; + q?: string; + [key: string]: any; +} + +interface SpaceUserData { + name: string; + description?: string; +} + +interface SpaceUserResponseData { + user: SpaceUser; + [key: string]: any; +} + +interface SpaceUsersResponseData { + nodes: SpaceUser[]; + total: number; + [key: string]: any; +} + +// Action interfaces +interface AddSpaceUsersAction { + type: typeof ADD_SPACE_USERS; + payload: SpaceUser[]; +} + +interface AddUsersRequestAction { + type: typeof ADD_SPACE_USERS_REQUEST; + payload: UsersRequestData; +} + +interface LoadingSpaceUsersAction { + type: typeof SET_SPACE_USERS_LOADING; + payload: boolean; +} + +// Type for all possible actions in this file +export type SpaceUsersActionTypes = + | AddSpaceUsersAction + | AddUsersRequestAction + | LoadingSpaceUsersAction; + +export const addSpaceUsers = (payload: SpaceUser[]): AddSpaceUsersAction => ({ + type: ADD_SPACE_USERS, + payload, +}); + +export const getSpaceUsers = (query: SpaceUserQuery) => { + return (dispatch: Dispatch) => { + const normalizedQuery = { + page: query.page?.toString() || null, + limit: query.limit?.toString() || null, + // Only include q if it's explicitly defined + ...(query.q ? { q: query.q } : {}), + }; + + dispatch(loadingSpaceUsers(true)); + return axios + .get(SPACE_USERS_API, { + params: query, + }) + .then((res) => { + // First ensure we have data + if (res.data && res.data.nodes && Array.isArray(res.data.nodes)) { + // Add users to details + dispatch(addSpaceUsers(res.data.nodes)); + + // Make sure we don't have duplicate IDs in the data array + const uniqueIds = Array.from( + new Set(res.data.nodes.map((item) => item.id)) + ); + + dispatch( + addUsersRequest({ + data: uniqueIds, + query: normalizedQuery, + total: res.data.total || 0, + }) + ); + } else { + console.warn( + "Received empty or invalid response from space users API", + res.data + ); + } + + return res.data; + }) + .catch((error: Error | AxiosError) => { + console.error("Error fetching space users:", error); + dispatch(addErrorNotification(getError(error))); + throw error; // Rethrow for error handling in components + }) + .finally(() => { + dispatch(loadingSpaceUsers(false)); + }); + }; +}; + +export const updateSpaceUsers = (data: { ids: string[] }) => { + return (dispatch: Dispatch) => { + dispatch(loadingSpaceUsers(true)); + return axios + .put("/core/spaces/users", data) + .then((response) => { + dispatch(addSuccessNotification("User(s) Added Successfully")); + const refreshParams = { page: 1, limit: 10 }; + return dispatch(getSpaceUsers(refreshParams)); + }) + .catch((error: Error | AxiosError) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }); + }; +}; + +export const addSpaceUser = ( + data: SpaceUserData, + setUser?: (user: SpaceUser) => void, + setShowModal?: (show: boolean) => void +) => { + return (dispatch: Dispatch) => { + return axios + .post(SPACE_USERS_API, { + name: data.name, + description: data.description, + }) + .then((res) => { + if (setUser) setUser(res.data.user); + if (setShowModal) setShowModal(true); + dispatch(addSuccessNotification("User(s) Added Successfully")); + return res.data.user; + }) + .catch((error: Error | AxiosError) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }); + }; +}; + +export const deleteSpaceUser = (id: string) => { + return (dispatch: Dispatch) => { + return axios + .delete(`${SPACE_USERS_API}/${id}`) + .then(() => { + dispatch(addSuccessNotification("User Deleted Successfully")); + }) + .catch((error: Error | AxiosError) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingSpaceUsers = ( + payload: boolean +): LoadingSpaceUsersAction => ({ + type: SET_SPACE_USERS_LOADING, + payload, +}); + +export const addUsersRequest = ( + data: UsersRequestData +): AddUsersRequestAction => ({ + type: ADD_SPACE_USERS_REQUEST, + payload: data, +}); + +// Add these exports for compatibility with the Selector component +export const getUsers = getSpaceUsers; +export const createUser = addSpaceUser; diff --git a/studio/src/actions/spaces.js b/studio/src/actions/spaces.js deleted file mode 100644 index 82ac719dd..000000000 --- a/studio/src/actions/spaces.js +++ /dev/null @@ -1,119 +0,0 @@ -import axios from 'axios'; -import { - GET_SPACES_SUCCESS, - ADD_SPACE_SUCCESS, - LOADING_SPACES, - API_SPACES, - SET_SELECTED_SPACE, - DELETE_SPACE_SUCCESS, - UPDATE_SPACE_SUCCESS, -} from '../constants/spaces'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getSpaces = () => { - return (dispatch) => { - dispatch(loadingSpaces(true)); - return axios - .get(API_SPACES + '/my') - .then((response) => { - dispatch(getSpacesSuccess(response.data)); - return response.data; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - dispatch(loadingSpaces(false)); - }); - }; -}; - -export const setSelectedSpace = (space) => { - return (dispatch) => { - dispatch({ - type: SET_SELECTED_SPACE, - payload: space, - }); - dispatch(addSuccessNotification('Space changed')); - }; -}; - -export const addSpace = (data) => { - return (dispatch) => { - dispatch(loadingSpaces(true)); - return axios - .post(API_SPACES, data) - .then((response) => { - dispatch(addSpaceSuccess(response.data)); - dispatch(addSuccessNotification('Space added')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - dispatch(loadingSpaces(false)); - }); - }; -}; - -export const deleteSpace = (id) => { - return (dispatch) => { - dispatch(loadingSpaces(true)); - return axios - .delete(API_SPACES) - .then(() => { - dispatch(deleteSpaceSuccess(id)); - dispatch(addSuccessNotification('Space deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - dispatch(loadingSpaces(false)); - }); - }; -}; - -export const updateSpace = (data) => { - return (dispatch) => { - dispatch(loadingSpaces(true)); - return axios - .put(API_SPACES, data) - .then((response) => { - dispatch(updateSpaceSuccess(response.data)); - dispatch(addSuccessNotification('Space updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => { - dispatch(loadingSpaces(false)); - }); - }; -}; - -export const loadingSpaces = (payload) => ({ - type: LOADING_SPACES, - payload, -}); - -export const getSpacesSuccess = (spaces) => ({ - type: GET_SPACES_SUCCESS, - payload: spaces, -}); - -export const addSpaceSuccess = (space) => ({ - type: ADD_SPACE_SUCCESS, - payload: space, -}); - -export const updateSpaceSuccess = (data) => ({ - type: UPDATE_SPACE_SUCCESS, - payload: data, -}); - -export const deleteSpaceSuccess = (id) => ({ - type: DELETE_SPACE_SUCCESS, - payload: id, -}); diff --git a/studio/src/actions/spaces.ts b/studio/src/actions/spaces.ts new file mode 100644 index 000000000..78b125663 --- /dev/null +++ b/studio/src/actions/spaces.ts @@ -0,0 +1,211 @@ +import axios from "axios"; +import { + GET_SPACES_SUCCESS, + ADD_SPACE_SUCCESS, + LOADING_SPACES, + API_SPACES, + SET_SELECTED_SPACE, + DELETE_SPACE_SUCCESS, + UPDATE_SPACE_SUCCESS, +} from "../constants/spaces"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError, { ApiError } from "../utils/getError"; +import { AppThunk } from "../store/types"; + +// Type Definitions +export interface Space { + id: string; + name: string; + slug: string; + site_title?: string; + tag_line?: string; + site_address?: string; + description?: string; + meta_fields?: string | Record; + organisation_id: string; + org_role?: string; +} + +export interface Organization { + id: string; + title: string; + role: string; + spaces: Space[]; +} + +// Action payload types +interface LoadingSpacesAction { + type: typeof LOADING_SPACES; + payload: boolean; +} + +interface GetSpacesSuccessAction { + type: typeof GET_SPACES_SUCCESS; + payload: Organization[]; +} + +interface AddSpaceSuccessAction { + type: typeof ADD_SPACE_SUCCESS; + payload: Space; +} + +interface UpdateSpaceSuccessAction { + type: typeof UPDATE_SPACE_SUCCESS; + payload: Space; +} + +interface DeleteSpaceSuccessAction { + type: typeof DELETE_SPACE_SUCCESS; + payload: string; +} + +interface SetSelectedSpaceAction { + type: typeof SET_SELECTED_SPACE; + payload: { + id: string; + }; +} + +// Union type for space actions +export type SpaceAction = + | LoadingSpacesAction + | GetSpacesSuccessAction + | AddSpaceSuccessAction + | UpdateSpaceSuccessAction + | DeleteSpaceSuccessAction + | SetSelectedSpaceAction; + +// Action creators +export const loadingSpaces = (payload: boolean): LoadingSpacesAction => ({ + type: LOADING_SPACES, + payload, +}); + +export const getSpacesSuccess = ( + organizations: Organization[] +): GetSpacesSuccessAction => ({ + type: GET_SPACES_SUCCESS, + payload: organizations, +}); + +export const addSpaceSuccess = (space: Space): AddSpaceSuccessAction => ({ + type: ADD_SPACE_SUCCESS, + payload: space, +}); + +export const updateSpaceSuccess = (data: Space): UpdateSpaceSuccessAction => ({ + type: UPDATE_SPACE_SUCCESS, + payload: data, +}); + +export const deleteSpaceSuccess = (id: string): DeleteSpaceSuccessAction => ({ + type: DELETE_SPACE_SUCCESS, + payload: id, +}); + +export const getSpaces = (): AppThunk> => { + return async (dispatch, getState) => { + // Get current state + const state = getState(); + const { spaces } = state; + + // If spaces have been fetched recently and we have data, don't fetch again + if ( + spaces && + spaces.lastFetched && + Date.now() - spaces.lastFetched < 300000 && // 5 minutes + spaces.orgs.length > 0 + ) { + // Don't fetch again if we have data less than 5 minutes old + return spaces.orgs; + } + + dispatch(loadingSpaces(true)); + try { + const response = await axios.get(`${API_SPACES}/my`); + const organizations: Organization[] = response.data; + + // Ensure we handle empty array correctly + dispatch(getSpacesSuccess(organizations || [])); + return organizations; + } catch (error) { + dispatch(addErrorNotification(getError(error as ApiError))); + // Also dispatch success with empty array to mark fetch as complete + dispatch(getSpacesSuccess([])); + return []; + } finally { + dispatch(loadingSpaces(false)); + } + }; +}; + +export const setSelectedSpace = (spaceId: string): AppThunk => { + return (dispatch) => { + localStorage.setItem("space", spaceId); + + axios.defaults.headers.common["X-Space"] = spaceId; + + dispatch({ + type: SET_SELECTED_SPACE, + payload: { + id: spaceId, + }, + }); + + dispatch(addSuccessNotification("Space changed")); + }; +}; + +export const addSpace = ( + data: Partial +): AppThunk> => { + return async (dispatch) => { + dispatch(loadingSpaces(true)); + try { + const response = await axios.post(API_SPACES, data); + dispatch(addSpaceSuccess(response.data)); + dispatch(addSuccessNotification("Space added")); + return response.data; + } catch (error) { + dispatch(addErrorNotification(getError(error as ApiError))); + throw error; + } finally { + dispatch(loadingSpaces(false)); + } + }; +}; + +export const deleteSpace = (id: string): AppThunk => { + return async (dispatch) => { + dispatch(loadingSpaces(true)); + try { + await axios.delete(`${API_SPACES}/${id}`); + dispatch(deleteSpaceSuccess(id)); + dispatch(addSuccessNotification("Space deleted")); + } catch (error) { + dispatch(addErrorNotification(getError(error as ApiError))); + throw error; + } finally { + dispatch(loadingSpaces(false)); + } + }; +}; + +export const updateSpace = ( + data: Partial & { id: string } +): AppThunk> => { + return async (dispatch) => { + dispatch(loadingSpaces(true)); + try { + const response = await axios.put(API_SPACES, data); + dispatch(updateSpaceSuccess(response.data)); + dispatch(addSuccessNotification("Space updated")); + return response.data; + } catch (error) { + dispatch(addErrorNotification(getError(error as ApiError))); + throw error; + } finally { + dispatch(loadingSpaces(false)); + } + }; +}; diff --git a/studio/src/actions/tags.js b/studio/src/actions/tags.js deleted file mode 100644 index 777d78340..000000000 --- a/studio/src/actions/tags.js +++ /dev/null @@ -1,148 +0,0 @@ -import axios from 'axios'; -import { - ADD_TAGS, - ADD_TAGS_REQUEST, - SET_TAGS_LOADING, - RESET_TAGS, - TAGS_API, - GET_TAG, - UPDATE_TAG, -} from '../constants/tags'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import getError from '../utils/getError'; - -// action to fetch tags -export const getTags = (query) => { - return (dispatch, getState) => { - const currentSpaceID = getState().spaces?.selected; - if (currentSpaceID === 0) { - return; - } - dispatch(loadingTags()); - return axios - .get(TAGS_API, { - params: query, - }) - .then((response) => { - if (response.data.nodes?.length) { - response.data.nodes.forEach((tag) => { - tag.description = { json: tag.description, html: tag.description_html }; - }); - } - dispatch(addTags(response.data.nodes)); - dispatch( - addTagsRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopTagsLoading())); - }; -}; - -// action to fetch tag by id -export const getTag = (id) => { - return (dispatch) => { - dispatch(loadingTags()); - return axios - .get(TAGS_API + '/' + id) - .then((response) => { - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch(addTag(GET_TAG, response.data)); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopTagsLoading())); - }; -}; - -// action to create tag -export const createTag = (data) => { - return (dispatch) => { - dispatch(loadingTags()); - return axios - .post(TAGS_API, data) - .then(() => { - dispatch(resetTags()); - dispatch(addSuccessNotification('Tag created')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -// action to update tag by id -export const updateTag = (data) => { - return (dispatch) => { - dispatch(loadingTags()); - return axios - .put(TAGS_API + '/' + data.id, data) - .then((response) => { - response.data.description = { - json: response.data.description, - html: response.data.description_html, - }; - dispatch(addTag(UPDATE_TAG, response.data)); - dispatch(addSuccessNotification('Tag updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopTagsLoading())); - }; -}; - -// action to delete tag by id -export const deleteTag = (id) => { - return (dispatch) => { - dispatch(loadingTags()); - return axios - .delete(TAGS_API + '/' + id) - .then(() => { - dispatch(resetTags()); - dispatch(addSuccessNotification('Tag deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingTags = () => ({ - type: SET_TAGS_LOADING, - payload: true, -}); - -export const stopTagsLoading = () => ({ - type: SET_TAGS_LOADING, - payload: false, -}); - -export const addTag = (type, payload) => ({ - type, - payload, -}); - -export const addTags = (data) => ({ - type: ADD_TAGS, - payload: data, -}); - -export const addTagsRequest = (data) => ({ - type: ADD_TAGS_REQUEST, - payload: data, -}); - -export const resetTags = () => ({ - type: RESET_TAGS, -}); diff --git a/studio/src/actions/tags.ts b/studio/src/actions/tags.ts new file mode 100644 index 000000000..f1fde74ab --- /dev/null +++ b/studio/src/actions/tags.ts @@ -0,0 +1,222 @@ +import axios from "axios"; +import { + ADD_TAGS, + ADD_TAGS_REQUEST, + SET_TAGS_LOADING, + RESET_TAGS, + TAGS_API, + GET_TAG, + UPDATE_TAG, +} from "../constants/tags"; +import { + addErrorNotification, + addSuccessNotification, + NotificationAction, +} from "./notifications"; +import getError from "../utils/getError"; +import { Dispatch, AnyAction, UnknownAction } from "redux"; +import { ThunkAction } from "redux-thunk"; +import { RootState } from "../store/index"; +import { maker } from "../utils/sluger"; + +// Define interfaces +interface Tag { + id: string | number; + name: string; + slug: string; + is_featured?: boolean; + background_colour?: any; + description_html?: string; + medium_id?: string | number; + description: + | { + json: any; + html: string; + } + | string; + meta_fields?: string | Record; + [key: string]: any; +} + +interface TagsResponse { + nodes: Tag[]; + total: number; +} + +interface TagsRequestPayload { + data: number[]; + query: any; + total: number; +} + +type AppThunk = ThunkAction< + ReturnType, + RootState, + unknown, + AnyAction | NotificationAction +>; + +// action to fetch tags +export const getTags = (query: any): AppThunk => { + return ( + dispatch: Dispatch, + getState: () => RootState + ) => { + const currentSpaceID = getState().spaces?.selected; + if (currentSpaceID === "" || currentSpaceID === "0") { + return; + } + dispatch(loadingTags()); + return axios + .get(TAGS_API, { + params: query, + }) + .then((response) => { + if (response.data.nodes?.length) { + response.data.nodes.forEach((tag) => { + tag.description = { + json: tag.description, + html: tag.description_html || "", + }; + }); + } + dispatch(addTags(response.data.nodes)); + dispatch( + addTagsRequest({ + data: response.data.nodes.map((item) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopTagsLoading())); + }; +}; + +// action to fetch tag by id +export const getTag = (id: number | string): AppThunk => { + return (dispatch: Dispatch) => { + dispatch(loadingTags()); + return axios + .get(`${TAGS_API}/${id}`) + .then((response) => { + response.data.description = { + json: response.data.description, + html: response.data.description_html || "", + }; + dispatch(addTag(GET_TAG, response.data)); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopTagsLoading())); + }; +}; + +// action to create tag +export const createTag = (data: Omit): AppThunk => { + return (dispatch: Dispatch) => { + dispatch(loadingTags()); + + const tagData = { ...data }; + + if (!tagData.slug && tagData.name) { + tagData.slug = maker(tagData.name); + } + + if (!tagData.description) { + tagData.description = { + json: {}, + html: "", + }; + } + + return axios + .post(TAGS_API, tagData) + .then((response) => { + if (response.data) { + response.data.description = { + json: response.data.description, + html: response.data.description_html || "", + }; + dispatch(addTag(GET_TAG, response.data)); + } + dispatch(resetTags()); + dispatch(addSuccessNotification("Tag created")); + return response.data; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }); + }; +}; + +// action to update tag by id +export const updateTag = (data: Tag): AppThunk => { + return (dispatch: Dispatch) => { + dispatch(loadingTags()); + return axios + .put(`${TAGS_API}/${data.id}`, data) + .then((response) => { + response.data.description = { + json: response.data.description, + html: response.data.description_html || "", + }; + dispatch(addTag(UPDATE_TAG, response.data)); + dispatch(addSuccessNotification("Tag updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopTagsLoading())); + }; +}; + +// action to delete tag by id +export const deleteTag = (id: number | string): AppThunk => { + return (dispatch: Dispatch) => { + dispatch(loadingTags()); + return axios + .delete(`${TAGS_API}/${id}`) + .then(() => { + dispatch(resetTags()); + dispatch(addSuccessNotification("Tag deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingTags = () => ({ + type: SET_TAGS_LOADING, + payload: true, +}); + +export const stopTagsLoading = () => ({ + type: SET_TAGS_LOADING, + payload: false, +}); + +export const addTag = (type: string, payload: Tag) => ({ + type, + payload, +}); + +export const addTags = (data: Tag[]) => ({ + type: ADD_TAGS, + payload: data, +}); + +export const addTagsRequest = (data: TagsRequestPayload) => ({ + type: ADD_TAGS_REQUEST, + payload: data, +}); + +export const resetTags = () => ({ + type: RESET_TAGS, +}); diff --git a/studio/src/actions/tokens.js b/studio/src/actions/tokens.js deleted file mode 100644 index f6f073e68..000000000 --- a/studio/src/actions/tokens.js +++ /dev/null @@ -1,79 +0,0 @@ -import axios from 'axios'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { - ADD_SPACE_TOKENS, - ADD_SPACE_TOKENS_REQUEST, - SET_SPACE_TOKENS_LOADING, - SPACE_TOKENS_API, -} from '../constants/tokens'; - -export const addSpaceTokens = (payload) => ({ - type: ADD_SPACE_TOKENS, - payload, -}); - -export const getSpaceTokens = (query) => { - return (dispatch) => { - dispatch(loadingSpaceTokens(true)); - return axios - .get(SPACE_TOKENS_API, { - params: query, - }) - .then((res) => { - dispatch(addSpaceTokens(res.data.nodes)); - dispatch( - addTokensRequest({ - data: res.data.nodes.map((item) => item.id), - query: query, - total: res.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }) - .finally(() => { - dispatch(loadingSpaceTokens(false)); - }); - }; -}; - -export const addSpaceToken = (data, setToken, setShowModal) => { - return (dispatch) => { - return axios - .post(SPACE_TOKENS_API, { - name: data.name, - description: data.description, - }) - .then((res) => { - setToken(res.data.token); - setShowModal(true); - dispatch(addSuccessNotification('Token Added Successfully')); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }); - }; -}; -export const deleteSpaceToken = (id) => { - return (dispatch) => { - return axios - .delete(`${SPACE_TOKENS_API}/${id}`) - .then(() => { - dispatch(addSuccessNotification('Token Deleted Successfully')); - }) - .catch((error) => { - dispatch(addErrorNotification(error.message)); - }); - }; -}; - -export const loadingSpaceTokens = (payload) => ({ - type: SET_SPACE_TOKENS_LOADING, - payload, -}); - -export const addTokensRequest = (data) => ({ - type: ADD_SPACE_TOKENS_REQUEST, - payload: data, -}); diff --git a/studio/src/actions/tokens.ts b/studio/src/actions/tokens.ts new file mode 100644 index 000000000..2120dc5fa --- /dev/null +++ b/studio/src/actions/tokens.ts @@ -0,0 +1,109 @@ +import axios from "axios"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { + ADD_SPACE_TOKENS, + ADD_SPACE_TOKENS_REQUEST, + SET_SPACE_TOKENS_LOADING, + SPACE_TOKENS_API, +} from "../constants/tokens"; + +// Define interfaces +interface TokenData { + id: string; + name: string; + description: string; + [key: string]: any; // For any additional properties +} + +interface TokenFormData { + name: string; + description: string; +} + +interface TokenAction { + type: string; + payload: any; +} + +interface TokenRequestData { + data: string[]; + query: any; + total: number; +} + +// Action creators +export const addSpaceTokens = (payload: TokenData[]): TokenAction => ({ + type: ADD_SPACE_TOKENS, + payload, +}); + +export const getSpaceTokens = (query: any) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingSpaceTokens(true)); + return axios + .get(SPACE_TOKENS_API, { + params: query, + }) + .then((res) => { + dispatch(addSpaceTokens(res.data.nodes)); + dispatch( + addTokensRequest({ + data: res.data.nodes.map((item: TokenData) => item.id), + query: query, + total: res.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(error.message)); + }) + .finally(() => { + dispatch(loadingSpaceTokens(false)); + }); + }; +}; + +export const addSpaceToken = ( + data: TokenFormData, + setToken: (token: string) => void, + setShowModal: (show: boolean) => void +) => { + return (dispatch: (action: any) => void) => { + return axios + .post(SPACE_TOKENS_API, { + name: data.name, + description: data.description, + }) + .then((res) => { + setToken(res.data.token); + setShowModal(true); + dispatch(addSuccessNotification("Token Added Successfully")); + }) + .catch((error) => { + dispatch(addErrorNotification(error.message)); + }); + }; +}; + +export const deleteSpaceToken = (id: string) => { + return (dispatch: (action: any) => void) => { + return axios + .delete(`${SPACE_TOKENS_API}/${id}`) + .then(() => { + dispatch(addSuccessNotification("Token Deleted Successfully")); + }) + .catch((error) => { + dispatch(addErrorNotification(error.message)); + }); + }; +}; + +export const loadingSpaceTokens = (payload: boolean): TokenAction => ({ + type: SET_SPACE_TOKENS_LOADING, + payload, +}); + +export const addTokensRequest = (data: TokenRequestData): TokenAction => ({ + type: ADD_SPACE_TOKENS_REQUEST, + payload: data, +}); diff --git a/studio/src/actions/types.ts b/studio/src/actions/types.ts new file mode 100644 index 000000000..eeca04516 --- /dev/null +++ b/studio/src/actions/types.ts @@ -0,0 +1,284 @@ +// User related types +export interface UserProfile { + givenName: string; + familyName: string; + displayName: string; +} + +export interface EmailData { + email: string; + isVerified: boolean; +} + +export interface IdpLink { + idpId: string; + idpExternalId?: string; + userId: string; + userName: string; +} + +export interface UserData { + email: string; + given_name: string; + family_name: string; + name: string; + email_verified: boolean; + sub: string; +} + +export interface ProviderData { + idpInformation?: { + rawInformation?: { + User?: { + sub: string; + name: string; + }; + }; + }; +} + +// Response types +export interface UserResponse { + result: Array<{ + userId: string; + details?: any; + }>; +} + +export interface SessionResponse { + success: boolean; + noToken?: boolean; + sessionId?: string; + sessionToken?: string; + details?: any; +} + +export interface ErrorResponse { + message: string; + details?: any; +} + +export interface AuthRequestResponse { + details?: any; +} + +export interface AuthRequestFinalization { + session: { + sessionId: string; + sessionToken: string; + }; +} + +export interface ProviderInformation { + idpInformation?: { + rawInformation?: { + User?: { + sub: string; + name: string; + email?: string; + given_name?: string; + family_name?: string; + email_verified?: boolean; + }; + }; + }; +} + +export interface UserDetails { + user: { + human: { + email: { + isVerified: boolean; + }; + }; + }; +} + +export interface AuthRequestResponse { + details?: any; +} + +export interface AuthRequestDetails { + id: string; + // Add other fields as needed +} + +// Registration types +export interface RegistrationData { + email: { + email: string; + isVerified?: boolean; + sendCode?: { + urlTemplate: string; + }; + }; + [key: string]: any; +} + +// Session types +export interface SessionData { + userId: string; + email: string; + [key: string]: any; +} + +export interface ExtendedSessionResponse { + success: boolean; + noToken: boolean; +} + +export interface UserInfoResponse { + error?: any; + data?: SessionData; +} + +export interface AddSessionAction { + type: "ADD_SESSION"; + payload: SessionData; +} + +export interface SetLoadingAction { + type: "SET_SESSIONS_LOADING"; + payload: boolean; +} + +export type SessionActionTypes = AddSessionAction | SetLoadingAction; + +export interface RootState { + session: SessionData; +} + +// Query related types +export interface QueryParams { + offset?: string; + limit?: number; + asc?: boolean; + [key: string]: string | number | boolean | undefined; +} + +export interface EmailQuery { + emailQuery: { + emailAddress: string; + method: string; + }; +} + +export interface UserQuery { + query: QueryParams; + queries: EmailQuery[]; +} + +export interface UserSearchResult { + result: Array<{ + userId: string; + [key: string]: any; + }>; +} + +// Request types +export interface IdpLinkRequest { + idpLink: IdpLink; +} + +export interface SessionRequest { + checks: { + user: { + userId: string; + }; + idpIntent?: { + idpIntentId: string; + idpIntentToken: string; + }; + }; +} + +export interface HumanUserRegistration { + username: string; + profile: { + givenName: string; + familyName: string; + displayName: string; + }; + email: { + email: string; + isVerified: boolean; + }; + idpLinks: Array<{ + idpId: string; + idpExternalId: string; + userId: string; + userName: string; + }>; +} + +export interface GoogleSignInRequest { + idpId: string; + urls: { + successUrl: string; + failureUrl: string; + }; +} + +export interface ApiResponse { + data?: T; + error?: string; + message?: string; +} + +// Password Reset types +export interface PasswordResetResponse { + details?: any; +} + +// Media related types +export interface Medium { + id: number; + [key: string]: any; +} + +export interface MediaResponse { + nodes: Medium[]; + total: number; +} + +// Media Action types +export interface SetMediaLoadingAction { + type: "SET_MEDIA_LOADING"; + payload: boolean; +} + +export interface AddMediaAction { + type: "ADD_MEDIA"; + payload: Medium[]; +} + +export interface AddMediaRequestAction { + type: "ADD_MEDIA_REQUEST"; + payload: { + data: number[]; + query: QueryParams; + total: number; + }; +} + +export interface GetMediumAction { + type: "GET_MEDIUM"; + payload: Medium; +} + +export interface UpdateMediumAction { + type: "UPDATE_MEDIUM"; + payload: Medium; +} + +export interface ResetMediaAction { + type: "RESET_MEDIA"; +} + +export type MediaActionTypes = + | SetMediaLoadingAction + | AddMediaAction + | AddMediaRequestAction + | GetMediumAction + | UpdateMediumAction + | ResetMediaAction; diff --git a/studio/src/actions/users.js b/studio/src/actions/users.js deleted file mode 100644 index 599daf2cf..000000000 --- a/studio/src/actions/users.js +++ /dev/null @@ -1,49 +0,0 @@ -import axios from 'axios'; -import { USERS_API, ADD_USERS_REQUEST, SET_USERS_LOADING, ADD_USERS } from '../constants/users'; -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; - -export const getUsers = (query) => { - return (dispatch) => { - dispatch(loadingUsers()); - return axios - .get(USERS_API, { - params: query, - }) - .then((response) => { - dispatch(addUsers(response.data.nodes)); - - dispatch( - addRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopLoading())); - }; -}; - -export const addUsers = (data) => ({ - type: ADD_USERS, - payload: data, -}); - -export const addRequest = (data) => ({ - type: ADD_USERS_REQUEST, - payload: data, -}); - -export const loadingUsers = () => ({ - type: SET_USERS_LOADING, - payload: true, -}); - -export const stopLoading = () => ({ - type: SET_USERS_LOADING, - payload: false, -}); diff --git a/studio/src/actions/users.ts b/studio/src/actions/users.ts new file mode 100644 index 000000000..f5b615e1c --- /dev/null +++ b/studio/src/actions/users.ts @@ -0,0 +1,98 @@ +import axios, { AxiosError } from "axios"; +import { Dispatch } from "redux"; +import { + USERS_API, + ADD_USERS_REQUEST, + SET_USERS_LOADING, + ADD_USERS, +} from "../constants/users"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import getError from "../utils/getError"; + +// Define interfaces +interface User { + id: string; + display_name?: string; + email?: string; + [key: string]: any; // For any additional properties +} + +interface UserAction { + type: string; + payload: any; +} + +interface UserRequestData { + data: string[]; + query: any; + total: number; +} + +export const getUsers = (query: any) => { + return (dispatch: Dispatch) => { + dispatch(loadingUsers()); + return axios + .get(USERS_API, { + params: query, + }) + .then((response) => { + dispatch(addUsers(response.data.nodes)); + + dispatch( + addRequest({ + data: response.data.nodes.map((item: User) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopLoading())); + }; +}; + +export const addUsers = (data: User[]): UserAction => ({ + type: ADD_USERS, + payload: data, +}); + +export const addRequest = (data: UserRequestData): UserAction => ({ + type: ADD_USERS_REQUEST, + payload: data, +}); + +export const loadingUsers = (): UserAction => ({ + type: SET_USERS_LOADING, + payload: true, +}); + +export const stopLoading = (): UserAction => ({ + type: SET_USERS_LOADING, + payload: false, +}); + +export const createUser = (data: { name: string; description?: string }) => { + return (dispatch: Dispatch) => { + return axios + .post(USERS_API, { + name: data.name, + description: data.description, + }) + .then((res) => { + if (res.data.user) { + dispatch(addUsers([res.data.user])); + } + dispatch(addSuccessNotification("User Created Successfully")); + return res.data.user; + }) + .catch((error: Error | AxiosError) => { + dispatch(addErrorNotification(getError(error))); + throw error; + }); + }; +}; + +// Alias for compatibility with the Selector component +export const addUser = createUser; diff --git a/studio/src/actions/webhooklogs.js b/studio/src/actions/webhooklogs.js deleted file mode 100644 index b5675f9e2..000000000 --- a/studio/src/actions/webhooklogs.js +++ /dev/null @@ -1,54 +0,0 @@ -import axios from 'axios'; -import { - ADD_WEBHOOKLOGS, - ADD_WEBHOOKLOGS_REQUEST, - SET_WEBHOOKLOGS_LOADING, - RESET_WEBHOOKLOGS, -} from '../constants/webhooklogs'; -import { addErrorNotification } from './notifications'; -import getError from '../utils/getError'; -import { WEBHOOKS_API } from '../constants/webhooks'; - -export const getWebhooklogs = (id, query) => { - return (dispatch) => { - dispatch(loadingWebhookLogs()); - return axios - .get(WEBHOOKS_API + '/' + id + '/logs', { - params: query, - }) - .then((response) => { - dispatch(addWebhooklogList(response.data.nodes)); - dispatch( - addWebhookRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopWebhookLogsLoading())); - }; -}; - -export const loadingWebhookLogs = () => ({ - type: SET_WEBHOOKLOGS_LOADING, - payload: true, -}); -export const stopWebhookLogsLoading = () => ({ - type: SET_WEBHOOKLOGS_LOADING, - payload: false, -}); -export const addWebhooklogList = (data) => ({ - type: ADD_WEBHOOKLOGS, - payload: data, -}); -export const addWebhookRequest = (data) => ({ - type: ADD_WEBHOOKLOGS_REQUEST, - payload: data, -}); -export const resetWebhooks = () => ({ - type: RESET_WEBHOOKLOGS, -}); diff --git a/studio/src/actions/webhooklogs.ts b/studio/src/actions/webhooklogs.ts new file mode 100644 index 000000000..6e6cd0102 --- /dev/null +++ b/studio/src/actions/webhooklogs.ts @@ -0,0 +1,78 @@ +import axios from "axios"; +import { + ADD_WEBHOOKLOGS, + ADD_WEBHOOKLOGS_REQUEST, + SET_WEBHOOKLOGS_LOADING, + RESET_WEBHOOKLOGS, +} from "../constants/webhooklogs"; +import { addErrorNotification } from "./notifications"; +import getError from "../utils/getError"; +import { WEBHOOKS_API } from "../constants/webhooks"; + +// Define interfaces +interface WebhookLog { + id: string; + [key: string]: any; // For any additional properties +} + +interface WebhookLogAction { + type: string; + payload: any; +} + +interface WebhookLogRequestData { + data: string[]; + query: any; + total: number; +} + +export const getWebhooklogs = (id: string, query: any) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingWebhookLogs()); + return axios + .get(`${WEBHOOKS_API}/${id}/logs`, { + params: query, + }) + .then((response) => { + dispatch(addWebhooklogList(response.data.nodes)); + dispatch( + addWebhookRequest({ + data: response.data.nodes.map((item: WebhookLog) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopWebhookLogsLoading())); + }; +}; + +export const loadingWebhookLogs = (): WebhookLogAction => ({ + type: SET_WEBHOOKLOGS_LOADING, + payload: true, +}); + +export const stopWebhookLogsLoading = (): WebhookLogAction => ({ + type: SET_WEBHOOKLOGS_LOADING, + payload: false, +}); + +export const addWebhooklogList = (data: WebhookLog[]): WebhookLogAction => ({ + type: ADD_WEBHOOKLOGS, + payload: data, +}); + +export const addWebhookRequest = ( + data: WebhookLogRequestData +): WebhookLogAction => ({ + type: ADD_WEBHOOKLOGS_REQUEST, + payload: data, +}); + +export const resetWebhooks = (): WebhookLogAction => ({ + type: RESET_WEBHOOKLOGS, + payload: null, +}); diff --git a/studio/src/actions/webhooks.js b/studio/src/actions/webhooks.js deleted file mode 100644 index 423a67a70..000000000 --- a/studio/src/actions/webhooks.js +++ /dev/null @@ -1,154 +0,0 @@ -import axios from 'axios'; -import { - ADD_WEBHOOK, - ADD_WEBHOOKS, - ADD_WEBHOOKS_REQUEST, - SET_WEBHOOKS_LOADING, - RESET_WEBHOOKS, - WEBHOOKS_API, -} from '../constants/webhooks'; -import { addErrorNotification, addSuccessNotification } from './notifications'; -import { addEvents } from './events'; -import getError from '../utils/getError'; - -export const getWebhooks = (query) => { - return (dispatch) => { - dispatch(loadingWebhooks()); - return axios - .get(WEBHOOKS_API, { - params: query, - }) - .then((response) => { - dispatch( - addEvents( - response.data.nodes - .filter((webhook) => webhook.events.length > 0) - .map((webhook) => { - return webhook.events; - }) - .flat(1), - ), - ); - dispatch( - addWebhookList( - response.data.nodes.map((webhook) => { - return { ...webhook, events: webhook.events.map((event) => event.id) }; - }), - ), - ); - dispatch( - addWebhookRequest({ - data: response.data.nodes.map((item) => item.id), - query: query, - total: response.data.total, - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopWebhooksLoading())); - }; -}; - -export const getWebhook = (id) => { - return (dispatch) => { - dispatch(loadingWebhooks()); - return axios - .get(WEBHOOKS_API + '/' + id) - .then((response) => { - let webhook = response.data; - dispatch(addEvents(webhook.events)); - dispatch( - getWebhookByID({ - ...webhook, - events: webhook.events.map((event) => event.id), - }), - ); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopWebhooksLoading())); - }; -}; - -export const addWebhook = (data) => { - return (dispatch) => { - dispatch(loadingWebhooks()); - return axios - .post(WEBHOOKS_API, data) - .then((response) => { - let webhook = response.data; - dispatch(addEvents(webhook.events)); - dispatch(resetWebhooks()); - dispatch(addSuccessNotification('Webhook added')); - return webhook; - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const updateWebhook = (data) => { - return (dispatch) => { - dispatch(loadingWebhooks()); - return axios - .put(WEBHOOKS_API + '/' + data.id, data) - .then((response) => { - let webhook = response.data; - dispatch(addEvents(webhook.events)); - dispatch( - getWebhookByID({ - ...webhook, - events: webhook.events.map((event) => event.id), - }), - ); - dispatch(addSuccessNotification('Webhook updated')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }) - .finally(() => dispatch(stopWebhooksLoading())); - }; -}; - -export const deleteWebhook = (id) => { - return (dispatch) => { - dispatch(loadingWebhooks()); - return axios - .delete(WEBHOOKS_API + '/' + id) - .then(() => { - dispatch(resetWebhooks()); - dispatch(addSuccessNotification('Webhook deleted')); - }) - .catch((error) => { - dispatch(addErrorNotification(getError(error))); - }); - }; -}; - -export const loadingWebhooks = () => ({ - type: SET_WEBHOOKS_LOADING, - payload: true, -}); -export const stopWebhooksLoading = () => ({ - type: SET_WEBHOOKS_LOADING, - payload: false, -}); -export const getWebhookByID = (data) => ({ - type: ADD_WEBHOOK, - payload: data, -}); -export const addWebhookList = (data) => ({ - type: ADD_WEBHOOKS, - payload: data, -}); -export const addWebhookRequest = (data) => ({ - type: ADD_WEBHOOKS_REQUEST, - payload: data, -}); -export const resetWebhooks = () => ({ - type: RESET_WEBHOOKS, -}); diff --git a/studio/src/actions/webhooks.ts b/studio/src/actions/webhooks.ts new file mode 100644 index 000000000..90de1a38f --- /dev/null +++ b/studio/src/actions/webhooks.ts @@ -0,0 +1,198 @@ +import axios from "axios"; +import { + ADD_WEBHOOK, + ADD_WEBHOOKS, + ADD_WEBHOOKS_REQUEST, + SET_WEBHOOKS_LOADING, + RESET_WEBHOOKS, + WEBHOOKS_API, +} from "../constants/webhooks"; +import { addErrorNotification, addSuccessNotification } from "./notifications"; +import { addEvents } from "./events"; +import getError from "../utils/getError"; + +// Define interfaces +interface Event { + id: string; + [key: string]: any; +} + +interface Webhook { + id: string; + events: Event[] | string[]; + [key: string]: any; +} + +interface WebhookAction { + type: string; + payload: any; +} + +interface WebhookRequestData { + data: string[]; + query: any; + total: number; +} + +const API_BASE_URL = import.meta.env.VITE_API_URL; +const API_PATH = WEBHOOKS_API; + +export const getWebhooks = (query: any) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingWebhooks()); + return axios + .get(`${API_BASE_URL}${API_PATH}`, { + params: query, + }) + .then((response) => { + dispatch( + addEvents( + response.data.nodes + .filter( + (webhook: Webhook) => + Array.isArray(webhook.events) && webhook.events.length > 0 + ) + .map((webhook: Webhook) => { + return webhook.events; + }) + .flat(1) + ) + ); + dispatch( + addWebhookList( + response.data.nodes.map((webhook: Webhook) => { + return { + ...webhook, + events: Array.isArray(webhook.events) + ? (webhook.events as Event[]).map((event: Event) => event.id) + : webhook.events, + }; + }) + ) + ); + dispatch( + addWebhookRequest({ + data: response.data.nodes.map((item: Webhook) => item.id), + query: query, + total: response.data.total, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopWebhooksLoading())); + }; +}; + +export const getWebhook = (id: string) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingWebhooks()); + return axios + .get(`${API_BASE_URL}${API_PATH}/${id}`) + .then((response) => { + const webhook: Webhook = response.data; + dispatch(addEvents(webhook.events as Event[])); + dispatch( + getWebhookByID({ + ...webhook, + events: Array.isArray(webhook.events) + ? (webhook.events as Event[]).map((event: Event) => event.id) + : webhook.events, + }) + ); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopWebhooksLoading())); + }; +}; + +export const addWebhook = (data: Omit) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingWebhooks()); + return axios + .post(`${API_BASE_URL}${API_PATH}`, data) + .then((response) => { + const webhook: Webhook = response.data; + dispatch(addEvents(webhook.events as Event[])); + dispatch(resetWebhooks()); + dispatch(addSuccessNotification("Webhook added")); + return webhook; + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const updateWebhook = (data: Webhook) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingWebhooks()); + return axios + .put(`${API_BASE_URL}${API_PATH}/${data.id}`, data) + .then((response) => { + const webhook: Webhook = response.data; + dispatch(addEvents(webhook.events as Event[])); + dispatch( + getWebhookByID({ + ...webhook, + events: Array.isArray(webhook.events) + ? (webhook.events as Event[]).map((event: Event) => event.id) + : webhook.events, + }) + ); + dispatch(addSuccessNotification("Webhook updated")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }) + .finally(() => dispatch(stopWebhooksLoading())); + }; +}; + +export const deleteWebhook = (id: string) => { + return (dispatch: (action: any) => void) => { + dispatch(loadingWebhooks()); + return axios + .delete(`${API_BASE_URL}${API_PATH}/${id}`) + .then(() => { + dispatch(resetWebhooks()); + dispatch(addSuccessNotification("Webhook deleted")); + }) + .catch((error) => { + dispatch(addErrorNotification(getError(error))); + }); + }; +}; + +export const loadingWebhooks = (): WebhookAction => ({ + type: SET_WEBHOOKS_LOADING, + payload: true, +}); + +export const stopWebhooksLoading = (): WebhookAction => ({ + type: SET_WEBHOOKS_LOADING, + payload: false, +}); + +export const getWebhookByID = (data: Webhook): WebhookAction => ({ + type: ADD_WEBHOOK, + payload: data, +}); + +export const addWebhookList = (data: Webhook[]): WebhookAction => ({ + type: ADD_WEBHOOKS, + payload: data, +}); + +export const addWebhookRequest = (data: WebhookRequestData): WebhookAction => ({ + type: ADD_WEBHOOKS_REQUEST, + payload: data, +}); + +export const resetWebhooks = (): WebhookAction => ({ + type: RESET_WEBHOOKS, + payload: [], +}); diff --git a/studio/src/assets/MenuIcon.jsx b/studio/src/assets/MenuIcon.jsx deleted file mode 100644 index e98c7f063..000000000 --- a/studio/src/assets/MenuIcon.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -function MenuIcon() { - return ( - - - - ); -} - -export default MenuIcon; diff --git a/studio/src/assets/QuickEditIcon.jsx b/studio/src/assets/QuickEditIcon.jsx deleted file mode 100644 index cb01e618c..000000000 --- a/studio/src/assets/QuickEditIcon.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -function QuickEditIcon() { - return ( - - - - ); -} - -export default QuickEditIcon; diff --git a/studio/src/assets/SearchIcon.jsx b/studio/src/assets/SearchIcon.jsx deleted file mode 100644 index d92ac22e3..000000000 --- a/studio/src/assets/SearchIcon.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -function SearchIcon() { - return ( - - - - ); -} - -export default SearchIcon; diff --git a/studio/src/assets/ThreeDotIcon.jsx b/studio/src/assets/ThreeDotIcon.jsx deleted file mode 100644 index 2ccf0b9f7..000000000 --- a/studio/src/assets/ThreeDotIcon.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -function ThreeEditIcon({ color = '#858585' }) { - return ( - - - - - - ); -} - -export default ThreeEditIcon; diff --git a/studio/src/assets/bindu_icon.png b/studio/src/assets/bindu_icon.png deleted file mode 100644 index c8615ecae..000000000 Binary files a/studio/src/assets/bindu_icon.png and /dev/null differ diff --git a/studio/src/assets/dega-short.png b/studio/src/assets/dega-short.png new file mode 100644 index 000000000..2740cebbb Binary files /dev/null and b/studio/src/assets/dega-short.png differ diff --git a/studio/src/assets/dega.png b/studio/src/assets/dega.png index 447ef549a..e509e3658 100644 Binary files a/studio/src/assets/dega.png and b/studio/src/assets/dega.png differ diff --git a/studio/src/assets/dega_icon.png b/studio/src/assets/dega_icon.png deleted file mode 100644 index 447ef549a..000000000 Binary files a/studio/src/assets/dega_icon.png and /dev/null differ diff --git a/studio/src/assets/google-icon.svg b/studio/src/assets/google-icon.svg new file mode 100644 index 000000000..2c1d41959 --- /dev/null +++ b/studio/src/assets/google-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/studio/src/assets/kavach_icon.png b/studio/src/assets/kavach_icon.png deleted file mode 100644 index 20a1d2b0e..000000000 Binary files a/studio/src/assets/kavach_icon.png and /dev/null differ diff --git a/studio/src/assets/lock.png b/studio/src/assets/lock.png new file mode 100644 index 000000000..40386e501 Binary files /dev/null and b/studio/src/assets/lock.png differ diff --git a/studio/src/assets/logo.png b/studio/src/assets/logo.png deleted file mode 100644 index c49df8b99..000000000 Binary files a/studio/src/assets/logo.png and /dev/null differ diff --git a/studio/src/assets/logo.svg b/studio/src/assets/logo.svg deleted file mode 100644 index 29e29c66d..000000000 --- a/studio/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ -Group 28 Copy 5Created with Sketch. diff --git a/studio/src/assets/menu.svg b/studio/src/assets/menu.svg new file mode 100644 index 000000000..b833b3859 --- /dev/null +++ b/studio/src/assets/menu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/studio/src/assets/vidcheck_icon.png b/studio/src/assets/vidcheck_icon.png deleted file mode 100644 index db0e72bb6..000000000 Binary files a/studio/src/assets/vidcheck_icon.png and /dev/null differ diff --git a/studio/src/components/AdminRoute/index.js b/studio/src/components/AdminRoute/index.js deleted file mode 100644 index 2b8dbe744..000000000 --- a/studio/src/components/AdminRoute/index.js +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { Result, Button } from 'antd'; -import { useSelector } from 'react-redux'; - -function AdminRoute({ component: Component, ...rest }) { - const { loading, org, isOwner } = useSelector(({ admin, spaces }) => { - let orgs = spaces.orgs.filter((each) => each.role === 'admin'); - - return { - loading: false, - org: admin.organisation, - isOwner: orgs.length > 0, - }; - }); - - if (loading) { - return () => null; - } - - if (!loading && !org) - return ( - - ); - - if (!loading && org.is_admin && isOwner) { - return ; - } - - return ( - - - - } - /> - ); -} - -export default AdminRoute; diff --git a/studio/src/components/AuthWrapper.tsx b/studio/src/components/AuthWrapper.tsx new file mode 100644 index 000000000..65ebce085 --- /dev/null +++ b/studio/src/components/AuthWrapper.tsx @@ -0,0 +1,152 @@ +import React, { useEffect, ReactNode, useCallback } from "react"; +import { useDispatch } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { getSession } from "../actions/session"; +import { login, getToken } from "../utils/zitadel"; +import { addErrorNotification } from "../actions/notifications"; +import { ThunkDispatch } from "redux-thunk"; +import { AnyAction } from "redux"; + +// Type definitions +interface AuthWrapperProps { + children: ReactNode; +} + +// List of public paths that don't require authentication +const publicPaths: string[] = [ + "/auth/login", + "/auth/registration", + "/auth/login/recovery", + "/redirect", + "/auth/verify", + "/callback", +]; + +const AuthWrapper: React.FC = ({ children }) => { + const dispatch = useDispatch>(); + const location = useLocation(); + + const isPublicPath = (path: string): boolean => { + return publicPaths.some((publicPath) => path.includes(publicPath)); + }; + + // Handle callback with auth code + const handleCallback = useCallback(async (): Promise => { + // Check if we're in a callback situation with an authorization code + const searchParams = new URLSearchParams(window.location.search); + const code = searchParams.get("code"); + const state = searchParams.get("state"); + + if (code) { + try { + const tokenResponse = await getToken(code, state); + + if (tokenResponse.error) { + dispatch( + addErrorNotification({ + message: `Token exchange error: ${tokenResponse.error}`, + }) + ); + return false; + } + + // Token exchange successful, redirect to return_to if available + const returnTo = localStorage.getItem("return_to"); + if (returnTo) { + localStorage.removeItem("return_to"); + window.location.href = returnTo; + return true; + } + + return true; + } catch (error) { + console.error("Token exchange error:", error); + dispatch( + addErrorNotification({ + message: "Failed to exchange authorization code for token", + }) + ); + return false; + } + } + + return false; + }, [dispatch]); + + const checkAuthenticated = useCallback(async (): Promise => { + try { + // First check if we're handling a callback with code + const isHandlingCallback = await handleCallback(); + if (isHandlingCallback) { + // If we're handling a callback, we don't need to continue with the rest of the authentication check + return; + } + + const res = await dispatch(getSession()); + + if (!res.success) { + // If there's no token or authentication failed + if (!res.noToken) { + const currentURL = window.location.href; + const searchParams = new URLSearchParams(window.location.search); + const authRequest = searchParams.get("authRequest"); + + // If current path is public and has authRequest, allow access + if ( + isPublicPath(currentURL) && + (currentURL.includes("/redirect") || authRequest) + ) { + return; + } + + // Store the return URL for post-login redirect + if (!isPublicPath(location.pathname)) { + window.localStorage.setItem("return_to", window.location.href); + } + + const loginResponse = await login(); + + if (loginResponse.error) { + dispatch( + addErrorNotification({ + message: loginResponse.error, + }) + ); + return; + } + + if (loginResponse.authorizeURL) { + window.location.href = loginResponse.authorizeURL; + } else { + dispatch( + addErrorNotification({ + message: "No authorize URL returned", + }) + ); + } + } + } + } catch (error) { + console.error("Authentication check failed:", error); + dispatch( + addErrorNotification({ + message: "Authentication check failed", + }) + ); + + // Redirect to login page on error + if (!isPublicPath(location.pathname)) { + window.location.href = "/auth/login"; + } + } + }, [dispatch, location.pathname, handleCallback]); + + useEffect(() => { + void checkAuthenticated(); + }, [checkAuthenticated]); + + // Return children directly rather than wrapping in a fragment + return children; +}; + +export default AuthWrapper; diff --git a/studio/src/components/Authwrapper.js b/studio/src/components/Authwrapper.js deleted file mode 100644 index 6b70cd4f4..000000000 --- a/studio/src/components/Authwrapper.js +++ /dev/null @@ -1,65 +0,0 @@ -import React, { useEffect } from 'react'; -import { useDispatch } from 'react-redux'; -import { getSession } from '../actions/session'; -import { login } from '../utils/zitadel'; -import { addErrorNotification } from '../actions/notifications'; -import { useLocation } from 'react-router-dom'; - -const AuthWrapper = ({ children }) => { - const dispatch = useDispatch(); - const location = useLocation(); - - // List of public paths that don't require authentication - const publicPaths = [ - '/auth/login', - '/auth/registration', - '/auth/login/recovery', - '/redirect', - '/auth/verify', - ]; - - useEffect(() => { - checkAuthenticated(); - }, [location.pathname]); - - const isPublicPath = (path) => { - return publicPaths.some((publicPath) => path.includes(publicPath)); - }; - - const checkAuthenticated = () => { - dispatch(getSession()).then((res) => { - if (!res.success) { - // If there's no token or authentication failed - if (!res.noToken) { - const currentURL = window.location.href; - const searchParams = new URLSearchParams(window.location.search); - const authRequest = searchParams.get('authRequest'); - - // If current path is public and has authRequest, allow access - if (isPublicPath(currentURL) && (currentURL.includes('/redirect') || authRequest)) { - return; - } - - // Store the return URL for post-login redirect - if (!isPublicPath(location.pathname)) { - window.localStorage.setItem('return_to', window.location.href); - } - - login().then((d) => { - if (d.error) { - dispatch( - addErrorNotification({ - message: d.error, - }), - ); - return; - } - window.location.href = d.authorizeURL; - }); - } - } - }); - }; - return <>{children}; -}; -export default AuthWrapper; diff --git a/studio/src/components/Breadcrumb.tsx b/studio/src/components/Breadcrumb.tsx new file mode 100644 index 000000000..63d6947ca --- /dev/null +++ b/studio/src/components/Breadcrumb.tsx @@ -0,0 +1,12 @@ +function Breadcrumb({ path, page }) { + return ( +
+

+ {path} +

+

{page}

+
+ ); +} + +export default Breadcrumb; diff --git a/studio/src/components/Editor/Embed.js b/studio/src/components/Editor/Embed.js deleted file mode 100644 index 615d5b493..000000000 --- a/studio/src/components/Editor/Embed.js +++ /dev/null @@ -1,271 +0,0 @@ -import axios from 'axios'; -import './embed.css'; -import { make } from './utils'; - -export default class Embed { - constructor({ data, api, readOnly }) { - this.api = api; - this._data = {}; - this.readOnly = readOnly; - this.nodes = { - wrapper: null, - container: null, - progress: null, - input: null, - inputHolder: null, - caption: null, - captionHolder: null, - }; - - this.data = data; - } - - static get toolbox() { - return { - title: 'Embed', - icon: - '', - }; - } - - set data(data) { - if (!(data instanceof Object)) { - throw Error('Embed Tool data should be object'); - } - - const { html, meta, caption } = data; - - this._data = { - html: html || this.data.html, - meta: meta || this.data.meta, - caption: caption || this.data.caption || '', - }; - } - - get data() { - return this._data; - } - - render() { - this.nodes.wrapper = make('div', this.CSS.baseClass); - this.nodes.container = make('div', this.CSS.container); - - this.nodes.inputHolder = this.makeInputHolder(); - this.nodes.captionHolder = this.makeCaptionHolder(); - - /** - * If Tool already has data, render link preview, otherwise insert input - */ - if (this.data.html) { - const { html } = this.data; - // this.nodes.container.innerHTML = html; - this.setInnerHTML(this.nodes.container, html); - this.nodes.container.appendChild(this.nodes.captionHolder); - } else { - this.nodes.container.appendChild(this.nodes.inputHolder); - } - this.nodes.wrapper.appendChild(this.nodes.container); - - return this.nodes.wrapper; - } - - get CSS() { - return { - baseClass: this.api.styles.block, - input: this.api.styles.input, - - /** - * Tool's classes - */ - container: 'embed-tool', - inputEl: 'embed-tool__input', - captionEl: 'embed-tool__caption', - inputHolder: 'embed-tool__input-holder', - captionHolder: 'embed-tool__caption-holder', - inputError: 'embed-tool__input-holder--error', - progress: 'embed-tool__progress', - progressLoading: 'embed-tool__progress--loading', - progressLoaded: 'embed-tool__progress--loaded', - }; - } - makeInputHolder() { - const inputHolder = make('div', this.CSS.inputHolder); - - this.nodes.progress = make('label', this.CSS.progress); - this.nodes.input = make('div', [this.CSS.input, this.CSS.inputEl], { - contentEditable: !this.readOnly, - }); - - this.nodes.input.dataset.placeholder = this.api.i18n.t( - "Paste your Link here or type and press 'Enter'", - ); - - if (!this.readOnly) { - this.nodes.input.addEventListener('paste', (event) => { - this.startFetching(event); - }); - - this.nodes.input.addEventListener('keydown', (event) => { - const [ENTER, A] = [13, 65]; - const cmdPressed = event.ctrlKey || event.metaKey; - - switch (event.keyCode) { - case ENTER: - event.preventDefault(); - event.stopPropagation(); - - this.startFetching(event); - break; - case A: - if (cmdPressed) { - this.selectLinkUrl(event); - } - break; - default: - break; - } - }); - } - - inputHolder.appendChild(this.nodes.progress); - inputHolder.appendChild(this.nodes.input); - - return inputHolder; - } - makeCaptionHolder() { - const captionHolder = make('div', this.CSS.captionHolder); - - this.nodes.caption = make('div', [this.CSS.input, this.CSS.captionEl], { - contentEditable: !this.readOnly, - innerHTML: this.data.caption, - }); - this.nodes.caption.dataset.placeholder = 'Caption'; - - captionHolder.appendChild(this.nodes.caption); - - return captionHolder; - } - - startFetching(event) { - let url = this.nodes.input.textContent; - - if (event.type === 'paste') { - url = (event.clipboardData || window.clipboardData).getData('text'); - } - - this.removeErrorStyle(); - this.fetchLinkData(url); - } - removeErrorStyle() { - this.nodes.inputHolder.classList.remove(this.CSS.inputError); - this.nodes.inputHolder.insertBefore(this.nodes.progress, this.nodes.input); - } - selectLinkUrl(event) { - event.preventDefault(); - event.stopPropagation(); - - const selection = window.getSelection(); - const range = new Range(); - - const currentNode = selection.anchorNode.parentNode; - const currentItem = currentNode.closest(`.${this.CSS.inputHolder}`); - const inputElement = currentItem.querySelector(`.${this.CSS.inputEl}`); - - range.selectNodeContents(inputElement); - - selection.removeAllRanges(); - selection.addRange(range); - } - showProgress() { - this.nodes.progress.classList.add(this.CSS.progressLoading); - } - hideProgress() { - return new Promise((resolve) => { - this.nodes.progress.classList.remove(this.CSS.progressLoading); - this.nodes.progress.classList.add(this.CSS.progressLoaded); - - setTimeout(resolve, 500); - }); - } - applyErrorStyle() { - this.nodes.inputHolder.classList.add(this.CSS.inputError); - this.nodes.progress.remove(); - } - async fetchLinkData(url) { - this.showProgress(); - try { - const response = await axios.get('/meta', { - params: { url, type: 'iframely' }, - }); - this.onFetch(response); - } catch (error) { - this.fetchingFailed(this.api.i18n.t("Couldn't fetch the link data")); - } - } - onFetch(response) { - if (!response) { - this.fetchingFailed(this.api.i18n.t("Couldn't get this link data, try the other one")); - - return; - } - - const metaData = response.data.meta; - const html = response.data.html; - - this.data = { - ...response.data, - }; - if (!metaData) { - this.fetchingFailed(this.api.i18n.t("Couldn't get meta data from the server")); - - return; - } - if (!html) { - this.fetchingFailed(this.api.i18n.t("Couldn't get html data from the server")); - - return; - } - - this.hideProgress().then(() => { - this.nodes.inputHolder.remove(); - // this.nodes.container.innerHTML = html; - this.setInnerHTML(this.nodes.container, html); - this.nodes.container.appendChild(this.nodes.captionHolder); - return this.nodes.container; - }); - } - fetchingFailed(errorMessage) { - this.api.notifier.show({ - message: errorMessage, - style: 'error', - }); - - this.applyErrorStyle(); - } - save() { - const caption = this.nodes.captionHolder.querySelector(`.${this.CSS.captionEl}`); - return { ...this.data, caption: caption.innerHTML }; - } - - static get isReadOnlySupported() { - return true; - } - - static get sanitize() { - return { - html: true, // Allow HTML tags - }; - } - - setInnerHTML(elm, html) { - elm.innerHTML = html; - Array.from(elm.querySelectorAll('script')).forEach((oldScript) => { - const newScript = document.createElement('script'); - Array.from(oldScript.attributes).forEach((attr) => - newScript.setAttribute(attr.name, attr.value), - ); - newScript.appendChild(document.createTextNode(oldScript.innerHTML)); - oldScript.parentNode.replaceChild(newScript, oldScript); - }); - } -} diff --git a/studio/src/components/Editor/Tunes.js b/studio/src/components/Editor/Tunes.js deleted file mode 100644 index 363691d5e..000000000 --- a/studio/src/components/Editor/Tunes.js +++ /dev/null @@ -1,118 +0,0 @@ -import { make } from './utils'; -export default class Tunes { - /** - * @param {object} tune - image tool Tunes managers - * @param {object} tune.api - Editor API - * @param {object} tune.actions - list of user defined tunes - * @param {Function} tune.onChange - tune toggling callback - */ - constructor({ api, actions, onChange }) { - this.api = api; - this.actions = actions; - this.onChange = onChange; - this.buttons = []; - } - - /** - * Available Image tunes - * - * @returns {{name: string, icon: string, title: string}[]} - */ - static get tunes() { - return [ - { - name: 'withBorder', - icon: - '', - title: 'With border', - }, - { - name: 'stretched', - icon: - '', - title: 'Stretch image', - }, - { - name: 'withBackground', - icon: - '', - title: 'With background', - }, - ]; - } - - /** - * Styles - * - * @returns {{wrapper: string, buttonBase: *, button: string, buttonActive: *}} - */ - get CSS() { - return { - wrapper: '', - buttonBase: this.api.styles.settingsButton, - button: 'image-tool__tune', - buttonActive: this.api.styles.settingsButtonActive, - }; - } - - /** - * Makes buttons with tunes: add background, add border, stretch image - * - * @param {ImageToolData} toolData - generate Elements of tunes - * @returns {Element} - */ - render(toolData) { - const wrapper = make('div', this.CSS.wrapper); - - this.buttons = []; - - const tunes = Tunes.tunes.concat(this.actions); - tunes.forEach((tune) => { - if (tune) { - const title = this.api.i18n.t(tune.title); - const el = make('div', [this.CSS.buttonBase, this.CSS.button], { - innerHTML: tune.icon, - title, - }); - - el.addEventListener('click', () => { - this.tuneClicked(tune.name, tune.action); - }); - - el.dataset.tune = tune.name; - el.classList.toggle(this.CSS.buttonActive, !!toolData[tune.name]); - - this.buttons.push(el); - - this.api.tooltip.onHover(el, title, { - placement: 'top', - }); - - wrapper.appendChild(el); - } - }); - - return wrapper; - } - - /** - * Clicks to one of the tunes - * - * @param {string} tuneName - clicked tune name - * @param {Function} customFunction - function to execute on click - */ - tuneClicked(tuneName, customFunction) { - if (typeof customFunction === 'function') { - if (!customFunction(tuneName)) { - return false; - } - } - - const button = this.buttons.find((el) => el.dataset.tune === tuneName); - button.classList.toggle( - this.CSS.buttonActive, - !button.classList.contains(this.CSS.buttonActive), - ); - this.onChange(tuneName); - } -} diff --git a/studio/src/components/Editor/UppyUploader.js b/studio/src/components/Editor/UppyUploader.js deleted file mode 100644 index 7b647f66a..000000000 --- a/studio/src/components/Editor/UppyUploader.js +++ /dev/null @@ -1,460 +0,0 @@ -import React from 'react'; -import { MEDIA_API } from '../../constants/media'; -import '@uppy/core/dist/style.css'; -import '@uppy/dashboard/dist/style.css'; -import '@uppy/url/dist/style.css'; -// import 'antd/dist/antd.css'; -import { Empty } from 'antd'; -import ReactDOMServer from 'react-dom/server'; -import Tunes from './Tunes'; -import { make } from './utils'; - -const Uppy = require('@uppy/core'); -const Dashboard = require('@uppy/dashboard'); -const GoogleDrive = require('@uppy/google-drive'); -const Url = require('@uppy/url'); -const AwsS3 = require('@uppy/aws-s3'); -const axios = require('axios'); - -const style = { - imgContainer: 'border-radius: 3px; overflow: hidden; margin-bottom:10px;', - img: 'max-width: 100%; vertical-align:bottom; display:block;', - container: { - stretched: ' ', - withBackground: 'padding: 15px; background: white;', - withBorder: 'border: 1px solid #e8e8eb;', - }, - withBorder: '', - withBackground: 'max-width:60%; margin:0 auto;', - stretched: 'width:100%;', -}; - -class UppyUploader { - constructor({ data, api, config }) { - this.config = config; - this.data = data; - this.nodes = {}; - this.blockIndex = api.blocks.getCurrentBlockIndex(); - this.api = api; - this.query = { - page: 1, - limit: 8, - }; - - this.tunes = new Tunes({ - api, - actions: this.config.actions, - onChange: (tuneName) => this.tuneToggled(tuneName), - }); - Tunes.tunes.forEach(({ name: tune }) => { - const value = - typeof data[tune] !== 'undefined' ? data[tune] === true || data[tune] === 'true' : false; - this.setTune(tune, value); - }); - this.total = 0; - this.mediaData = []; - this.nodes.wrapper = document.createElement('div'); - this.nodes.wrapper.setAttribute('style', style.imgContainer); - this.nodes.wrapper.id = 'Uploader-' + this.blockIndex; - - var uploader = document.createElement('div'); - uploader.id = 'DashboardContainer-' + this.blockIndex; - - var image = document.createElement('img'); - image.setAttribute('style', style.img); - image.id = 'Image-' + this.blockIndex; - - this.nodes.wrapper.appendChild(image); - if (!this.data.url) { - this.getMediaList(this.query); - this.createRadioButtons(); - } - this.nodes.wrapper.appendChild(uploader); - } - - tuneToggled(tuneName) { - Tunes.tunes.forEach(({ name: tune }) => { - if (this.data[tune] === true && tune !== tuneName) { - this.data[tune] = false; - const button = this.tunes.buttons.find((el) => el.dataset.tune === tune); - button.classList.toggle( - this.tunes.CSS.buttonActive, - !button.classList.contains(this.tunes.CSS.buttonActive), - ); - } - }); - this.setTune(tuneName, !this.data[tuneName]); - } - setTune(tuneName, value) { - this.data[tuneName] = value; - this.applyTune(tuneName, value); - if (tuneName === 'stretched') { - /** - * Wait until the API is ready - */ - Promise.resolve() - .then(() => { - const blockId = this.api.blocks.getCurrentBlockIndex(); - - this.api.blocks.stretchBlock(blockId, value); - }) - .catch((err) => { - console.error(err); - }); - } - } - applyTune(tuneName, status) { - if (document.getElementById(`Image-${this.blockIndex}`) && status === false) { - document.getElementById(`Image-${this.blockIndex}`).setAttribute('style', style.img); - document - .getElementById(`Uploader-${this.blockIndex}`) - .setAttribute('style', style.imgContainer); - } - if (document.getElementById(`Image-${this.blockIndex}`) && status) { - document - .getElementById(`Image-${this.blockIndex}`) - .setAttribute('style', `${style.img} ${style[tuneName]}`); - document - .getElementById(`Uploader-${this.blockIndex}`) - .setAttribute('style', `${style.imgContainer} ${style.container[tuneName]}`); - } - } - renderSettings() { - return this.tunes.render(this.data); - } - createRadioButtons() { - const radioGroup = make('div', ['ant-radio-group', 'ant-radio-group-solid'], { - style: 'margin-bottom: 8px;width:750px;margin-left:8px', - }); - const list = make('input', 'ant-radio-button-input', { - type: 'radio', - id: 'opt1', - value: 'list', - name: 'tabOption', - checked: true, - }); - const label1 = make('label', ['ant-radio-button-wrapper', 'ant-radio-button-wrapper-checked']); - const label2 = make('label', 'ant-radio-button-wrapper'); - const uploader = make('input', 'ant-radio-button-input', { - type: 'radio', - id: 'opt2', - value: 'uploader', - name: 'tabOption', - }); - const searchInput = make('input', 'ant-input', { - placeholder: 'Search Media', - style: 'margin-bottom: 8px;margin-top: 8px', - type: 'text', - id: 'searchBar', - }); - searchInput.addEventListener('input', (e) => { - if (e.target.value) { - const newQuery = { ...this.query, q: e.target.value }; - this.getMediaList(newQuery); - } else { - this.getMediaList(this.query); - } - }); - list.addEventListener('click', (event) => { - label2.className = 'ant-radio-button-wrapper'; - label1.className = 'ant-radio-button-wrapper ant-radio-button-wrapper-checked'; - document - .getElementById('searchBar') - .setAttribute('style', 'margin-bottom: 8px;margin-top: 8px'); - this.getMediaList(this.query); - }); - label1.innerHTML = 'List'; - uploader.addEventListener('click', (event) => { - label1.className = 'ant-radio-button-wrapper'; - label2.className = 'ant-radio-button-wrapper ant-radio-button-wrapper-checked'; - document.getElementById('searchBar').setAttribute('style', 'display : none'); - this.getDashboard(); - }); - label2.innerHTML = 'Upload'; - label1.appendChild(list); - label2.appendChild(uploader); - radioGroup.appendChild(label1); - radioGroup.appendChild(label2); - radioGroup.appendChild(searchInput); - this.nodes.wrapper.appendChild(radioGroup); - } - static get toolbox() { - return { - title: 'Image', - icon: - '', - }; - } - render() { - if (this.data.url) { - Tunes.tunes.forEach(({ name: tune }) => { - if (this.data[tune] === true) { - this.nodes.wrapper.setAttribute( - 'style', - `${style.imgContainer} ${style.container[tune]}`, - ); - this.nodes.wrapper.children[0].setAttribute('style', `${style.img} ${style[tune]}`); - } - }); - this.nodes.wrapper.children[0].src = this.data.url?.[ - window.REACT_APP_ENABLE_IMGPROXY ? 'proxy' : 'raw' - ]; - } - return this.nodes.wrapper; - } - - handlePaginationButtonCLick(value, query) { - const newQuery = { - page: query.page + value, - limit: 8, - }; - this.getMediaList(newQuery); - } - - createPagniation(query, total) { - function paginationClick(current, obj) { - const newQuery = { - page: current, - limit: 8, - }; - obj.getMediaList(newQuery); - } - - const ul = make('ul', 'ant-pagination', { style: 'margin-bottom:8px' }); - ul.unselectable = 'unselectable'; - const previous = make('li', 'ant-pagination-prev'); - const prevButton = make('button', 'ant-pagination-item-link', { type: 'button' }); - prevButton.tabindex = '-1'; - previous.addEventListener('click', () => { - if (query.page > 1) { - this.handlePaginationButtonCLick(-1, query); - } - }); - if (query.page <= 1) { - prevButton.disabled = true; - previous.className = 'ant-pagination-prev ant-pagination-disabled'; - } - prevButton.innerHTML = - ' '; - previous.appendChild(prevButton); - ul.appendChild(previous); - - const last = Math.ceil(total / query.limit); - for (var i = 1; i <= last; i++) { - (function (query, obj) { - const li = document.createElement('li'); - let liClassName = 'ant-pagination-item ant-pagination-item-' + 'i'; - if (i === query.page) { - liClassName = liClassName + ' ant-pagination-item-active'; - } - li.className = liClassName; - li.title = i; - li.innerHTML = i; - var current = i; - li.addEventListener( - 'click', - function () { - paginationClick(current, obj); - }, - false, - ); - ul.appendChild(li); - })(query, this); - } - const next = make('li', 'ant-pagination-next'); - const nextButton = make('button', 'ant-pagination-item-link', { type: 'button' }); - nextButton.addEventListener('click', () => { - if (query.page < last) { - this.handlePaginationButtonCLick(1, query); - } - }); - if (query.page >= last) { - nextButton.disabled = true; - next.className = 'ant-pagination-next ant-pagination-disabled'; - } - nextButton.innerHTML = - ''; - nextButton.tabindex = '-1'; - next.appendChild(nextButton); - ul.appendChild(next); - return ul; - } - - createDisplayList(data, query, total) { - function handleClick(imageDetails, obj) { - obj.data = imageDetails; - obj.nodes.wrapper.children[0].src = - imageDetails.url?.[window.REACT_APP_ENABLE_IMGPROXY ? 'proxy' : 'raw']; - obj.nodes.wrapper.children[2].style.display = 'none'; - obj.nodes.wrapper.children[1].style.display = 'none'; - } - const listDiv = make('div', ['ant-list', 'ant-list-split', 'ant-list-grid'], { - style: 'width:750px', - id: 'DashboardContainer-' + this.blockIndex, - }); - const rowDiv = make('div', 'ant-row', { - style: 'margin-left:-18px;margin-right:-18px', - }); - - for (var i = 0; i < data.length; i++) { - (function (obj) { - const image = document.createElement('img'); - image.src = data[i].url?.[window.REACT_APP_ENABLE_IMGPROXY ? 'proxy' : 'raw']; - image.height = '154'; - image.width = '154'; - var imageDetails = data[i]; - image.addEventListener( - 'click', - function () { - handleClick(imageDetails, obj); - }, - false, - ); - - const columnDiv = document.createElement('div'); - columnDiv.className = 'ant-col'; - columnDiv.setAttribute('style', 'padding-left:18px;padding-right:18px;flex:1 1 auto'); - - const imageDiv = document.createElement('div'); - imageDiv.className = 'ant-list-item'; - imageDiv.appendChild(image); - - const newDiv = document.createElement('div'); - newDiv.setAttribute('style', 'width:25%;max-width:25%'); - - columnDiv.appendChild(imageDiv); - newDiv.appendChild(columnDiv); - rowDiv.appendChild(newDiv); - })(this); - } - listDiv.appendChild(rowDiv); - listDiv.appendChild(this.createPagniation(query, total)); - listDiv.setAttribute('style', 'margin-left:8px'); - this.nodes.wrapper.replaceChild(listDiv, this.nodes.wrapper.children[2]); - } - getEmptyDataComponent() { - const noDataFound = ReactDOMServer.renderToString( - , - ); - const emptyDataDiv = make('div', null, { - id: 'DashboardContainer-' + this.blockIndex, - }); - emptyDataDiv.innerHTML = noDataFound; - this.nodes.wrapper.replaceChild(emptyDataDiv, this.nodes.wrapper.children[2]); - } - - getMediaList(query) { - axios - .get(MEDIA_API, { - params: query, - }) - .then((response) => { - if (response.data.nodes.length < 1) { - this.getEmptyDataComponent(); - } else { - this.mediaData = response.data.nodes; - this.total = response.data.total; - this.createDisplayList(response.data.nodes, query, response.data.total); - } - }); - } - - getDashboard() { - if (!this.data.url) { - const uppy = new Uppy({ - debug: true, - autoProceed: true, - restrictions: { - maxNumberOfFiles: 1, - minNumberOfFiles: 1, - allowedFileTypes: ['image/*'], - }, - onBeforeUpload: (files) => { - const updatedFiles = {}; - Object.keys(files).forEach((fileID) => { - updatedFiles[fileID] = { - ...files[fileID], - fileName: files[fileID].meta.name, - meta: { - ...files[fileID].meta, - name: - this.config.space_slug + - '/' + - new Date().getFullYear() + - '/' + - new Date().getMonth() + - '/' + - Date.now().toString() + - '_' + - files[fileID].meta.name, - }, - }; - }); - return updatedFiles; - }, - }) - .use(Dashboard, { - trigger: '.UppyModalOpenerBtn', - inline: true, - target: '#' + this.nodes.wrapper.children[2].id, - replaceTargetContent: true, - showProgressDetails: true, - height: 470, - browserBackButtonClose: true, - }) - .use(GoogleDrive, { target: Dashboard, companionUrl: window.REACT_APP_COMPANION_URL }) - .use(Url, { target: Dashboard, companionUrl: window.REACT_APP_COMPANION_URL }) - .use(AwsS3, { companionUrl: window.REACT_APP_COMPANION_URL }); - uppy.on('file-added', (file) => { - const data = file.data; - const url = data.thumbnail ? data.thumbnail : URL.createObjectURL(data); - const image = new Image(); - image.src = url; - image.onload = () => { - uppy.setFileMeta(file.id, { width: image.width, height: image.height }); - URL.revokeObjectURL(url); - }; - image.onerror = () => { - URL.revokeObjectURL(url); - }; - }); - uppy.on('complete', (result) => { - const successful = result.successful[0]; - const { meta } = successful; - const upload = {}; - upload['alt_text'] = meta.caption; - upload['caption'] = meta.caption; - upload['description'] = meta.caption; - upload['dimensions'] = `${meta.width}x${meta.height}`; - upload['file_size'] = successful.size; - upload['name'] = successful.fileName; - upload['slug'] = successful.response.body.key; - upload['title'] = meta.caption ? meta.caption : ' '; - upload['type'] = successful.meta.type; - upload['url'] = {}; - upload['url']['raw'] = successful.uploadURL; - axios - .post(MEDIA_API, [upload]) - .then((res) => { - this.data = res.data.nodes[0]; - this.nodes.wrapper.children[2].style.display = 'none'; - this.nodes.wrapper.children[1].style.display = 'none'; - this.nodes.wrapper.children[0].src = this.data.url?.[ - window.REACT_APP_ENABLE_IMGPROXY ? 'proxy' : 'raw' - ]; - }) - .catch((error) => { - this.api.notifier.show({ - message: error.message, - style: 'error', - }); - }); - }); - } - } - save() { - return this.data; - } -} - -export default UppyUploader; diff --git a/studio/src/components/Editor/embed.css b/studio/src/components/Editor/embed.css deleted file mode 100644 index e90821a77..000000000 --- a/studio/src/components/Editor/embed.css +++ /dev/null @@ -1,94 +0,0 @@ -.embed-tool { - position: relative; - margin: 1rem 0; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} -.embed-tool__input { - padding-left: 38px; - background-image: url("data:image/svg+xml,%3Csvg width='13' height='14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.567 13.629c.728.464 1.581.65 2.41.558l-.873.873A3.722 3.722 0 1 1 4.84 9.794L6.694 7.94a3.722 3.722 0 0 1 5.256-.008L10.484 9.4a5.209 5.209 0 0 1-.017.016 1.625 1.625 0 0 0-2.29.009l-1.854 1.854a1.626 1.626 0 0 0 2.244 2.35zm2.766-7.358a3.722 3.722 0 0 0-2.41-.558l.873-.873a3.722 3.722 0 1 1 5.264 5.266l-1.854 1.854a3.722 3.722 0 0 1-5.256.008L9.416 10.5a5.2 5.2 0 0 1 .017-.016 1.625 1.625 0 0 0 2.29-.009l1.854-1.854a1.626 1.626 0 0 0-2.244-2.35z' fill='rgba(0, 0, 0, 0.6)' transform='translate(-3.667 -2.7)'/%3E%3C/svg%3E%0A"); - background-repeat: no-repeat; - background-position: 15px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.embed-tool__input-holder { - position: relative; - width: 100%; -} -.embed-tool__caption-holder { - margin-top: 1rem; - width: 100%; - font-size: 0.75rem; -} -.embed-tool__caption { - padding-left: 39px; - background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 32 32' width='14' height='14' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:%23101820;%7D%3C/style%3E%3C/defs%3E%3Ctitle/%3E%3Cg data-name='Layer 42' id='Layer_42'%3E%3Cpath class='cls-1' d='M2,29a1,1,0,0,1-1-1.11l.77-7a1,1,0,0,1,.29-.59L18.42,3.94a3.2,3.2,0,0,1,4.53,0l3.11,3.11a3.2,3.2,0,0,1,0,4.53L9.71,27.93a1,1,0,0,1-.59.29l-7,.77Zm7-1.78H9ZM3.73,21.45l-.6,5.42,5.42-.6,16.1-16.1a1.2,1.2,0,0,0,0-1.7L21.53,5.35a1.2,1.2,0,0,0-1.7,0Z'/%3E%3Cpath class='cls-1' d='M23,14.21a1,1,0,0,1-.71-.29L16.08,7.69A1,1,0,0,1,17.5,6.27l6.23,6.23a1,1,0,0,1,0,1.42A1,1,0,0,1,23,14.21Z'/%3E%3Crect class='cls-1' height='2' transform='translate(-8.31 14.13) rotate(-45)' width='11.01' x='7.39' y='16.1'/%3E%3Cpath class='cls-1' d='M30,29H14a1,1,0,0,1,0-2H30a1,1,0,0,1,0,2Z'/%3E%3C/g%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: 15px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.embed-tool__input-holder--error .embed-tool__input { - background-image: url("data:image/svg+xml,%3Csvg width='13' height='14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.567 13.629c.728.464 1.581.65 2.41.558l-.873.873A3.722 3.722 0 1 1 4.84 9.794L6.694 7.94a3.722 3.722 0 0 1 5.256-.008L10.484 9.4a5.209 5.209 0 0 1-.017.016 1.625 1.625 0 0 0-2.29.009l-1.854 1.854a1.626 1.626 0 0 0 2.244 2.35zm2.766-7.358a3.722 3.722 0 0 0-2.41-.558l.873-.873a3.722 3.722 0 1 1 5.264 5.266l-1.854 1.854a3.722 3.722 0 0 1-5.256.008L9.416 10.5a5.2 5.2 0 0 1 .017-.016 1.625 1.625 0 0 0 2.29-.009l1.854-1.854a1.626 1.626 0 0 0-2.244-2.35z' fill='rgb(224, 147, 147)' transform='translate(-3.667 -2.7)'/%3E%3C/svg%3E%0A"); - background-color: #fff3f6; - border-color: #f3e0e0; - color: #a95a5a; - box-shadow: inset 0 1px 3px 0 rgba(146, 62, 62, 0.05); -} - -.embed-tool__input[contentEditable='true'][data-placeholder]::before, -.embed-tool__caption[contentEditable='true'][data-placeholder]::before { - position: absolute; - content: attr(data-placeholder); - color: #707684; - font-weight: normal; - opacity: 0; -} - -.embed-tool__input[contentEditable='true'][data-placeholder]:empty::before, -.embed-tool__caption[contentEditable='true'][data-placeholder]:empty::before { - opacity: 1; -} - -.embed-tool__input[contentEditable='true'][data-placeholder]:empty:focus::before, -.embed-tool__caption[contentEditable='true'][data-placeholder]:empty:focus::before { - opacity: 0; -} - -.embed-tool__progress { - position: absolute; - box-shadow: inset 0 1px 3px 0 rgba(102, 85, 107, 0.04); - height: 100%; - width: 0; - background-color: #f4f5f7; - z-index: -1; -} - -.embed-tool__progress.embed-tool__progress--loading { - animation: progress 500ms ease-in; - animation-fill-mode: forwards; -} - -.embed-tool__progress--loaded { - width: 100%; -} - -/* .codex-editor--narrow .embed-tool__image { - display: none; -} */ - -@keyframes progress { - 0% { - width: 0; - } - 100% { - width: 85%; - } -} diff --git a/studio/src/components/Editor/index.css b/studio/src/components/Editor/index.css deleted file mode 100644 index 9707d613f..000000000 --- a/studio/src/components/Editor/index.css +++ /dev/null @@ -1,55 +0,0 @@ -.ce-inline-toolbar, -.ce-conversion-toolbar.ce-conversion-toolbar--showed { - background: linear-gradient(to bottom, rgba(49, 49, 47, 0.99), #262625); - background-repeat: repeat-x; - color: white; - border: none; - box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; -} -.ce-conversion-toolbar__label { - color: #fff; -} - -.cdx-marker { - background: rgba(12, 235, 160, 0.9); -} - -.ce-inline-toolbar svg, -.ce-inline-tool .icon { - width: 1.5rem; - height: 1.5rem; - padding: 0.25rem; -} -.ce-inline-tool-input.ce-inline-tool-input--showed { - min-width: 350px; - - color: #fff; - background: linear-gradient(to bottom, rgba(49, 49, 47, 0.99), #262625); -} -.ce-inline-tool-input::placeholder { - color: #fff; -} -.ce-inline-tool { - color: white; -} -.ce-inline-toolbar__dropdown, -.ce-inline-tool { - padding: 0.375rem; -} - -.ce-inline-toolbar__dropdown:hover, -.ce-inline-tool:hover, -.ce-conversion-tool:hover, -.ce-conversion-tool.ce-conversion-tool--focused { - background: #757575; -} -.ce-conversion-tool.ce-conversion-tool--focused { - box-shadow: none !important; - background: #757575 !important; -} -.ce-conversion-tool__icon { - color: black; -} -.codex-editor { - word-spacing: 5px; -} diff --git a/studio/src/components/Editor/index.js b/studio/src/components/Editor/index.js deleted file mode 100644 index 38d2fbe30..000000000 --- a/studio/src/components/Editor/index.js +++ /dev/null @@ -1,113 +0,0 @@ -import React from 'react'; -import EditorJS from '@editorjs/editorjs'; -import Header from '@editorjs/header'; -import List from '@editorjs/list'; -import Paragraph from '@editorjs/paragraph'; -import Quote from '@editorjs/quote'; -import RawTool from '@editorjs/raw'; -import Table from '@editorjs/table'; -import UppyUploader from './UppyUploader'; -import Marker from '@editorjs/marker'; -import CodeTool from '@editorjs/code'; -import Delimiter from '@editorjs/delimiter'; -import InlineCode from '@editorjs/inline-code'; -import { useSelector } from 'react-redux'; -import Embed from './Embed'; -import './index.css'; - -function Editor({ - value, - onChange, - style, - basic = false, - placeholder = 'Begin writing your post...', -}) { - const editor_block = React.useRef(null); - const space_slug = useSelector((state) => { - return state.spaces.details[state.spaces.selected]?.slug; - }); - const basicTools = { - header: { - class: Header, - inlineToolbar: true, - shortcut: 'CMD+OPTION+1', - }, - list: { - class: List, - inlineToolbar: true, - shortcut: 'CMD+OPTION+6', - }, - paragraph: { - class: Paragraph, - inlineToolbar: true, - shortcut: 'CMD+OPTION+0', - }, - quote: { - class: Quote, - inlineToolbar: true, - shortcut: 'CMD+OPTION+O', - }, - }; - const editorTools = { - ...basicTools, - raw: { - class: RawTool, - shortcut: 'CMD+OPTION+R', - }, - table: { - class: Table, - shortcut: 'CMD+OPTION+T', - }, - code: { - class: CodeTool, - shortcut: 'CMD+OPTION+8', - }, - delimiter: { - class: Delimiter, - }, - inlineCode: { - class: InlineCode, - shortcut: 'CMD+E', - }, - marker: { - class: Marker, - shortcut: 'CMD+OPTION+H', - }, - embed: { - class: Embed, - shortcut: 'CMD+OPTION+E', - }, - uppy: { - class: UppyUploader, - config: { - space_slug: space_slug, - }, - }, - }; - - React.useEffect(() => { - const editor = new EditorJS({ - holder: editor_block.current, - placeholder: placeholder, - tools: basic ? basicTools : editorTools, - onChange: (value) => - value.saver.save().then((value) => { - onChange(value); - }), - data: value, - }); - // return () => - // editor.isReady.then(() => { - // editor.destroy(); - // if (document.querySelectorAll('.ct')) { - // document.querySelectorAll('.ct').forEach((e) => e.remove()); - // } - // return; - // }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return
; -} - -export default Editor; diff --git a/studio/src/components/Editor/utils.js b/studio/src/components/Editor/utils.js deleted file mode 100644 index 90cae6833..000000000 --- a/studio/src/components/Editor/utils.js +++ /dev/null @@ -1,15 +0,0 @@ -export const make = function make(tagName, classNames = null, attributes = {}) { - const el = document.createElement(tagName); - - if (Array.isArray(classNames)) { - el.classList.add(...classNames); - } else if (classNames) { - el.classList.add(classNames); - } - - for (const attrName in attributes) { - el[attrName] = attributes[attrName]; - } - - return el; -}; diff --git a/studio/src/components/EmptyState/index.tsx b/studio/src/components/EmptyState/index.tsx new file mode 100644 index 000000000..aa14859ae --- /dev/null +++ b/studio/src/components/EmptyState/index.tsx @@ -0,0 +1,95 @@ +import React, { ReactNode } from "react"; +import { FolderOpen, PlusCircle } from "lucide-react"; +import { Link } from "react-router-dom"; +import { Button } from "@/components/ui/button"; + +// Map of content types to their respective icons +const CONTENT_ICONS = { + default: FolderOpen, +}; + +export type ContentType = keyof typeof CONTENT_ICONS | string; + +interface EmptyStateProps { + contentType?: ContentType; + title?: string; + description?: string; + actionText?: string; + actionLink?: string; + isMobile?: boolean; + customIcon?: ReactNode; + onActionClick?: () => void; +} + +const EmptyState: React.FC = ({ + contentType = "default", + title, + description, + actionText, + actionLink, + isMobile = false, + customIcon, + onActionClick, +}) => { + // Default texts based on content type + const defaultTitle = `No ${contentType} found`; + const defaultDescription = `Create your first ${contentType + .replace(/ies$/, "y") + .replace(/s$/, "")} to get started`; + const defaultActionText = `Create ${contentType + .replace(/ies$/, "y") + .replace(/s$/, "")}`; + + // Get the icon component based on content type + const IconComponent = + CONTENT_ICONS[contentType as keyof typeof CONTENT_ICONS] || + CONTENT_ICONS.default; + + // Button handler - only rendered if actionLink or onActionClick is provided + const renderAction = () => { + if (onActionClick) { + return ( + + ); + } else if (actionLink) { + return ( + + + + ); + } + return null; + }; + + return ( +
+
+ {customIcon || ( + + )} +
+

+ {title || defaultTitle} +

+

+ {description || defaultDescription} +

+ {(actionLink || onActionClick) && renderAction()} +
+ ); +}; + +export default EmptyState; diff --git a/studio/src/components/ErrorsAndImage/PageNotFound.tsx b/studio/src/components/ErrorsAndImage/PageNotFound.tsx new file mode 100644 index 000000000..0ee58ebd9 --- /dev/null +++ b/studio/src/components/ErrorsAndImage/PageNotFound.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import RecordNotFound from "./RecordNotFound"; + +const NotFoundPage: React.FC = () => { + return ( + + ); +}; + +export default NotFoundPage; diff --git a/studio/src/components/ErrorsAndImage/PlaceholderImage.js b/studio/src/components/ErrorsAndImage/PlaceholderImage.js deleted file mode 100644 index 834b614a1..000000000 --- a/studio/src/components/ErrorsAndImage/PlaceholderImage.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import placeholderImg from './placeholderImage.svg'; -function PlaceholderImage({ width, height, maxWidth }) { - return ( - <> - - - ); -} - -PlaceholderImage.defaultProps = { - height: 'auto', - width: '100%', -}; - -export default PlaceholderImage; diff --git a/studio/src/components/ErrorsAndImage/PlaceholderImage.tsx b/studio/src/components/ErrorsAndImage/PlaceholderImage.tsx new file mode 100644 index 000000000..5f760e094 --- /dev/null +++ b/studio/src/components/ErrorsAndImage/PlaceholderImage.tsx @@ -0,0 +1,26 @@ +import placeholderImg from './placeholderImage.svg'; + +interface PlaceholderImageProps { + width?: string | number; + height?: string | number; + maxWidth?: string | number; +} + +function PlaceholderImage({ + width = '100%', + height = 'auto', + maxWidth = '240px' +}: PlaceholderImageProps) { + return ( + placeholder + ); +} + +export default PlaceholderImage; \ No newline at end of file diff --git a/studio/src/components/ErrorsAndImage/RecordNotFound.js b/studio/src/components/ErrorsAndImage/RecordNotFound.js deleted file mode 100644 index b4d7deb54..000000000 --- a/studio/src/components/ErrorsAndImage/RecordNotFound.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; -import { Result, Button } from 'antd'; -import { Link } from 'react-router-dom'; - -function RecordNotFound({ status, title, link, entity }) { - return ( - - - - ) : null - } - /> - ); -} - -export default RecordNotFound; diff --git a/studio/src/components/ErrorsAndImage/RecordNotFound.tsx b/studio/src/components/ErrorsAndImage/RecordNotFound.tsx new file mode 100644 index 000000000..4fbea7cbd --- /dev/null +++ b/studio/src/components/ErrorsAndImage/RecordNotFound.tsx @@ -0,0 +1,49 @@ +import React from "react"; +import { Link } from "react-router-dom"; +import { AlertCircle } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardFooter } from "@/components/ui/card"; + +interface RecordNotFoundProps { + status?: string; + title?: string; + link?: string; + entity?: string; + isReturnHome?: boolean; +} + +const RecordNotFound: React.FC = ({ + status = "404", + title = "Sorry, could not find what you are looking for.", + link, + entity = "Format", + isReturnHome = false, +}) => { + return ( + + +
+
+
+ +
+
+
+
{status}
+

{title}

+
+ + + {link ? ( + + + + ) : null} + +
+ ); +}; + +export default RecordNotFound; diff --git a/studio/src/components/ErrorsAndImage/placeholderImage.svg b/studio/src/components/ErrorsAndImage/placeholderImage.svg index e6f4adef0..b60491176 100644 --- a/studio/src/components/ErrorsAndImage/placeholderImage.svg +++ b/studio/src/components/ErrorsAndImage/placeholderImage.svg @@ -1,34 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + \ No newline at end of file diff --git a/studio/src/components/FiltersPopover.tsx b/studio/src/components/FiltersPopover.tsx new file mode 100644 index 000000000..e5205ab72 --- /dev/null +++ b/studio/src/components/FiltersPopover.tsx @@ -0,0 +1,112 @@ +import { Filter } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { Form, FormField, FormItem, FormLabel } from "@/components/ui/form"; +import Selector from "./Selector"; +import { useIsMobile } from "@/hooks/use-mobile"; + +export interface FiltersPopoverProps { + form: any; + isOpen?: boolean; + setIsOpen?: (open: boolean) => void; + onSave: (values: T) => void; + hasActiveFilters?: boolean; +} + +const FiltersPopover = >({ + form, + isOpen, + setIsOpen, + onSave, + hasActiveFilters, +}: FiltersPopoverProps) => { + const isMobile = useIsMobile(); + + return ( + + + Filters + + + +
+

Filters

+
+
+ ( + + Tags + + + )} + /> + + ( + + Categories + + + )} + /> + + ( + + Authors + + + )} + /> + + +
+
+
+
+ + ); +}; + +export default FiltersPopover; diff --git a/studio/src/components/FormItems/DescriptionInput.js b/studio/src/components/FormItems/DescriptionInput.js deleted file mode 100644 index be4f48072..000000000 --- a/studio/src/components/FormItems/DescriptionInput.js +++ /dev/null @@ -1,172 +0,0 @@ -import React from 'react'; -import { Form } from 'antd'; -import axios from 'axios'; -import { RATINGS_API } from '../../constants/ratings'; -import { CLAIMANTS_API } from '../../constants/claimants'; -import { CLAIMS_API } from '../../constants/claims'; -import { ScooterCore as Editor } from '@factly/scooter-core'; -import { MEDIA_API } from '../../constants/media'; -import { useSelector } from 'react-redux'; -import { FactCheck } from '@factly/scooter-claim'; -import { Image } from '@factly/scooter-image'; -import { Embed } from '@factly/scooter-embed'; -import { ScooterTable } from '@factly/scooter-table'; -import { CodeBlock } from '@factly/scooter-code-block'; - -const DescriptionInput = ({ - name = 'description', - label = 'Description', - noLabel = false, - onChange = () => {}, - inputProps, - formItemProps, - initialValue, - rows, -}) => { - const space_slug = useSelector((state) => { - return state.spaces.details[state.spaces.selected]?.slug; - }); - inputProps = { ...inputProps, onChange }; - formItemProps = noLabel ? formItemProps : { ...formItemProps, label }; - - return ( - - {/* */} - { - return axios - .get(RATINGS_API, { - params: { page: page, limit: 10 }, - }) - .then((res) => { - return res.data; - }); - }, - claimantsFetcher: (page = 1) => { - return axios - .get(CLAIMANTS_API, { - params: { page: page, limit: 10 }, - }) - .then((res) => { - return res.data; - }); - }, - claimsFetcher: (searchTerm, page = 1, limit = 10, sort = 'desc') => { - const params = new URLSearchParams(); - params.append('q', searchTerm); - params.append('page', page); - params.append('limit', limit); - params.append('sort', sort); - return axios.get(CLAIMS_API, { params: params }).then((res) => { - return res.data; - }); - }, - addClaim: (values) => { - function convertIdsToNumbers(obj) { - for (const key in obj) { - if (obj.hasOwnProperty(key)) { - if (!isNaN(obj[key])) { - obj[key] = Number(obj[key]); - } - } - } - return obj; - } - return axios.post(CLAIMS_API, convertIdsToNumbers(values)).then((res) => { - return res.data; - }); - }, - }} - imagesFetcher={(currentPage) => - axios - .get(MEDIA_API, { - params: { page: currentPage, limit: 12 }, - }) - .then((res) => res.data) - } - onFileAdded={(file) => { - const data = file.data; - const url = data.thumbnail ? data.thumbnail : URL.createObjectURL(data); - const image = document.createElement('img'); - image.src = url; - image.onload = () => { - // uppy.setFileMeta(file.id, { width: image.width, height: image.height }); - URL.revokeObjectURL(url); - }; - image.onerror = () => { - URL.revokeObjectURL(url); - }; - }} - onUploadComplete={(result) => { - const successful = result.successful[0]; - const { meta } = successful; - const upload = {}; - upload['alt_text'] = meta.caption; - upload['caption'] = meta.caption; - upload['description'] = meta.caption; - upload['dimensions'] = `${meta.width}x${meta.height}`; - upload['file_size'] = successful.size; - upload['name'] = successful.fileName; - upload['slug'] = successful.response.body.key; - upload['title'] = meta.caption ? meta.caption : ' '; - upload['type'] = successful.meta.type; - upload['url'] = {}; - upload['url']['raw'] = successful.uploadURL; - - axios.post(MEDIA_API, [upload]).catch((error) => { - console.error(error); - }); - }} - uploadConfig={{ - restrictions: { - maxFileSize: 5242880, - allowedFileTypes: ['.jpg', '.jpeg', '.png', '.gif'], - }, - onBeforeUpload: (files) => { - const updatedFiles = {}; - - Object.keys(files).forEach((fileID) => { - updatedFiles[fileID] = { - ...files[fileID], - fileName: files[fileID].meta.name, - meta: { - ...files[fileID].meta, - name: - space_slug + - '/' + - new Date().getFullYear() + - '/' + - new Date().getMonth() + - '/' + - Date.now().toString() + - '_' + - files[fileID].meta.name, - }, - }; - }); - return updatedFiles; - }, - }} - /> - - ); -}; - -export default DescriptionInput; diff --git a/studio/src/components/FormItems/DescriptionInput.tsx b/studio/src/components/FormItems/DescriptionInput.tsx new file mode 100644 index 000000000..e780f05cb --- /dev/null +++ b/studio/src/components/FormItems/DescriptionInput.tsx @@ -0,0 +1,206 @@ +import React from "react"; +import axios from "axios"; +import { useSelector } from "react-redux"; +import { FormItem, FormLabel, FormControl } from "@/components/ui/form"; +import { ScooterCore as Editor } from "@factly/scooter-core"; +import { FactCheck } from "@factly/scooter-claim"; +import { Image } from "@factly/scooter-image"; +import { Embed } from "@factly/scooter-embed"; +import { ScooterTable } from "@factly/scooter-table"; +import { CodeBlock } from "@factly/scooter-code-block"; +import { RATINGS_API } from "../../constants/ratings"; +import { CLAIMANTS_API } from "../../constants/claimants"; +import { CLAIMS_API } from "../../constants/claims"; +import { MEDIA_API } from "../../constants/media"; + +interface DescriptionInputProps { + name?: string; + label?: string; + noLabel?: boolean; + onChange?: (value: any) => void; + inputProps?: Record; + formItemProps?: Record; + initialValue?: any; + rows?: number; +} + +interface RootState { + spaces: { + selected: number; + details: Record; + }; +} + +const DescriptionInput: React.FC = ({ + name = "description", + label = "Description", + noLabel = false, + onChange = () => {}, + inputProps = {}, + formItemProps = {}, + initialValue, + rows, +}) => { + const space_slug = useSelector((state: RootState) => { + return state.spaces.details[state.spaces.selected]?.slug; + }); + + const mergedInputProps = { ...inputProps, onChange }; + const mergedFormItemProps = noLabel + ? formItemProps + : { ...formItemProps, label }; + + return ( + + {!noLabel && {label}} + + { + return axios + .get(RATINGS_API, { + params: { page: page, limit: 10 }, + }) + .then((res) => { + return res.data; + }); + }, + claimantsFetcher: (page = 1) => { + return axios + .get(CLAIMANTS_API, { + params: { page: page, limit: 10 }, + }) + .then((res) => { + return res.data; + }); + }, + claimsFetcher: ( + searchTerm: string, + page = 1, + limit = 10, + sort = "desc" + ) => { + const params = new URLSearchParams(); + params.append("q", searchTerm); + params.append("page", page.toString()); + params.append("limit", limit.toString()); + params.append("sort", sort); + return axios.get(CLAIMS_API, { params: params }).then((res) => { + return res.data; + }); + }, + addClaim: (values: Record) => { + function convertIdsToNumbers( + obj: Record + ): Record { + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + if (!isNaN(Number(obj[key]))) { + obj[key] = Number(obj[key]); + } + } + } + return obj; + } + return axios + .post(CLAIMS_API, convertIdsToNumbers(values)) + .then((res) => { + return res.data; + }); + }, + }} + imagesFetcher={(currentPage: number) => + axios + .get(MEDIA_API, { + params: { page: currentPage, limit: 12 }, + }) + .then((res) => res.data) + } + onFileAdded={(file: any) => { + const data = file.data; + const url = data.thumbnail + ? data.thumbnail + : URL.createObjectURL(data); + const image = document.createElement("img"); + image.src = url; + image.onload = () => { + URL.revokeObjectURL(url); + }; + image.onerror = () => { + URL.revokeObjectURL(url); + }; + }} + onUploadComplete={(result: any) => { + const successful = result.successful[0]; + const { meta } = successful; + const upload: Record = {}; + upload["alt_text"] = meta.caption; + upload["caption"] = meta.caption; + upload["description"] = meta.caption; + upload["dimensions"] = `${meta.width}x${meta.height}`; + upload["file_size"] = successful.size; + upload["name"] = successful.fileName; + upload["slug"] = successful.response.body.key; + upload["title"] = meta.caption ? meta.caption : " "; + upload["type"] = successful.meta.type; + upload["url"] = {}; + upload["url"]["raw"] = successful.uploadURL; + + axios.post(MEDIA_API, [upload]).catch((error) => { + console.error(error); + }); + }} + uploadConfig={{ + restrictions: { + maxFileSize: 5242880, + allowedFileTypes: [".jpg", ".jpeg", ".png", ".gif"], + }, + onBeforeUpload: (files: Record) => { + const updatedFiles: Record = {}; + + Object.keys(files).forEach((fileID) => { + updatedFiles[fileID] = { + ...files[fileID], + fileName: files[fileID].meta.name, + meta: { + ...files[fileID].meta, + name: + space_slug + + "/" + + new Date().getFullYear() + + "/" + + new Date().getMonth() + + "/" + + Date.now().toString() + + "_" + + files[fileID].meta.name, + }, + }; + }); + return updatedFiles; + }, + }} + /> + + + ); +}; + +export default DescriptionInput; diff --git a/studio/src/components/FormItems/MetaForm.js b/studio/src/components/FormItems/MetaForm.js deleted file mode 100644 index 358a511cf..000000000 --- a/studio/src/components/FormItems/MetaForm.js +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import { Collapse, Form, Button, Input } from 'antd'; -import MonacoEditor from '../MonacoEditor/index'; -import { useSelector } from 'react-redux'; -import SocialCardPreview from '../PreviewSocialCard/index'; - -const MetaForm = ({ form, formData, style }) => { - const siteAddress = useSelector( - ({ spaces: { details, selected } }) => details[selected].site_address, - ); - return ( - <> - } - style={{ width: '100%', ...style }} - > - - - - - - - - - - - - - } - style={{ width: '100%', ...style }} - > - - - - - - - - - - } - style={{ width: '100%', ...style }} - > - - - - - - - - ); -}; - -export default MetaForm; diff --git a/studio/src/components/FormItems/MetaForm.tsx b/studio/src/components/FormItems/MetaForm.tsx new file mode 100644 index 000000000..1b1f13ed6 --- /dev/null +++ b/studio/src/components/FormItems/MetaForm.tsx @@ -0,0 +1,326 @@ +import React from "react"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { Label } from "@/components/ui/label"; +import { FormField, FormItem, FormLabel } from "@/components/ui/form"; +import MonacoEditor from "../MonacoEditor"; + +interface MetaFormProps { + formData?: MetaFormData; + style?: React.CSSProperties; + onChange?: () => void; + form?: any; +} + +interface MetaFormData { + meta?: { + title?: string; + description?: string; + canonical_URL?: string; + }; + header_code?: string; + footer_code?: string; + meta_fields?: string; +} + +const MetaForm: React.FC = ({ + formData, + style, + form, + onChange, +}) => { + const [headerCode, setHeaderCode] = React.useState( + formData?.header_code || "" + ); + const [footerCode, setFooterCode] = React.useState( + formData?.footer_code || "" + ); + const [metaFields, setMetaFields] = React.useState( + formData?.meta_fields || "" + ); + + const handleMetaFieldsChange = (value: string | undefined) => { + if (value !== undefined) { + setMetaFields(value); + if (form) { + form.setValue("meta_fields", value); + } + if (onChange) { + onChange(); + } + } + }; + + const handleHeaderCodeChange = (value: string | undefined) => { + if (value !== undefined) { + setHeaderCode(value); + if (form) { + form.setValue("header_code", value); + } + if (onChange) { + onChange(); + } + } + }; + + const handleFooterCodeChange = (value: string | undefined) => { + if (value !== undefined) { + setFooterCode(value); + if (form) { + form.setValue("footer_code", value); + } + if (onChange) { + onChange(); + } + } + }; + + const handleTextareaChange = ( + e: React.ChangeEvent, + fieldName: string + ) => { + if (form) { + form.setValue(fieldName, e.target.value); + } + if (onChange) { + onChange(); + } + }; + + return ( +
+ + + +
+ Meta Data +
+
+ +
+ {form ? ( + <> + ( + + Meta Title + + + )} + /> + + ( + + + Meta Description + + - - - -
-
- - - - - - - - - - - - - - - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - Cancel - , - - Ok - , - ] - } - okType="primary" - onCancel={[Function]} - visible={false} - width="800px" - > - - - - } - confirmLoading={false} - focusTriggerAfterClose={true} - footer={ - Array [ - - Cancel - , - - Ok - , - ] - } - maskTransitionName="ant-fade" - okType="primary" - onCancel={[Function]} - onClose={[Function]} - prefixCls="ant-modal" - transitionName="ant-zoom" - visible={false} - width="800px" - wrapClassName="" - > - - - - -
- -
-
-
- - - -
-
-
-
-
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- - - - - -
- - -
- -
- -
- - -
-
-
- - -
- - -
-
- - - - - -
- - -
- - - - - -
- -
- - - - -
- -
- - - -
- - -
-
- - - - Meta Data -
- - - -
-
-
- - -
-
- - - - Code Injection -
- - - -
-
-
-
-
-
- - -
- - -
-
- - - - Meta Fields -
- - - -
-
-
-
-
-
-
-
-
-
- - - - - - - - - - -`; diff --git a/studio/src/pages/claimants/__snapshots__/EditClaimant.test.js.snap b/studio/src/pages/claimants/__snapshots__/EditClaimant.test.js.snap deleted file mode 100644 index 2d0a52e65..000000000 --- a/studio/src/pages/claimants/__snapshots__/EditClaimant.test.js.snap +++ /dev/null @@ -1,498 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Claimants edit component snapshot testing should match component with empty data 1`] = ` - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- Sorry, could not find what you are looking for. -
-
-
-
-
-
-`; - -exports[`Claimants edit component snapshot testing should match skeleton while loading 1`] = ` - - - -
-
- - <h3 - className="ant-skeleton-title" - style={ - Object { - "width": "38%", - } - } - /> - - -
    -
  • -
  • -
  • -
-
-
-
-
-
-
-`; - -exports[`Claimants edit component snapshot testing should render the component 1`] = ` - - - -
-
- - <h3 - className="ant-skeleton-title" - style={ - Object { - "width": "38%", - } - } - /> - - -
    -
  • -
  • -
  • -
-
-
-
-
-
-
-`; diff --git a/studio/src/pages/claimants/__snapshots__/index.test.js.snap b/studio/src/pages/claimants/__snapshots__/index.test.js.snap deleted file mode 100644 index cee12862c..000000000 --- a/studio/src/pages/claimants/__snapshots__/index.test.js.snap +++ /dev/null @@ -1,7519 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Claimants List component snapshot testing should render loader component 1`] = ` - - - - - -
- -
- - - - - - -
-
-
-
-
-
-
-
-`; - -exports[`Claimants List component snapshot testing should render the component 1`] = ` - - - - - -
- -
- - - - - -
-
- -
- - - -
- -
- -
- - - - -
- - - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="filters_q" - inputType="input" - onChange={[Function]} - placeholder="Search claimant" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
-
- - -
- - - - -
- - - -
-
-
- - - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > -
- } - defaultValue="desc" - domRef={ - Object { - "current":
- - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > - - - - - - - Sort By: Latest - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - -
-
- - - -
- - - - -
- - - - - - - - -
- - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - [Function] - - } - expandedKeys={Set {}} - getRowKey={[Function]} - measureColumnWidth={false} - > - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- } - > - -
-
- - - - - - - - - - - -
-
- No Data -
-
-
-
-
-
-
-
-
- -
-
- - - - -
- -
- - - - -
- - - - -`; - -exports[`Claimants List component snapshot testing should render the component with data 1`] = ` - - - - - -
- -
- - - - - -
-
- -
- - - -
- -
- -
- - - - -
- - - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="filters_q" - inputType="input" - onChange={[Function]} - placeholder="Search claimant" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
-
- - -
- - - - -
- - - -
-
-
- - - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > -
- } - defaultValue="desc" - domRef={ - Object { - "current":
- - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > - - - - - - - Sort By: Latest - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - -
-
- - - -
- - - - -
- - - - - - - - -
- - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - Whatsapp - - - whatsapp - -
- -
-
- - - -
- - Facebook - - - facebook - -
- -
-
- - - -
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - Whatsapp - - - whatsapp - -
- -
-
- - - -
- - Facebook - - - facebook - -
- -
-
- - - -
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - - - Whatsapp - - - - - whatsapp - - - - - - -
- - - - - -
- } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={true} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={true} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - - - -
- - - - Facebook - - - - - facebook - - - - - - -
- - - - - -
- } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={true} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={true} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - - - -
-
-
-
-
- - - - -
- - - ••• - -
- - } - jumpPrevIcon={ - -
- - - ••• - -
-
- } - locale={ - Object { - "items_per_page": "/ page", - "jump_to": "Go to", - "jump_to_confirm": "confirm", - "next_3": "Next 3 Pages", - "next_5": "Next 5 Pages", - "next_page": "Next Page", - "page": "", - "prev_3": "Previous 3 Pages", - "prev_5": "Previous 5 Pages", - "prev_page": "Previous Page", - } - } - nextIcon={ - - } - onChange={[Function]} - onShowSizeChange={[Function]} - pageSize={10} - pageSizeOptions={ - Array [ - "10", - "15", - "20", - ] - } - prefixCls="ant-pagination" - prevIcon={ - - } - selectComponentClass={ - Object { - "$$typeof": Symbol(react.forward_ref), - "OptGroup": [Function], - "Option": [Function], - "SECRET_COMBOBOX_MODE_DO_NOT_USE": "SECRET_COMBOBOX_MODE_DO_NOT_USE", - "render": [Function], - } - } - selectPrefixCls="ant-select" - showLessItems={false} - showPrevNextJumpers={true} - showQuickJumper={false} - showTitle={true} - showTotal={[Function]} - style={Object {}} - total={2} - totalBoundaryShowSizeChanger={50} - > -
    -
  • - 1-2 of 2 results -
  • -
  • - -
  • - -
  • - - 1 - -
  • -
    -
  • - -
  • - -
-
-
-
-
-
- - - - -
- -
- - - - -
- - - - -`; diff --git a/studio/src/pages/claimants/components/ClaimantForm.js b/studio/src/pages/claimants/components/ClaimantForm.js deleted file mode 100644 index 312ce42c8..000000000 --- a/studio/src/pages/claimants/components/ClaimantForm.js +++ /dev/null @@ -1,136 +0,0 @@ -import React from 'react'; -import { Button, Form, Input, Space, Row, Col, Switch, Collapse, ConfigProvider } from 'antd'; -import { maker } from '../../../utils/sluger'; -import MediaSelector from '../../../components/MediaSelector'; -import getJsonValue from '../../../utils/getJsonValue'; -import { DescriptionInput, MetaForm, SlugInput, TitleInput } from '../../../components/FormItems'; - -const { TextArea } = Input; - -const ClaimantForm = ({ onCreate, data = {} }) => { - if (data && data.meta_fields) { - if (typeof data.meta_fields !== 'string') { - data.meta_fields = JSON.stringify(data.meta_fields); - } - } - const [form] = Form.useForm(); - const [valueChange, setValueChange] = React.useState(false); - - const onReset = () => { - form.resetFields(); - }; - - const onTitleChange = (string) => { - form.setFieldsValue({ - slug: maker(string), - }); - }; - - return ( - -
{ - if (values.meta_fields) { - values.meta_fields = getJsonValue(values.meta_fields); - } - onCreate(values); - onReset(); - }} - onValuesChange={() => { - setValueChange(true); - }} - > - - - - - - - - - - - - - - } - style={{ width: '100%', background: '#f0f2f5', border: 0, marginBottom: 16 }} - > - - - - onTitleChange(e.target.value)} - name="name" - label="Claimant Name" - /> - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - Cancel - , - - Ok - , - ] - } - okType="primary" - onCancel={[Function]} - visible={false} - width="800px" - > - - - - } - confirmLoading={false} - focusTriggerAfterClose={true} - footer={ - Array [ - - Cancel - , - - Ok - , - ] - } - maskTransitionName="ant-fade" - okType="primary" - onCancel={[Function]} - onClose={[Function]} - prefixCls="ant-modal" - transitionName="ant-zoom" - visible={false} - width="800px" - wrapClassName="" - > - - - - -
- -
-
-
- - - - - - -
-
-
-
-
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- - - - - -
- - -
- -
- -
- - -
-
-
- - -
- - -
-
- - - - - -
- - -
- - - - - -
- -
-
- - - -
- -
- - - -
- - -
-
- - - - Meta Data -
- - - -
-
-
- - -
-
- - - - Code Injection -
- - - -
-
-
-
-
-
- - -
- - -
-
- - - - Meta Fields -
- - - -
-
-
-
-
-
-
-
-
-
- - -
-
- - - - - -`; - -exports[`Claimants Create Form component snapshot testing should match component with empty data 1`] = ` - - - - - -
- -
- -
- -
- - -
- - - -
-
-
- -
- -
- - - -
-
- -
- - - -
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- -
- -
- - - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="creat-claimant_name" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="creat-claimant_slug" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - } - onChange={[Function]} - prefixCls="ant-switch" - > - - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - handleReset={[Function]} - id="creat-claimant_tag_line" - inputType="text" - prefixCls="ant-input" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - Cancel - , - - Ok - , - ] - } - okType="primary" - onCancel={[Function]} - visible={false} - width="800px" - > - - - - } - confirmLoading={false} - focusTriggerAfterClose={true} - footer={ - Array [ - - Cancel - , - - Ok - , - ] - } - maskTransitionName="ant-fade" - okType="primary" - onCancel={[Function]} - onClose={[Function]} - prefixCls="ant-modal" - transitionName="ant-zoom" - visible={false} - width="800px" - wrapClassName="" - > - - - - -
- -
-
-
- - - - - - -
-
-
-
-
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- - - - - -
- - -
- -
- -
- - -
-
-
- - -
- - -
-
- - - - - -
- - -
- - - - - -
- -
- -
- - -
- -
- - - -
- - -
-
- - - - Meta Data -
- - - -
-
-
- - -
-
- - - - Code Injection -
- - - -
-
-
-
-
-
- - -
- - -
-
- - - - Meta Fields -
- - - -
-
-
-
-
-
-
-
-
-
- -
- - - - - - - -`; - -exports[`Claimants Create Form component snapshot testing should render the component 1`] = ` - - - - - -
- -
- -
- -
- - -
- - - -
-
-
- -
- -
- - - -
-
- -
- - - -
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- -
- -
- - - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="creat-claimant_name" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="creat-claimant_slug" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - } - onChange={[Function]} - prefixCls="ant-switch" - > - - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - handleReset={[Function]} - id="creat-claimant_tag_line" - inputType="text" - prefixCls="ant-input" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - Cancel - , - - Ok - , - ] - } - okType="primary" - onCancel={[Function]} - visible={false} - width="800px" - > - - - - } - confirmLoading={false} - focusTriggerAfterClose={true} - footer={ - Array [ - - Cancel - , - - Ok - , - ] - } - maskTransitionName="ant-fade" - okType="primary" - onCancel={[Function]} - onClose={[Function]} - prefixCls="ant-modal" - transitionName="ant-zoom" - visible={false} - width="800px" - wrapClassName="" - > - - - - -
- -
-
-
- - - - - - -
-
-
-
-
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
-
- - -
- - - - - -
- - -
- -
- -
- - -
-
-
- - -
- - -
-
- - - - - -
- - -
- - - - - -
- -
- -
- - -
- -
- - - -
- - -
-
- - - - Meta Data -
- - - -
-
-
- - -
-
- - - - Code Injection -
- - - -
-
-
-
-
-
- - -
- - -
-
- - - - Meta Fields -
- - - -
-
-
-
-
-
-
-
-
-
- -
- - - - - - - -`; diff --git a/studio/src/pages/claimants/components/__snapshots__/ClaimantList.test.js.snap b/studio/src/pages/claimants/components/__snapshots__/ClaimantList.test.js.snap deleted file mode 100644 index 6e2e30db7..000000000 --- a/studio/src/pages/claimants/components/__snapshots__/ClaimantList.test.js.snap +++ /dev/null @@ -1,8359 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Claimants List component snapshot testing should match component when loading 1`] = ` - - - - - -
- -
- -
- -
-
-
- - - - - - -
-
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - Whatsapp - - - whatsapp - -
- -
-
- -
- - Facebook - - - facebook - -
- -
-
- -
-
, - }, - } - } - loading={true} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 20, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - Whatsapp - - - whatsapp - -
- -
-
- -
- - Facebook - - - facebook - -
- -
-
- -
-
, - }, - }, - "loading": true, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 20, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - - - Whatsapp - - - - - whatsapp - - - - - - -
- - - - - -
- } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={false} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={false} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - -
- - - - Facebook - - - - - facebook - - - - - - -
- - - - - -
- } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={false} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={false} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - -
-
-
-
-
- - - - -
- - - ••• - -
- - } - jumpPrevIcon={ - -
- - - ••• - -
-
- } - locale={ - Object { - "items_per_page": "/ page", - "jump_to": "Go to", - "jump_to_confirm": "confirm", - "next_3": "Next 3 Pages", - "next_5": "Next 5 Pages", - "next_page": "Next Page", - "page": "", - "prev_3": "Previous 3 Pages", - "prev_5": "Previous 5 Pages", - "prev_page": "Previous Page", - } - } - nextIcon={ - - } - onChange={[Function]} - onShowSizeChange={[Function]} - pageSize={20} - pageSizeOptions={ - Array [ - "10", - "15", - "20", - ] - } - prefixCls="ant-pagination" - prevIcon={ - - } - selectComponentClass={ - Object { - "$$typeof": Symbol(react.forward_ref), - "OptGroup": [Function], - "Option": [Function], - "SECRET_COMBOBOX_MODE_DO_NOT_USE": "SECRET_COMBOBOX_MODE_DO_NOT_USE", - "render": [Function], - } - } - selectPrefixCls="ant-select" - showLessItems={false} - showPrevNextJumpers={true} - showQuickJumper={false} - showTitle={true} - showTotal={[Function]} - style={Object {}} - total={2} - totalBoundaryShowSizeChanger={50} - > -
    -
  • - 1-2 of 2 results -
  • -
  • - -
  • - -
  • - - 1 - -
  • -
    -
  • - -
  • - -
-
-
-
-
-
- -
- - - - - - - - -
-`; - -exports[`Claimants List component snapshot testing should match component with claimants 1`] = ` - - - - - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - Whatsapp - - - whatsapp - -
- -
-
- -
- - Facebook - - - facebook - -
- -
-
- -
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 20, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - Whatsapp - - - whatsapp - -
- -
-
- -
- - Facebook - - - facebook - -
- -
-
- -
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 20, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- - - - Whatsapp - - - - - whatsapp - - - - - - -
- - - - - -
- } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={false} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={false} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - -
- - - - Facebook - - - - - facebook - - - - - - -
- - - - - -
- } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={false} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={false} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - -
-
-
-
-
- - - - -
- - - ••• - -
- - } - jumpPrevIcon={ - -
- - - ••• - -
-
- } - locale={ - Object { - "items_per_page": "/ page", - "jump_to": "Go to", - "jump_to_confirm": "confirm", - "next_3": "Next 3 Pages", - "next_5": "Next 5 Pages", - "next_page": "Next Page", - "page": "", - "prev_3": "Previous 3 Pages", - "prev_5": "Previous 5 Pages", - "prev_page": "Previous Page", - } - } - nextIcon={ - - } - onChange={[Function]} - onShowSizeChange={[Function]} - pageSize={20} - pageSizeOptions={ - Array [ - "10", - "15", - "20", - ] - } - prefixCls="ant-pagination" - prevIcon={ - - } - selectComponentClass={ - Object { - "$$typeof": Symbol(react.forward_ref), - "OptGroup": [Function], - "Option": [Function], - "SECRET_COMBOBOX_MODE_DO_NOT_USE": "SECRET_COMBOBOX_MODE_DO_NOT_USE", - "render": [Function], - } - } - selectPrefixCls="ant-select" - showLessItems={false} - showPrevNextJumpers={true} - showQuickJumper={false} - showTitle={true} - showTotal={[Function]} - style={Object {}} - total={2} - totalBoundaryShowSizeChanger={50} - > -
    -
  • - 1-2 of 2 results -
  • -
  • - -
  • - -
  • - - 1 - -
  • -
    -
  • - -
  • - -
-
-
-
-
- - - - - - - -
-
-
-
-
-`; - -exports[`Claimants List component snapshot testing should render the component 1`] = ` - - - - - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 20, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 20, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - [Function] - - } - expandedKeys={Set {}} - getRowKey={[Function]} - measureColumnWidth={false} - > - - - - - - - - - - -
- Name - - Slug - - Tag Line - - Action -
- } - > - -
-
- - - - - - - - - - - -
-
- No Data -
-
-
-
-
-
-
-
-
- -
- - - - - - - -
-
-
-
-
-`; diff --git a/studio/src/pages/claimants/hooks/useClaimantsData.tsx b/studio/src/pages/claimants/hooks/useClaimantsData.tsx new file mode 100644 index 000000000..02e0781da --- /dev/null +++ b/studio/src/pages/claimants/hooks/useClaimantsData.tsx @@ -0,0 +1,54 @@ +import { useMemo } from "react"; +import { useSelector } from "react-redux"; +import { Claimant, ClaimantFilters, RootState } from "../types"; +import deepEqual from "deep-equal"; + +export const useClaimantsData = ( + filters: ClaimantFilters, + searchText: string, + sortOrder: "asc" | "desc" = "asc" +) => { + // Get data from Redux + const { claimants, total, loading } = useSelector((state: RootState) => { + const node = state.claimants.req.find((item) => { + return deepEqual(item.query, filters); + }); + + if (node) + return { + claimants: node.data.map((element) => state.claimants.details[element]), + total: node.total, + loading: state.claimants.loading, + }; + return { claimants: [], total: 0, loading: state.claimants.loading }; + }); + + // Filter and sort claimants locally based on search text and sort order + const filteredClaimants = useMemo(() => { + let filtered = claimants as Claimant[]; + + // Apply search filter + if (searchText.trim()) { + filtered = claimants.filter( + (claimant) => + claimant.name?.toLowerCase().includes(searchText.toLowerCase()) || + claimant.tag_line?.toLowerCase().includes(searchText.toLowerCase()) + ); + } + + // Apply sorting + return [...filtered].sort((a, b) => { + if (sortOrder === "asc") { + return a.name?.localeCompare(b.name || "") || 0; + } else { + return b.name?.localeCompare(a.name || "") || 0; + } + }); + }, [claimants, searchText, sortOrder]); + + return { + claimants: filteredClaimants, + total, + loading, + }; +}; diff --git a/studio/src/pages/claimants/hooks/useClaimantsPagination.tsx b/studio/src/pages/claimants/hooks/useClaimantsPagination.tsx new file mode 100644 index 000000000..2491bea7f --- /dev/null +++ b/studio/src/pages/claimants/hooks/useClaimantsPagination.tsx @@ -0,0 +1,39 @@ +import { useCallback, useMemo } from "react"; +import { ClaimantFilters } from "../types"; + +export const useClaimantsPagination = ( + filters: ClaimantFilters, + setFilters: ( + filters: ClaimantFilters | ((prev: ClaimantFilters) => ClaimantFilters) + ) => void, + total: number +) => { + // Calculate total pages + const pageSize = filters.limit || 10; + const totalPages = useMemo( + () => Math.max(1, Math.ceil(total / pageSize)), + [total, pageSize] + ); + + // Pagination handlers + const handlePageChange = useCallback( + (page: number) => { + setFilters((prev: ClaimantFilters) => ({ ...prev, page })); + }, + [setFilters] + ); + + const handlePageSizeChange = useCallback( + (size: number) => { + setFilters({ page: 1, limit: size }); + }, + [setFilters] + ); + + return { + pageSize, + totalPages, + handlePageChange, + handlePageSizeChange, + }; +}; diff --git a/studio/src/pages/claimants/index.js b/studio/src/pages/claimants/index.js deleted file mode 100644 index e62c864d3..000000000 --- a/studio/src/pages/claimants/index.js +++ /dev/null @@ -1,232 +0,0 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -import React, { useEffect } from 'react'; -import ClaimantList from './components/ClaimantList'; -import { - Space, - Button, - Form, - Row, - Col, - Select, - Input, - Typography, - Tooltip, - ConfigProvider, -} from 'antd'; -import { PlusOutlined, SearchOutlined } from '@ant-design/icons'; -import { Link, useLocation, useNavigate } from 'react-router-dom'; -import { useDispatch, useSelector } from 'react-redux'; -import { getClaimants } from '../../actions/claimants'; -import deepEqual from 'deep-equal'; -import getUrlParams from '../../utils/getUrlParams'; -import Loader from '../../components/Loader'; -import { Helmet } from 'react-helmet'; -import Filters from '../../utils/filters'; - -function Claimants({ permission }) { - const { actions } = permission; - const dispatch = useDispatch(); - const history = useNavigate(); - const query = new URLSearchParams(useLocation().search); - const [searchFieldExpand, setSearchFieldExpand] = React.useState(false); - const [isMobileScreen, setIsMobileScreen] = React.useState(false); - - const params = getUrlParams(query); - const [filters, setFilters] = React.useState({ - ...params, - }); - - React.useEffect(() => { - const handleResize = () => { - if (window.innerWidth < 768) { - setIsMobileScreen(true); - } else { - setIsMobileScreen(false); - } - }; - window.addEventListener('resize', handleResize); - handleResize(); - - return () => window.removeEventListener('resize', handleResize); - }, []); - - const pathName = useLocation().pathname; - useEffect(() => { - history({ - pathname: pathName, - search: new URLSearchParams(filters).toString(), - }); - }, [history, filters]); - const [form] = Form.useForm(); - const { Option } = Select; - - const { claimants, total, loading } = useSelector((state) => { - const node = state.claimants.req.find((item) => { - return deepEqual(item.query, params); - }); - - if (node) - return { - claimants: node.data.map((element) => state.claimants.details[element]), - total: node.total, - loading: state.claimants.loading, - }; - return { claimants: [], total: 0, loading: state.claimants.loading }; - }); - useEffect(() => { - if (form) form.setFieldsValue(new Filters(params)); - }, [params]); - - React.useEffect(() => { - fetchClaimants(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [filters]); - - const fetchClaimants = () => { - dispatch(getClaimants(filters)); - }; - return loading ? ( - - ) : ( - - - -
{ - let filterValue = {}; - Object.keys(values).forEach(function (key) { - if (values[key]) { - filterValue[key] = values[key]; - } - }); - setFilters({ - ...filters, - ...filterValue, - }); - }} - style={{ maxWidth: '100%' }} - onValuesChange={(changedValues, allValues) => { - if (!changedValues.q) { - if (changedValues.q === '') { - const { q, ...filtersWithoutQuery } = filters; - setFilters({ ...filtersWithoutQuery }); - return; - } - setFilters({ ...filters, ...changedValues }); - } - }} - > - - - - - - Claimants - - - - {searchFieldExpand ? ( - - - - - - - - - ) : ( - - - - - - - - - - - - - - - - -
-
- -
- ); -} - -export default Claimants; diff --git a/studio/src/pages/claimants/index.test.js b/studio/src/pages/claimants/index.test.js deleted file mode 100644 index d77182c67..000000000 --- a/studio/src/pages/claimants/index.test.js +++ /dev/null @@ -1,228 +0,0 @@ -import React from 'react'; -import { BrowserRouter as Router } from 'react-router-dom'; -import { useDispatch, Provider } from 'react-redux'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import { act } from 'react-dom/test-utils'; -import { mount } from 'enzyme'; - -import '../../matchMedia.mock'; -import Claimants from './index'; -import { getClaimants } from '../../actions/claimants'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); -let mockedDispatch, store; -let state = { - claimants: { - req: [ - { - data: [1, 2], - query: { - sort: 'desc', - limit: 10, - page: 1, - }, - total: 2, - }, - ], - details: { - 1: { - id: 1, - created_at: '2020-09-09T06:51:15.770644Z', - updated_at: '2020-09-09T06:51:15.770644Z', - deleted_at: null, - name: 'Whatsapp', - slug: 'whatsapp', - description: '', - tag_line: '', - medium_id: 0, - space_id: 1, - }, - 2: { - id: 2, - created_at: '2020-09-09T06:51:22.237778Z', - updated_at: '2020-09-09T06:51:22.237778Z', - deleted_at: null, - name: 'Facebook', - slug: 'facebook', - description: '', - tag_line: '', - medium_id: 0, - space_id: 1, - }, - }, - loading: false, - }, -}; -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useDispatch: jest.fn(), -})); - -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useHistory: () => ({ - push: jest.fn(), - }), -})); - -jest.mock('../../actions/claimants', () => ({ - getClaimants: jest.fn(), - addClaimant: jest.fn(), -})); - -describe('Claimants List component', () => { - describe('snapshot testing', () => { - beforeEach(() => { - store = mockStore({}); - store.dispatch = jest.fn(); - mockedDispatch = jest.fn(); - useDispatch.mockReturnValue(mockedDispatch); - }); - it('should render the component', () => { - let state2 = { - claimants: { - req: [], - details: {}, - loading: false, - }, - }; - store = mockStore(state2); - const tree = mount( - - - - - , - ); - expect(tree).toMatchSnapshot(); - }); - it('should render the component with data', () => { - store = mockStore(state); - const tree = mount( - - - - - , - ); - expect(tree).toMatchSnapshot(); - expect(getClaimants).toBeCalledWith({ limit: 10, page: 1, sort: 'desc' }); - }); - it('should render loader component', () => { - const loadingState = { - claimants: { - req: [], - details: {}, - loading: true, - }, - }; - store = mockStore(loadingState); - const tree = mount( - - - - - , - ); - expect(tree).toMatchSnapshot(); - }); - }); - describe('component testing', () => { - beforeEach(() => { - jest.clearAllMocks(); - mockedDispatch = jest.fn(() => new Promise((resolve) => resolve(true))); - useDispatch.mockReturnValue(mockedDispatch); - }); - it('should handle url search params', () => { - let wrapper; - window.history.pushState({}, '', '/claimants?limit=20&page=1&q=descri'); - const store2 = mockStore({ - claimants: { - req: [ - { - data: [1, 2], - query: { page: 1, limit: 20 }, - total: 2, - }, - ], - details: { - 1: { - id: 1, - created_at: '2020-09-09T06:51:15.770644Z', - updated_at: '2020-09-09T06:51:15.770644Z', - deleted_at: null, - name: 'Whatsapp', - slug: 'whatsapp', - description: 'description', - tag_line: '', - medium_id: 0, - space_id: 1, - }, - 2: { - id: 2, - created_at: '2020-09-09T06:51:22.237778Z', - updated_at: '2020-09-09T06:51:22.237778Z', - deleted_at: null, - name: 'Facebook', - slug: 'facebook', - description: 'description', - tag_line: '', - medium_id: 0, - space_id: 1, - }, - }, - loading: false, - }, - }); - act(() => { - wrapper = mount( - - - - - , - ); - }); - expect(getClaimants).toHaveBeenCalledWith({ page: 1, limit: 20, q: 'descri', sort: 'desc' }); - }); - it('should submit filters', () => { - store = mockStore(state); - let wrapper; - act(() => { - wrapper = mount( - - - - - , - ); - wrapper - .find('input') - .at(0) - .simulate('change', { target: { value: 'claimant' } }); - wrapper - .find('FormItem') - .at(2) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: '' } }); - - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Search'); - submitButtom.simulate('submit'); - }); - - setTimeout(() => { - expect(getClaimants).toHaveBeenCalledWith({ - page: 1, - limit: 5, - q: 'claimant', - sort: '', - }); - }, 0); - }); - }); -}); diff --git a/studio/src/pages/claimants/index.tsx b/studio/src/pages/claimants/index.tsx new file mode 100644 index 000000000..eb08639ad --- /dev/null +++ b/studio/src/pages/claimants/index.tsx @@ -0,0 +1,225 @@ +import { useEffect, useState, useCallback } from "react"; +import ClaimantList from "./components/ClaimantList"; +import { getClaimants } from "../../actions/claimants"; +import { Helmet } from "react-helmet"; +import { PlusCircle, Search as SearchIcon } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { useAppDispatch } from "@/hooks/reduxHooks"; +import Pagination from "../../components/Pagination"; +import { useSidebar } from "@/components/ui/sidebar"; +import { useIsMobile } from "@/hooks/use-mobile"; +import MobileBreadcrumb from "@/components/MobileBreadcrumb"; +import { ClaimantFilters } from "./types"; +import { useClaimantsData } from "./hooks/useClaimantsData"; +import { useClaimantsPagination } from "./hooks/useClaimantsPagination"; +import SecuredButton from "@/components/SecuredButton"; + +function Claimants() { + const dispatch = useAppDispatch(); + const { state: sidebarState } = useSidebar(); + const isMobile = useIsMobile(); + // State for search and filters + const [searchText, setSearchText] = useState(""); + const [showSearch, setShowSearch] = useState(!isMobile); + const [filters, setFilters] = useState({ + page: 1, + limit: 10, + }); + + // Handle responsive UI changes + useEffect(() => { + setShowSearch(!isMobile); + }, [isMobile]); + + // Use custom hooks for data and pagination + const { claimants, total, loading } = useClaimantsData(filters, searchText); + const { pageSize, totalPages, handlePageChange, handlePageSizeChange } = + useClaimantsPagination(filters, setFilters, total); + + // Fetch claimants when filters change + useEffect(() => { + dispatch(getClaimants(filters)); + }, [dispatch, filters]); + + // Handle search input changes + const handleSearchChange = (e: React.ChangeEvent) => { + setSearchText(e.target.value); + }; + + // Toggle search on mobile + const toggleSearch = useCallback(() => { + setShowSearch((prev) => !prev); + if (showSearch) { + setSearchText(""); + } + }, [showSearch]); + + // Fetch claimants function for the list component + const fetchClaimants = useCallback(() => { + dispatch(getClaimants(filters)); + }, [dispatch, filters]); + + // Handle navigation to create claimant page + const handleCreateClaimant = () => { + window.location.href = "/claimants/create"; + }; + + // Get sidebar state + const isCollapsed = sidebarState === "collapsed" && !isMobile; + + return ( +
+ + + {/* Mobile Breadcrumb */} + {isMobile && ( + + )} + +
+
+ {/* Title */} + {isMobile &&

Claimants

} + + {/* Desktop search bar */} + {!isMobile && ( +
+ +
+ )} + + {/* Action buttons */} +
+ {isMobile && ( + + )} + + {isMobile ? ( + + + + ) : ( + + + Create claimant + + )} +
+
+ + {/* Mobile search bar */} + {isMobile && showSearch && ( +
+ +
+ )} +
+ +
+ +
+ +
+ +
+
+ ); +} + +export default Claimants; diff --git a/studio/src/pages/claimants/types.ts b/studio/src/pages/claimants/types.ts new file mode 100644 index 000000000..1c8f1da4a --- /dev/null +++ b/studio/src/pages/claimants/types.ts @@ -0,0 +1,70 @@ +// Claimant related interfaces +export interface Claimant { + id: string; + name: string; + slug?: string; + is_featured?: boolean; + tag_line?: string; + medium_id?: number; + description_html?: string; + meta_fields?: string; + [key: string]: any; +} + +// Form values interface +export interface ClaimantFormValues { + id?: number | string; + name?: string; + slug?: string; + is_featured?: boolean; + tag_line?: string; + medium_id?: number; + description_html?: string; + meta_fields?: string; +} + +// Component props interface +export interface ClaimantFormProps { + onCreate: (values: ClaimantFormValues) => void; + data?: Partial; +} + +export interface ClaimantListProps { + data: { + claimants: Claimant[]; + loading: boolean; + total: number; + }; + filters: { + page: number; + limit: number; + [key: string]: any; + }; + setFilters: (filters: any) => void; + fetchClaimants: () => void; + actions?: string[]; + isMobile?: boolean; +} + +export interface ClaimantFilters { + page: number; + limit: number; + [key: string]: any; +} + +export interface ClaimantState { + req: { + query: Record; + data: string[]; + total: number; + }[]; + details: Record; + loading: boolean; +} + +export interface RootState { + claimants: ClaimantState; + sidebar: { + collapsed: boolean; + }; +} diff --git a/studio/src/pages/claims/CreateClaim.js b/studio/src/pages/claims/CreateClaim.js deleted file mode 100644 index 7cd01c85c..000000000 --- a/studio/src/pages/claims/CreateClaim.js +++ /dev/null @@ -1,46 +0,0 @@ -import ClaimCreateForm from './components/ClaimForm'; -import { useDispatch, useSelector } from 'react-redux'; -import { createClaim } from '../../actions/claims'; -import { Link } from 'react-router-dom'; -import { Helmet } from 'react-helmet'; -import { Button, Result } from 'antd'; -import useNavigation from '../../utils/useNavigation'; - -function CreateClaim() { - const history = useNavigation(); - - const dispatch = useDispatch(); - const onCreate = (values) => { - dispatch(createClaim(values)).then(() => { - history('/claims'); - }); - }; - - const { claimantsCount } = useSelector(({ claimants }) => { - return { - claimantsCount: claimants?.req?.[0]?.data ? claimants?.req?.[0]?.data : 0, - }; - }); - - return ( - <> - - {claimantsCount ? ( - - ) : ( - - - - } - /> - )} - - ); -} - -export default CreateClaim; diff --git a/studio/src/pages/claims/CreateClaim.test.js b/studio/src/pages/claims/CreateClaim.test.js deleted file mode 100644 index 555d74a60..000000000 --- a/studio/src/pages/claims/CreateClaim.test.js +++ /dev/null @@ -1,107 +0,0 @@ -import React from 'react'; -import { useHistory } from 'react-router-dom'; -import { Provider, useSelector, useDispatch } from 'react-redux'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import { mount, shallow } from 'enzyme'; -import { act } from '@testing-library/react'; - -import '../../matchMedia.mock'; -import CreateClaim from './CreateClaim'; -import * as actions from '../../actions/claims'; -import ClaimCreateForm from './components/ClaimForm'; - -jest.mock('@editorjs/editorjs'); -jest.mock('react-monaco-editor', () => { - const MonacoEditor = () =>
; - return MonacoEditor; -}); -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useSelector: jest.fn(), - useDispatch: jest.fn(), -})); - -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useHistory: jest.fn(), -})); - -jest.mock('../../actions/claims', () => ({ - ...jest.requireActual('../../actions/claims'), - createClaim: jest.fn(), -})); - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); - -let onCreate, store; - -describe('Claim create component', () => { - store = mockStore({ - claims: { - req: [], - details: {}, - loading: true, - }, - claimants: { - req: [], - details: {}, - loading: true, - }, - rating: { - req: [], - details: {}, - loading: true, - }, - media: { - req: [], - details: {}, - loading: true, - }, - }); - const mockedDispatch = jest.fn(() => Promise.resolve({})); - useDispatch.mockReturnValue(mockedDispatch); - useSelector.mockImplementation((state) => ({ details: [], total: 0, loading: false })); - - describe('snapshot testing', () => { - beforeEach(() => { - onCreate = jest.fn(); - }); - it('should render the component', () => { - let tree; - act(() => { - tree = shallow( - - - , - ); - }); - expect(tree).toMatchSnapshot(); - }); - }); - describe('component testing', () => { - let wrapper; - afterEach(() => { - wrapper.unmount(); - }); - it('should call createClaim', (done) => { - actions.createClaim.mockReset(); - const push = jest.fn(); - useHistory.mockReturnValueOnce({ push }); - act(() => { - wrapper = mount( - - - , - ); - }); - wrapper.find(ClaimCreateForm).props().onCreate({ test: 'test' }); - setTimeout(() => { - expect(actions.createClaim).toHaveBeenCalledWith({ test: 'test' }); - expect(push).toHaveBeenCalledWith('/claims'); - done(); - }, 0); - }); - }); -}); diff --git a/studio/src/pages/claims/CreateClaim.tsx b/studio/src/pages/claims/CreateClaim.tsx new file mode 100644 index 000000000..10c2e6d80 --- /dev/null +++ b/studio/src/pages/claims/CreateClaim.tsx @@ -0,0 +1,60 @@ +import { FC, useEffect, useState } from "react"; +import ClaimCreateForm from "./components/ClaimForm"; +import { useSelector } from "react-redux"; +import { createClaim } from "../../actions/claims"; +import { getClaimants } from "../../actions/claimants"; +import { Helmet } from "react-helmet"; +import useNavigation from "../../utils/useNavigation"; +import { RootState } from "../../store/index"; +import { useAppDispatch } from "@/hooks/reduxHooks"; +import { FormattedClaimValues } from "./types"; + +const CreateClaim: FC = () => { + const history = useNavigation(); + const dispatch = useAppDispatch(); + const [initialLoadDone, setInitialLoadDone] = useState(false); + + useEffect(() => { + const loadData = async () => { + try { + await dispatch(getClaimants({ limit: 5 })); + } finally { + setInitialLoadDone(true); + } + }; + + loadData(); + }, [dispatch]); + + const { claimantsCount, loading } = useSelector((state: RootState) => { + const req = state.claimants?.req || []; + const detailsLength = Object.keys(state.claimants?.details || {}).length; + + return { + claimantsCount: + req.length > 0 && req[0]?.total ? req[0].total : detailsLength, + loading: state.claimants?.loading, + }; + }); + + const onCreate = (values: FormattedClaimValues) => { + // Use Promise.resolve to handle the dispatch result properly + const result = dispatch(createClaim(values)); + + // Check if result exists and is a Promise + if (result && typeof result.then === "function") { + result.then(() => { + history("/claims"); + }); + } + }; + + return ( + <> + + + + ); +}; + +export default CreateClaim; diff --git a/studio/src/pages/claims/EditClaim.js b/studio/src/pages/claims/EditClaim.js deleted file mode 100644 index 2b4246bb8..000000000 --- a/studio/src/pages/claims/EditClaim.js +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; -import ClaimEditForm from './components/ClaimForm'; -import { useDispatch, useSelector } from 'react-redux'; -import { Skeleton } from 'antd'; -import { updateClaim, getClaim } from '../../actions/claims'; - -import { useParams } from 'react-router-dom'; -import RecordNotFound from '../../components/ErrorsAndImage/RecordNotFound'; -import { Helmet } from 'react-helmet'; -import useNavigation from '../../utils/useNavigation'; - -function EditClaim() { - const history = useNavigation(); - const { id } = useParams(); - - const dispatch = useDispatch(); - - const { claim, loading } = useSelector((state) => { - return { - claim: state.claims.details[id] ? state.claims.details[id] : null, - loading: state.claims.loading, - }; - }); - - React.useEffect(() => { - dispatch(getClaim(id)); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [id]); - - if (loading) return ; - - if (!claim) { - return ; - } - - const onUpdate = (values) => { - dispatch(updateClaim({ ...claim, ...values })).then(() => history(`/claims/${id}/edit`)); - }; - return ( - <> - - - - ); -} - -export default EditClaim; diff --git a/studio/src/pages/claims/EditClaim.test.js b/studio/src/pages/claims/EditClaim.test.js deleted file mode 100644 index 9de3d2927..000000000 --- a/studio/src/pages/claims/EditClaim.test.js +++ /dev/null @@ -1,257 +0,0 @@ -import React from 'react'; -import { useHistory } from 'react-router-dom'; -import { useDispatch, Provider } from 'react-redux'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import { mount, shallow } from 'enzyme'; -import { act } from '@testing-library/react'; - -import '../../matchMedia.mock'; -import EditClaim from './EditClaim'; -import * as actions from '../../actions/claims'; -import ClaimEditForm from './components/ClaimForm'; - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); - -jest.mock('@editorjs/editorjs'); -jest.mock('react-monaco-editor', () => { - const MonacoEditor = () =>
; - return MonacoEditor; -}); -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useDispatch: jest.fn(), -})); - -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useHistory: jest.fn(), - useParams: jest.fn().mockReturnValue({ id: '1' }), -})); - -jest.mock('../../actions/claims', () => ({ - getClaims: jest.fn(), - getClaim: jest.fn(), - updateClaim: jest.fn(), -})); -let claims = { - req: [ - { - data: [1, 2], - query: { - page: 1, - }, - total: 2, - }, - ], - details: { - 1: { - id: 1, - created_at: '2020-07-17T10:14:44.251814Z', - updated_at: '2020-07-17T10:14:44.251814Z', - checked_date: '2020-07-17T10:14:44.251814Z', - claim_date: '2020-07-17T10:14:44.251814Z', - deleted_at: null, - name: 'claim-1', - slug: 'claim-1', - description: '', - claimant_id: 1, - rating_id: 1, - space_id: 1, - }, - 2: { - id: 2, - created_at: '2020-07-17T10:14:48.173442Z', - updated_at: '2020-07-17T10:14:48.173442Z', - checked_date: '2020-07-17T10:14:44.251814Z', - claim_date: '2020-07-17T10:14:44.251814Z', - deleted_at: null, - name: 'claim-2', - slug: 'claim-2', - description: '', - claimant_id: 1, - rating_id: 1, - space_id: 1, - }, - }, - loading: false, -}; -let spaces = { - orgs: [ - { - id: 1, - title: 'TOI', - spaces: [1], - }, - ], - details: { - 1: { - id: 1, - name: 'English', - site_address: 'site_address', - site_title: 'site_title', - tag_line: 'tag_line', - }, - }, - selected: 1, -}; -let state = { - claims: claims, - spaces: spaces, - media: { - req: [], - details: {}, - loading: true, - }, - ratings: { - req: [], - details: {}, - loading: true, - }, - claimants: { - req: [], - details: {}, - loading: true, - }, -}; - -describe('Claims Edit component', () => { - let store; - let mockedDispatch; - store = mockStore(state); - store.dispatch = jest.fn(() => ({})); - mockedDispatch = jest.fn(() => Promise.resolve({})); - useDispatch.mockReturnValue(mockedDispatch); - - describe('snapshot testing', () => { - it('should render the component', () => { - let tree; - act(() => { - tree = shallow( - - - , - ); - }); - expect(tree).toMatchSnapshot(); - }); - it('should match component with empty data', () => { - let tree; - state.claims = { - req: [], - details: {}, - loading: false, - }; - store = mockStore(state); - act(() => { - tree = mount( - - - , - ); - }); - expect(tree).toMatchSnapshot(); - }); - it('should match skeleton while loading', () => { - let tree; - state.claims = { - req: [], - details: {}, - loading: true, - }; - store = mockStore(state); - act(() => { - tree = mount( - - - , - ); - }); - - expect(tree).toMatchSnapshot(); - }); - }); - describe('component testing', () => { - let wrapper; - beforeEach(() => { - store = mockStore({ - claims: claims, - media: { - req: [], - details: {}, - loading: true, - }, - spaces: spaces, - ratings: { - req: [], - details: {}, - loading: true, - }, - claimants: { - req: [], - details: {}, - loading: true, - }, - }); - }); - afterEach(() => { - wrapper.unmount(); - }); - it('should call get action', () => { - actions.getClaim.mockReset(); - act(() => { - wrapper = mount( - - - , - ); - }); - expect(actions.getClaim).toHaveBeenCalledWith('1'); - }); - it('should call updateClaim', (done) => { - actions.updateClaim.mockReset(); - const push = jest.fn(); - useHistory.mockReturnValueOnce({ push }); - act(() => { - wrapper = mount( - - - , - ); - }); - wrapper.find(ClaimEditForm).props().onCreate({ - id: 1, - created_at: '2020-07-17T10:14:44.251814Z', - updated_at: '2020-07-17T10:14:44.251814Z', - checked_date: '2020-07-17T10:14:44.251814Z', - claim_date: '2020-07-17T10:14:44.251814Z', - deleted_at: null, - name: 'claim-1', - slug: 'claim-1', - description: '', - claimant_id: 1, - rating_id: 1, - space_id: 1, - }); - setTimeout(() => { - expect(actions.updateClaim).toHaveBeenCalledWith({ - id: 1, - created_at: '2020-07-17T10:14:44.251814Z', - updated_at: '2020-07-17T10:14:44.251814Z', - checked_date: '2020-07-17T10:14:44.251814Z', - claim_date: '2020-07-17T10:14:44.251814Z', - deleted_at: null, - name: 'claim-1', - slug: 'claim-1', - description: '', - claimant_id: 1, - rating_id: 1, - space_id: 1, - }); - expect(push).toHaveBeenCalledWith('/claims/1/edit'); - done(); - }, 0); - }); - }); -}); diff --git a/studio/src/pages/claims/EditClaim.tsx b/studio/src/pages/claims/EditClaim.tsx new file mode 100644 index 000000000..c722ee59f --- /dev/null +++ b/studio/src/pages/claims/EditClaim.tsx @@ -0,0 +1,104 @@ +import { useEffect } from "react"; +import ClaimEditForm from "./components/ClaimForm"; +import { useSelector } from "react-redux"; +import { updateClaim, getClaim } from "../../actions/claims"; +import { getClaimants } from "../../actions/claimants"; +import { getRatings } from "../../actions/ratings"; +import { useParams, useNavigate } from "react-router-dom"; +import RecordNotFound from "../../components/ErrorsAndImage/RecordNotFound"; +import { Helmet } from "react-helmet"; +import { Skeleton } from "@/components/ui/skeleton"; +import { useAppDispatch } from "@/hooks/reduxHooks"; +import { FormattedClaimValues } from "./types"; + +// Define types for the claim and state +interface Claim { + id: string; + [key: string]: any; +} + +interface RootState { + claims: { + details: { + [id: string]: Claim | null; + }; + loading: boolean; + }; + claimants: { + loading: boolean; + }; + ratings: { + loading: boolean; + }; +} + +function EditClaim(): React.ReactElement { + const navigate = useNavigate(); + const { id } = useParams<{ id: string }>(); + const dispatch = useAppDispatch(); + + const { claim, loading } = useSelector((state: RootState) => { + return { + claim: id && state.claims.details[id] ? state.claims.details[id] : null, + loading: state.claims.loading, + claimantsLoading: state.claimants.loading, + ratingsLoading: state.ratings.loading, + }; + }); + + useEffect(() => { + if (id) { + dispatch(getClaim(id)); + } + dispatch(getClaimants({ page: 1, limit: 100 })); + dispatch(getRatings({ page: 1, limit: 100 })); + }, [id, dispatch]); + + // Show loading state while fetching claim data + if (loading) { + return ( +
+ + + +
+ ); + } + + if (!claim) { + return ; + } + + const onUpdate = (values: FormattedClaimValues) => { + if (id) { + const updatedValues = { + ...claim, + ...values, + id: id, + claimant: values.claimant ? String(values.claimant) : claim.claimant, + rating: values.rating ? String(values.rating) : claim.rating, + }; + + const result = dispatch(updateClaim(updatedValues)); + + if (result && typeof result.then === "function") { + result.then(() => { + // Navigate back to the previous page instead of a fixed route + navigate(-1); + }); + } else { + // If it's not a Promise, navigate directly back + navigate(-1); + } + } + }; + + return ( + <> + + + + ); +} + +export default EditClaim; diff --git a/studio/src/pages/claims/__snapshots__/CreateClaim.test.js.snap b/studio/src/pages/claims/__snapshots__/CreateClaim.test.js.snap deleted file mode 100644 index 70518e43d..000000000 --- a/studio/src/pages/claims/__snapshots__/CreateClaim.test.js.snap +++ /dev/null @@ -1,37 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Claim create component snapshot testing should render the component 1`] = ` - - - -`; diff --git a/studio/src/pages/claims/__snapshots__/EditClaim.test.js.snap b/studio/src/pages/claims/__snapshots__/EditClaim.test.js.snap deleted file mode 100644 index 663fc7cc4..000000000 --- a/studio/src/pages/claims/__snapshots__/EditClaim.test.js.snap +++ /dev/null @@ -1,457 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Claims Edit component snapshot testing should match component with empty data 1`] = ` - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- Sorry, could not find what you are looking for. -
-
-
-
-
-
-`; - -exports[`Claims Edit component snapshot testing should match skeleton while loading 1`] = ` - - - -
-
- - <h3 - className="ant-skeleton-title" - style={ - Object { - "width": "38%", - } - } - /> - - -
    -
  • -
  • -
  • -
-
-
-
-
-
-
-`; - -exports[`Claims Edit component snapshot testing should render the component 1`] = ` - - - -`; diff --git a/studio/src/pages/claims/__snapshots__/index.test.js.snap b/studio/src/pages/claims/__snapshots__/index.test.js.snap deleted file mode 100644 index f80711b0a..000000000 --- a/studio/src/pages/claims/__snapshots__/index.test.js.snap +++ /dev/null @@ -1,15420 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Claims List component snapshot testing should render loader component 1`] = ` - - - - - -
- -
- - - - - - -
-
-
-
-
-
-
-
-`; - -exports[`Claims List component snapshot testing should render the component 1`] = ` - - - - - -
- -
- - - - - -
-
- -
- - - -
- -
- -
- - - - -
- - - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="filters_q" - inputType="input" - onChange={[Function]} - placeholder="search claims" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
-
- - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select claimants - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={128} - listItemHeight={24} - loading={false} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claimants" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select claimants - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={false} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claimants" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select claimants - - -
- - - -
- - - - - -
-
- - - - - -
- - -
- - - - - - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select ratings - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select ratings" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select ratings - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select ratings" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select ratings - - -
- - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - -
-
-
- - - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > -
- } - domRef={ - Object { - "current":
- - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > - - - - - - - Sort By: Latest - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - [Function] - - } - expandedKeys={Set {}} - getRowKey={[Function]} - measureColumnWidth={false} - > - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
- } - > - -
-
- - - - - - - - - - - -
-
- No Data -
-
-
-
-
-
-
-
-
- -
-
- - - - -
- - - - - - - - - - - -`; - -exports[`Claims List component snapshot testing should render the component with cached query data 1`] = ` - - - - - -
- -
- - - - - -
-
- -
- - - -
- -
- -
- - - - -
- - - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="filters_q" - inputType="input" - onChange={[Function]} - placeholder="search claims" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
-
- - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select claimants - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={128} - listItemHeight={24} - loading={false} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claimants" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select claimants - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={false} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claimants" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select claimants - - -
- - - -
- - - - - -
-
- - - - - - - - - - - - - - - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select ratings - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select ratings" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select ratings - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select ratings" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select ratings - - -
- - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - -
-
-
- - - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > -
- } - domRef={ - Object { - "current":
- - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > - - - - - - - Sort By: Latest - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
- - - TOI - - True - - - Invalid date - - - - - -
- - - TOI - - True - - - July 17th 2020 - - - - - -
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
- - - TOI - - True - - - Invalid date - - - - - -
- - - TOI - - True - - - July 17th 2020 - - - - - -
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 2, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
- - - - - - - TOI - - True - - - Invalid date - - - } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={true} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={true} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - - - -
- - - - - - - TOI - - True - - - July 17th 2020 - - - } - okType="primary" - onConfirm={[Function]} - placement="top" - title="Are you sure you want to delete this?" - trigger="click" - > - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - disabled={true} - icon={} - motion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onVisibleChange={[Function]} - overlay={ - - [Function] - - } - overlayClassName="ant-popconfirm" - placement="top" - prefixCls="ant-popover" - title="Are you sure you want to delete this?" - transitionName="ant-zoom-big" - trigger="click" - visible={false} - > - - } - arrowPointAtCenter={false} - autoAdjustOverflow={true} - autoDestroy={false} - blurDelay={0.15} - builtinPlacements={ - Object { - "bottom": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tc", - "bc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "bottomRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - 4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "left": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cr", - "cl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftBottom": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "bl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "leftTop": Object { - "ignoreShake": true, - "offset": Array [ - -4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tr", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "right": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "cl", - "cr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightBottom": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "br", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "rightTop": Object { - "ignoreShake": true, - "offset": Array [ - 4, - 0, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "tl", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "top": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bc", - "tc", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topLeft": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "bl", - "tl", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - "topRight": Object { - "ignoreShake": true, - "offset": Array [ - 0, - -4, - ], - "overflow": Object { - "adjustX": 1, - "adjustY": 1, - }, - "points": Array [ - "br", - "tr", - ], - "targetOffset": Array [ - 0, - 0, - ], - }, - } - } - defaultPopupVisible={false} - destroyPopupOnHide={false} - disabled={true} - focusDelay={0} - getDocument={[Function]} - getPopupClassNameFromAlign={[Function]} - hideAction={Array []} - icon={} - mask={false} - maskClosable={true} - mouseEnterDelay={0.1} - mouseLeaveDelay={0.1} - okType="primary" - onConfirm={[Function]} - onPopupAlign={[Function]} - onPopupVisibleChange={[Function]} - overlay={ - - [Function] - - } - popup={[Function]} - popupAlign={Object {}} - popupClassName="ant-popconfirm" - popupMotion={ - Object { - "motionDeadline": 1000, - "motionName": "ant-zoom-big", - } - } - popupPlacement="top" - popupStyle={Object {}} - popupTransitionName="ant-zoom-big" - popupVisible={false} - prefixCls="ant-popover" - showAction={Array []} - title="Are you sure you want to delete this?" - visible={false} - > - - - - - - - - - -
-
-
-
-
- - - - -
- - - ••• - -
- - } - jumpPrevIcon={ - -
- - - ••• - -
-
- } - locale={ - Object { - "items_per_page": "/ page", - "jump_to": "Go to", - "jump_to_confirm": "confirm", - "next_3": "Next 3 Pages", - "next_5": "Next 5 Pages", - "next_page": "Next Page", - "page": "", - "prev_3": "Previous 3 Pages", - "prev_5": "Previous 5 Pages", - "prev_page": "Previous Page", - } - } - nextIcon={ - - } - onChange={[Function]} - onShowSizeChange={[Function]} - pageSize={10} - pageSizeOptions={ - Array [ - "10", - "15", - "20", - ] - } - prefixCls="ant-pagination" - prevIcon={ - - } - selectComponentClass={ - Object { - "$$typeof": Symbol(react.forward_ref), - "OptGroup": [Function], - "Option": [Function], - "SECRET_COMBOBOX_MODE_DO_NOT_USE": "SECRET_COMBOBOX_MODE_DO_NOT_USE", - "render": [Function], - } - } - selectPrefixCls="ant-select" - showLessItems={false} - showPrevNextJumpers={true} - showQuickJumper={false} - showTitle={true} - showTotal={[Function]} - style={Object {}} - total={2} - totalBoundaryShowSizeChanger={50} - > -
    -
  • - 1-2 of 2 results -
  • -
  • - -
  • - -
  • - - 1 - -
  • -
    -
  • - -
  • - -
-
-
-
-
-
- - - - -
- -
- - - - - -
-
-
-
-`; - -exports[`Claims List component snapshot testing should render the component with data 1`] = ` - - - - - -
- -
- - - - - -
-
- -
- - - -
- -
- -
- - - - -
- - - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="filters_q" - inputType="input" - onChange={[Function]} - placeholder="search claims" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
-
- - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select claimants - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={128} - listItemHeight={24} - loading={false} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claimants" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select claimants - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={false} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claimants" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select claimants - - -
- - - -
- - - - - -
-
- - - - - - - - - - - - - - - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select ratings - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select ratings" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select ratings - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - id="rc_select_TEST_OR_SSR" - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select ratings" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select ratings - - -
- - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - -
-
-
- - - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > -
- } - domRef={ - Object { - "current":
- - - - - Sort By: Latest - -
, - } - } - dropdownClassName="" - id="filters_sort" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - value="desc" - values={ - Array [ - Object { - "disabled": undefined, - "key": "desc", - "label": "Sort By: Latest", - "value": "desc", - }, - ] - } - > - - - - - - - Sort By: Latest - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- -
- -
-
-
- [Function] - - } - expandable={ - Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - } - } - internalHooks="rc-table-internal-hook" - internalRefs={ - Object { - "body": Object { - "current":
-
- - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - } - } - loading={false} - pagination={ - Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - } - } - prefixCls="ant-table" - rowClassName={[Function]} - rowKey={[Function]} - transformColumns={[Function]} - > -
- - [Function] - , - "expandable": Object { - "__PARENT_RENDER_ICON__": undefined, - "childrenColumnName": undefined, - "expandIcon": [Function], - "expandIconColumnIndex": undefined, - "indentSize": 15, - }, - "internalHooks": "rc-table-internal-hook", - "internalRefs": Object { - "body": Object { - "current":
- - - - - - - - - - - - - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
-
-
- - - - - - - - - -
-
- No Data -
-
-
-
, - }, - }, - "loading": false, - "mergedExpandedKeys": Set {}, - "pagination": Object { - "current": 1, - "onChange": [Function], - "pageSize": 10, - "pageSizeOptions": Array [ - "10", - "15", - "20", - ], - "showTotal": [Function], - "total": 0, - }, - "prefixCls": "ant-table", - "rowClassName": [Function], - "rowKey": [Function], - "stickyOffsets": Object { - "left": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "right": Array [ - 0, - 0, - 0, - 0, - 0, - ], - }, - "transformColumns": [Function], - } - } - > -
-
- - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - [Function] - - } - expandedKeys={Set {}} - getRowKey={[Function]} - measureColumnWidth={false} - > - - - - - - - - - - -
- Claim - - Claimant - - Rating - - Claim Date - - Action -
- } - > - -
-
- - - - - - - - - - - -
-
- No Data -
-
-
-
-
-
-
-
-
- -
-
- - - - -
- -
- - - - - -
-
-
-
-`; diff --git a/studio/src/pages/claims/components/ClaimForm.js b/studio/src/pages/claims/components/ClaimForm.js deleted file mode 100644 index 38f2dae62..000000000 --- a/studio/src/pages/claims/components/ClaimForm.js +++ /dev/null @@ -1,346 +0,0 @@ -import React from 'react'; -import { Button, Form, Input, DatePicker, Row, Col, Collapse, ConfigProvider } from 'antd'; -import Selector from '../../../components/Selector'; -import { maker } from '../../../utils/sluger'; -import dayjs from 'dayjs'; -import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; -import getJsonValue from '../../../utils/getJsonValue'; -import { DescriptionInput, MetaForm, SlugInput } from '../../../components/FormItems'; - -const layout = { - // labelCol: { - // span: 8, - // offset: 2, - // }, - // wrapperCol: { - // span: 20, - // offset: 2, - // }, -}; - -const ClaimForm = ({ onCreate, data = {} }) => { - const [isMobileScreen, setIsMobileScreen] = React.useState(false); - - React.useEffect(() => { - const handleResize = () => { - if (window.innerWidth < 768) { - setIsMobileScreen(true); - } else { - setIsMobileScreen(false); - } - }; - window.addEventListener('resize', handleResize); - handleResize(); - return () => window.removeEventListener('resize', handleResize); - }, []); - - if (data && data.meta_fields) { - if (typeof data.meta_fields !== 'string') { - data.meta_fields = JSON.stringify(data.meta_fields); - } - } - const [form] = Form.useForm(); - const [valueChange, setValueChange] = React.useState(false); - const { Panel } = Collapse; - const [activeKey, setActiveKey] = React.useState(['1', '2']); - - const onReset = () => { - form.resetFields(); - }; - - const disabledDate = (current) => { - return current.valueOf() > Date.now(); - }; - - const onSave = (values) => { - values.claimant_id = values.claimant || 0; - values.rating_id = values.rating || 0; - values.claim_date = values.claim_date - ? dayjs(values.claim_date).format('YYYY-MM-DDTHH:mm:ssZ') - : null; - values.checked_date = values.checked_date - ? dayjs(values.checked_date).format('YYYY-MM-DDTHH:mm:ssZ') - : null; - - onCreate(values); - }; - - const onClaimChange = (string) => { - if (string.length > 150) { - form.setFieldsValue({ - slug: maker(string.substring(0, 150)), - }); - } else { - form.setFieldsValue({ - slug: maker(string), - }); - } - }; - - if (data && data.id) { - data.claim_date = data.claim_date ? dayjs(data.claim_date) : null; - data.checked_date = data.checked_date ? dayjs(data.checked_date) : null; - } - - const handleCollapse = (props) => { - setActiveKey(props); - }; - - return ( - -
{ - if (values.meta_fields) { - values.meta_fields = getJsonValue(values.meta_fields); - } - onSave(values); - onReset(); - }} - onFinishFailed={(errors) => { - let name = errors.errorFields[0].name[0]; - if (['claim', 'slug', 'claimant', 'rating'].includes(name)) { - setActiveKey(['1']); - } else { - setActiveKey(['2']); - } - if (errors.errorFields[0].name[0] !== 'review_sources') { - } - if (errors.errorFields[0].name[0] !== 'claim_sources') { - } - }} - onValuesChange={() => { - setValueChange(true); - }} - scrollToFirstError={true} - layout="vertical" - > - - - - handleCollapse(props)} - expandIconPosition="right" - expandIcon={({ isActive }) => } - > - - - - - onClaimChange(e.target.value)} - /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - handleCollapse(props)} - expandIconPosition="right" - expandIcon={({ isActive }) => } - > - - - - - {(fields, { add, remove }) => ( - <> - {fields.map((field) => ( - - - - - - - - - - - - remove(field.name)} /> - - ))} - - - - - )} - - - - - {(fields, { add, remove }) => ( - <> - {fields.map((field) => ( - - - - - - - - - - - - remove(field.name)} /> - - ))} - - - - - )} - - - - - - - -
- ); -}; - -export default ClaimForm; diff --git a/studio/src/pages/claims/components/ClaimForm.test.js b/studio/src/pages/claims/components/ClaimForm.test.js deleted file mode 100644 index 73c448430..000000000 --- a/studio/src/pages/claims/components/ClaimForm.test.js +++ /dev/null @@ -1,684 +0,0 @@ -import React from 'react'; -import { Provider, useSelector, useDispatch } from 'react-redux'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import { act } from '@testing-library/react'; -import { shallow, mount } from 'enzyme'; -import { DatePicker, Input, Collapse } from 'antd'; -import moment from 'moment'; -import { MinusCircleOutlined } from '@ant-design/icons'; - -import '../../../matchMedia.mock'; -import ClaimCreateForm from './ClaimForm'; -import { SlugInput } from '../../../components/FormItems'; - -jest.mock('@editorjs/editorjs'); -jest.mock('react-monaco-editor', () => { - const MonacoEditor = () =>
; - return MonacoEditor; -}); -jest.mock('../../../actions/claimants', () => ({ - ...jest.requireActual('../../../actions/claimants'), - addClaimant: jest.fn(), -})); - -const data = { - claim: 'title', - slug: 'slug', - claimant: 1, - rating: 1, - claim_date: moment(new Date('2020-12-12')), - checked_date: moment(new Date('2020-12-12')), - claim_sources: 'claim_sources', - fact: 'review', - review_tag_line: 'review_tag_line', - review_sources: 'review_sources', - description: { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: - 'Hey. Meet the new Editor. On this page you can see it in action — try to edit this text.', - }, - }, - ], - version: '2.18.0', - }, -}; - -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useSelector: jest.fn(), - useDispatch: jest.fn(), -})); - -const middlewares = [thunk]; -const mockStore = configureMockStore(middlewares); - -let onCreate, store; - -describe('Claims Create Form component', () => { - store = mockStore({ - claims: { - req: [], - details: {}, - loading: true, - }, - claimants: { - req: [], - details: {}, - loading: true, - }, - rating: { - req: [], - details: {}, - loading: true, - }, - media: { - req: [], - details: {}, - loading: true, - }, - }); - useDispatch.mockReturnValue(jest.fn(() => Promise.resolve({}))); - useSelector.mockImplementation((state) => ({ details: [], total: 0, loading: false })); - - describe('snapshot testing', () => { - beforeEach(() => { - onCreate = jest.fn(); - onCreate.mockImplementationOnce( - (values) => new Promise((resolve, reject) => resolve(values)), - ); - }); - it('should render the component', () => { - const tree = shallow( - - - , - ); - expect(tree).toMatchSnapshot(); - }); - it('should match component with data', () => { - const tree = shallow( - - - , - ); - expect(tree).toMatchSnapshot(); - }); - }); - describe('component testing', () => { - let wrapper, props; - beforeEach(() => { - props = { - onCreate: jest.fn(), - data: data, - }; - act(() => { - wrapper = mount( - - - , - ); - }); - }); - afterEach(() => { - wrapper.unmount(); - }); - it('should not submit form with empty data', (done) => { - act(() => { - wrapper = mount( - - - , - ); - }); - - act(() => { - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.props().disabled).toBe(true); - }); - wrapper.update(); - - setTimeout(() => { - expect(props.onCreate).not.toHaveBeenCalled(); - done(); - }, 0); - }); - it('should submit form with given data', (done) => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - act(() => { - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Submit'); - submitButtom.simulate('submit'); - }); - wrapper.update(); - - setTimeout(() => { - expect(props.onCreate).toHaveBeenCalledTimes(1); - expect(props.onCreate).toHaveBeenCalledWith({ - claim: 'title', - slug: 'slug', - claimant: 1, - claimant_id: 1, - rating: 1, - rating_id: 1, - claim_date: moment(new Date('2020-12-12')).format('YYYY-MM-DDTHH:mm:ssZ'), - checked_date: moment(new Date('2020-12-12')).format('YYYY-MM-DDTHH:mm:ssZ'), - claim_sources: 'claim_sources', - fact: 'review', - review_sources: 'review_sources', - meta: { - canonical_URL: undefined, - description: undefined, - title: undefined, - }, - description: { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: - 'Hey. Meet the new Editor. On this page you can see it in action — try to edit this text.', - }, - }, - ], - version: '2.18.0', - }, - }); - done(); - }, 0); - }); - it('should submit form with new name', (done) => { - const data2 = { ...data, id: 1 }; - data2.meta_fields = { - sample: 'testing', - }; - act(() => { - wrapper = mount( - - - , - ); - }); - act(() => { - wrapper.find(Collapse).at(2).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - - act(() => { - const input = wrapper.find('FormItem').at(1).find('TextArea').at(0); - input.simulate('change', { - target: { - value: - 'new name new claim title for testing claim update and testing slug update. slug maker should take only first one hundred and fifty characters to create a slug and not all characters from title, since claim title can be more than 150', - }, - }); - wrapper.find(Collapse).at(0).find('Button').at(0).simulate('click'); - - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Update'); - submitButtom.simulate('submit'); - }); - - setTimeout(() => { - expect(props.onCreate).toHaveBeenCalledTimes(1); - expect(props.onCreate).toHaveBeenCalledWith({ - claim: - 'new name new claim title for testing claim update and testing slug update. slug maker should take only first one hundred and fifty characters to create a slug and not all characters from title, since claim title can be more than 150', - slug: - 'new-name-new-claim-title-for-testing-claim-update-and-testing-slug-update-slug-maker-should-take-only-first-one-hundred-and-fifty-characters-to-creat', - claimant: 1, - claimant_id: 1, - rating: 1, - rating_id: 1, - claim_date: moment(new Date('2020-12-12')).format('YYYY-MM-DDTHH:mm:ssZ'), - checked_date: moment(new Date('2020-12-12')).format('YYYY-MM-DDTHH:mm:ssZ'), - claim_sources: 'claim_sources', - fact: 'review', - review_sources: 'review_sources', - description: { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: - 'Hey. Meet the new Editor. On this page you can see it in action — try to edit this text.', - }, - }, - ], - version: '2.18.0', - }, - meta_fields: { - sample: 'testing', - }, - }); - done(); - }, 0); - }); - it('should submit form with updated data', (done) => { - const newDescription = { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: 'updated description', - }, - }, - ], - version: '2.18.0', - }; - wrapper.update(); - act(() => { - wrapper - .find('FormItem') - .at(9) - .find('Editor') - .at(0) - .props() - .onChange({ target: { value: newDescription } }); - wrapper - .find('FormItem') - .at(1) - .find('TextArea') - .at(0) - .simulate('change', { target: { value: 'new name' } }); - wrapper - .find(SlugInput) - .find('FormItem') - .find('input') - .simulate('change', { target: { value: 'new-slug' } }); - wrapper - .find('FormItem') - .at(4) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: 2 } }); - wrapper - .find('FormItem') - .at(5) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: 3 } }); - wrapper - .find('FormItem') - .at(7) - .find(DatePicker) - .at(0) - .props() - .onChange({ target: { value: moment(new Date('2020-01-01')) } }); - wrapper - .find('FormItem') - .at(8) - .find(DatePicker) - .at(0) - .props() - .onChange({ target: { value: moment(new Date('2020-04-04')) } }); - wrapper - .find('FormItem') - .at(3) - .find('TextArea') - .at(0) - .simulate('change', { target: { value: 'new review' } }); - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Submit'); - submitButtom.simulate('submit'); - }); - - setTimeout(() => { - expect(props.onCreate).toHaveBeenCalledTimes(1); - expect(props.onCreate).toHaveBeenCalledWith({ - claim: 'new name', - slug: 'new-slug', - claimant: 2, - claimant_id: 2, - rating: 3, - rating_id: 3, - claim_date: moment(new Date('2020-01-01')).format('YYYY-MM-DDTHH:mm:ssZ'), - checked_date: moment(new Date('2020-04-04')).format('YYYY-MM-DDTHH:mm:ssZ'), - claim_sources: 'claim_sources', - fact: 'new review', - review_sources: 'review_sources', - description: newDescription, - }); - done(); - }, 0); - }); - - it('should highlight form field with error in first panel', () => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - act(() => { - wrapper - .find('FormItem') - .at(1) - .find('TextArea') - .at(0) - .simulate('change', { target: { value: '' } }); - wrapper - .find('FormItem') - .at(4) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: 2 } }); - wrapper - .find('FormItem') - .at(5) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: 3 } }); - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Submit'); - submitButtom.simulate('submit'); - }); - expect(props.onCreate).not.toHaveBeenCalled(); - }); - it('should highlight form field with error in second panel', () => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - act(() => { - wrapper - .find('FormItem') - .at(1) - .find('TextArea') - .at(0) - .simulate('change', { target: { value: 'claim' } }); - wrapper - .find(SlugInput) - .find('FormItem') - .find('input') - .simulate('change', { target: { value: 'new-slug' } }); - wrapper - .find('FormItem') - .at(4) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: 2 } }); - wrapper - .find('FormItem') - .at(5) - .find('Select') - .at(0) - .props() - .onChange({ target: { value: 3 } }); - }); - act(() => { - const formListInputCount = wrapper.find('FormList').find('Input').length; - expect(formListInputCount).toBe(0); - act(() => { - const button = wrapper.find('FormItem').at(10).find('Button').at(0); - expect(button.text()).toBe('Add Claim sources'); - button.simulate('click'); - }); - }); - act(() => { - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Submit'); - submitButtom.simulate('submit'); - }); - expect(props.onCreate).not.toHaveBeenCalled(); - }); - it('should add review sources input field on button click', () => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - const formListInputCount = wrapper.find('FormList').find('Input').length; - expect(formListInputCount).toBe(0); - act(() => { - const button = wrapper.find('FormItem').at(12).find('Button').at(0); - expect(button.text()).toBe('Add Review sources'); - button.simulate('click'); - }); - wrapper.update(); - expect(wrapper.find('FormList').find(Input).length).not.toBe(0); - }); - it('should remove review sources input field on button click', () => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - act(() => { - const button = wrapper.find('FormItem').at(12).find('Button'); - expect(button.text()).toBe('Add Review sources'); - button.simulate('click'); - }); - wrapper.update(); - const formInputFieldCount = wrapper.find('FormList').find(Input).length; - act(() => { - wrapper.find('FormList').find(MinusCircleOutlined).at(0).simulate('click'); - }); - wrapper.update(); - expect(wrapper.find('FormList').find(Input).length).toBe(formInputFieldCount - 2); - }); - it('should add claim sources input field on button click', () => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - const formListInputCount = wrapper.find('FormList').find('Input').length; - expect(formListInputCount).toBe(0); - act(() => { - const button = wrapper.find('FormItem').at(11).find('Button').at(0); - expect(button.text()).toBe('Add Claim sources'); - button.simulate('click'); - }); - wrapper.update(); - expect(wrapper.find('FormList').find(Input).length).not.toBe(0); - }); - it('should remove claim sources input field on button click', () => { - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - act(() => { - const button = wrapper.find('FormItem').at(11).find('Button'); - expect(button.text()).toBe('Add Claim sources'); - button.simulate('click'); - }); - wrapper.update(); - const formInputFieldCount = wrapper.find('FormList').find(Input).length; - act(() => { - wrapper.find('FormList').find(MinusCircleOutlined).at(0).simulate('click'); - }); - wrapper.update(); - expect(wrapper.find('FormList').find(Input).length).toBe(formInputFieldCount - 2); - }); - it('should submit with no dates', (done) => { - const data2 = { - claim: 'title', - slug: 'slug', - claimant: 1, - rating: 1, - claim_sources: 'claim_sources', - fact: 'review', - review_sources: 'review_sources', - description: { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: - 'Hey. Meet the new Editor. On this page you can see it in action — try to edit this text.', - }, - }, - ], - version: '2.18.0', - }, - }; - act(() => { - wrapper = mount( - - - , - ); - }); - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - act(() => { - const submitButtom = wrapper.find('Button').at(0); - expect(submitButtom.text()).toBe('Submit'); - submitButtom.simulate('submit'); - }); - - setTimeout(() => { - expect(props.onCreate).toHaveBeenCalledTimes(1); - expect(props.onCreate).toHaveBeenCalledWith({ - claim: 'title', - slug: 'slug', - claimant: 1, - claimant_id: 1, - rating: 1, - rating_id: 1, - claim_date: null, - checked_date: null, - claim_sources: 'claim_sources', - fact: 'review', - review_sources: 'review_sources', - description: { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: - 'Hey. Meet the new Editor. On this page you can see it in action — try to edit this text.', - }, - }, - ], - version: '2.18.0', - }, - meta: { - canonical_URL: undefined, - description: undefined, - title: undefined, - }, - }); - done(); - }, 0); - }); - - it('should not submit with empty url for review sources', (done) => { - const data2 = { - id: 1, - claim: 'title', - slug: 'slug', - claimant: 1, - rating: 1, - claim_sources: 'claim_sources', - fact: 'review', - description: { - time: 1595747741807, - blocks: [ - { - type: 'header', - data: { - text: 'Editor.js', - level: 2, - }, - }, - { - type: 'paragraph', - data: { - text: - 'Hey. Meet the new Editor. On this page you can see it in action — try to edit this text.', - }, - }, - ], - version: '2.18.0', - }, - }; - act(() => { - wrapper = mount( - - - , - ); - }); - act(() => { - wrapper.find(Collapse).at(1).find('Button').at(0).simulate('click'); - }); - wrapper.update(); - const formListInputCount = wrapper.find('FormList').find('Input').length; - expect(formListInputCount).toBe(0); - act(() => { - const button = wrapper.find('FormItem').at(12).find('Button').at(0); - expect(button.text()).toBe('Add Review sources'); - button.simulate('click'); - }); - wrapper.update(); - act(() => { - const submitButtom = wrapper.find('Button').at(0); - submitButtom.simulate('submit'); - wrapper.update(); - }); - - setTimeout(() => { - expect(props.onCreate).toHaveBeenCalledTimes(0); - done(); - }, 0); - }); - }); -}); diff --git a/studio/src/pages/claims/components/ClaimForm.tsx b/studio/src/pages/claims/components/ClaimForm.tsx new file mode 100644 index 000000000..6cc0d3ad2 --- /dev/null +++ b/studio/src/pages/claims/components/ClaimForm.tsx @@ -0,0 +1,392 @@ +import React, { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Textarea } from "@/components/ui/textarea"; +import { DatePicker } from "@/components/ui/DatePicker"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { useForm, useFieldArray } from "react-hook-form"; +import Selector from "../../../components/Selector/index"; +import { maker } from "../../../utils/sluger"; +import getJsonValue from "../../../utils/getJsonValue"; +import { + MetaForm, + SlugInput, + DescriptionInput, +} from "../../../components/FormItems"; +import { useNavigate } from "react-router-dom"; +import SourcesSection from "./SourcesSection"; +import { + ClaimFormValues, + FormattedClaimValues, + ClaimFormProps, +} from "../types"; + +interface ExtendedClaimFormProps extends ClaimFormProps { + compact?: boolean; +} + +const ClaimForm: React.FC = ({ + onCreate, + data = {}, + compact = false, +}) => { + const [valueChange, setValueChange] = useState(false); + const [activeKeys, setActiveKeys] = useState([ + "general", + "sources", + ]); + const navigate = useNavigate(); + + // Initialize form with data + const initialData = { ...data }; + if (initialData.meta_fields && typeof initialData.meta_fields !== "string") { + initialData.meta_fields = JSON.stringify(initialData.meta_fields); + } + + const handleCancel = () => { + if (!compact) { + navigate(-1); + } + }; + + const form = useForm({ + defaultValues: initialData, + }); + + const claimSourcesArray = useFieldArray({ + control: form.control, + name: "claim_sources", + }); + + const reviewSourcesArray = useFieldArray({ + control: form.control, + name: "review_sources", + }); + + const onReset = () => { + form.reset(); + }; + + const disabledDate = (date: Date) => { + return date > new Date(); + }; + + const onSave = (values: ClaimFormValues) => { + const { claim_date, checked_date, ...rest } = values; + const formattedValues: FormattedClaimValues = { + ...rest, + claimant_id: values.claimant || 0, + rating_id: values.rating || 0, + }; + + if (claim_date) { + const date = new Date(claim_date); + formattedValues.claim_date = date.toISOString(); + } + + if (checked_date) { + const date = new Date(checked_date); + formattedValues.checked_date = date.toISOString(); + } + + onCreate(formattedValues); + }; + + const onClaimChange = (value: string) => { + if (value.length > 150) { + form.setValue("slug", maker(value.substring(0, 150))); + } else { + form.setValue("slug", maker(value)); + } + }; + + return ( +
+
+ {!compact && ( +
+

+ {data && data.id ? "Edit Claim" : "Create Claim"} +

+

+ Set up a claim to help organize by utilizing the advanced options + provided below. +

+
+ )} + +
+ { + const formValues = { ...values }; + if (formValues.meta_fields) { + formValues.meta_fields = getJsonValue(formValues.meta_fields); + } + onSave(formValues); + onReset(); + })} + onKeyDown={(e) => { + if ( + e.key === "Enter" && + e.target instanceof HTMLTextAreaElement === false + ) { + e.preventDefault(); + } + }} + > + + + +
+ General +
+
+ +
+ ( + + + Claim + + + - - - -
-
- - - - - -
- - -
- - - - - - - - - -
- - - -
-
-
- - -
- - -
-
- - - - - -
- - -
- - - - - - - Post Settings - - } - visible={false} - width={366} - > - - Post Settings - - } - visible={false} - width={366} - > - -
- -
-
-
-
-
-
-
-

- Post Settings -

-
- -
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - Cancel - , - - Ok - , - ] - } - okType="primary" - onCancel={[Function]} - visible={false} - width="800px" - > - - - - } - confirmLoading={false} - focusTriggerAfterClose={true} - footer={ - Array [ - - Cancel - , - - Ok - , - ] - } - maskTransitionName="ant-fade" - okType="primary" - onCancel={[Function]} - onClose={[Function]} - prefixCls="ant-modal" - transitionName="ant-zoom" - visible={false} - width="800px" - wrapClassName="" - > - - - - -
- -
-
-
- - - -
-
-
-
-
-
-
-
-
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select claims - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claims" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select claims - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select claims" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select claims - - -
- - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - -
- - - - - -
-
- - - - - -
- - -
- - - - - - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - handleReset={[Function]} - id="excerpt" - inputType="text" - placeholder="Excerpt" - prefixCls="ant-input" - rows={4} - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="subtitle" - inputType="input" - onChange={[Function]} - placeholder="Subtitle" - prefixCls="ant-input" - style={ - Object { - "fontSize": "medium", - } - } - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="slug" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="factcheck-1" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - components={ - Object { - "button": [Function], - "rangeItem": [Function], - } - } - generateConfig={ - Object { - "addDate": [Function], - "addMonth": [Function], - "addYear": [Function], - "getDate": [Function], - "getEndDate": [Function], - "getFixedDate": [Function], - "getHour": [Function], - "getMinute": [Function], - "getMonth": [Function], - "getNow": [Function], - "getSecond": [Function], - "getWeekDay": [Function], - "getYear": [Function], - "isAfter": [Function], - "isValidate": [Function], - "locale": Object { - "format": [Function], - "getShortMonths": [Function], - "getShortWeekDays": [Function], - "getWeek": [Function], - "getWeekFirstDate": [Function], - "getWeekFirstDay": [Function], - "parse": [Function], - }, - "setDate": [Function], - "setHour": [Function], - "setMinute": [Function], - "setMonth": [Function], - "setSecond": [Function], - "setYear": [Function], - } - } - id="published_date" - locale={ - Object { - "backToToday": "Back to today", - "clear": "Clear", - "dateFormat": "M/D/YYYY", - "dateSelect": "select date", - "dateTimeFormat": "M/D/YYYY HH:mm:ss", - "dayFormat": "D", - "decadeSelect": "Choose a decade", - "locale": "en_US", - "month": "Month", - "monthBeforeYear": true, - "monthPlaceholder": "Select month", - "monthSelect": "Choose a month", - "nextCentury": "Next century", - "nextDecade": "Next decade", - "nextMonth": "Next month (PageDown)", - "nextYear": "Next year (Control + right)", - "now": "Now", - "ok": "Ok", - "placeholder": "Select date", - "previousCentury": "Last century", - "previousDecade": "Last decade", - "previousMonth": "Previous month (PageUp)", - "previousYear": "Last year (Control + left)", - "quarterPlaceholder": "Select quarter", - "rangeMonthPlaceholder": Array [ - "Start month", - "End month", - ], - "rangePlaceholder": Array [ - "Start date", - "End date", - ], - "rangeWeekPlaceholder": Array [ - "Start week", - "End week", - ], - "rangeYearPlaceholder": Array [ - "Start year", - "End year", - ], - "timeSelect": "select time", - "today": "Today", - "weekPlaceholder": "Select week", - "weekSelect": "Choose a week", - "year": "Year", - "yearFormat": "YYYY", - "yearPlaceholder": "Select year", - "yearSelect": "Choose a year", - } - } - nextIcon={ - - } - onChange={[Function]} - placeholder="Select date" - prefixCls="ant-picker" - prevIcon={ - - } - showToday={true} - suffixIcon={} - superNextIcon={ - - } - superPrevIcon={ - - } - transitionName="ant-slide-up" - value={null} - > - } - components={ - Object { - "button": [Function], - "rangeItem": [Function], - } - } - generateConfig={ - Object { - "addDate": [Function], - "addMonth": [Function], - "addYear": [Function], - "getDate": [Function], - "getEndDate": [Function], - "getFixedDate": [Function], - "getHour": [Function], - "getMinute": [Function], - "getMonth": [Function], - "getNow": [Function], - "getSecond": [Function], - "getWeekDay": [Function], - "getYear": [Function], - "isAfter": [Function], - "isValidate": [Function], - "locale": Object { - "format": [Function], - "getShortMonths": [Function], - "getShortWeekDays": [Function], - "getWeek": [Function], - "getWeekFirstDate": [Function], - "getWeekFirstDay": [Function], - "parse": [Function], - }, - "setDate": [Function], - "setHour": [Function], - "setMinute": [Function], - "setMonth": [Function], - "setSecond": [Function], - "setYear": [Function], - } - } - id="published_date" - locale={ - Object { - "backToToday": "Back to today", - "clear": "Clear", - "dateFormat": "M/D/YYYY", - "dateSelect": "select date", - "dateTimeFormat": "M/D/YYYY HH:mm:ss", - "dayFormat": "D", - "decadeSelect": "Choose a decade", - "locale": "en_US", - "month": "Month", - "monthBeforeYear": true, - "monthPlaceholder": "Select month", - "monthSelect": "Choose a month", - "nextCentury": "Next century", - "nextDecade": "Next decade", - "nextMonth": "Next month (PageDown)", - "nextYear": "Next year (Control + right)", - "now": "Now", - "ok": "Ok", - "placeholder": "Select date", - "previousCentury": "Last century", - "previousDecade": "Last decade", - "previousMonth": "Previous month (PageUp)", - "previousYear": "Last year (Control + left)", - "quarterPlaceholder": "Select quarter", - "rangeMonthPlaceholder": Array [ - "Start month", - "End month", - ], - "rangePlaceholder": Array [ - "Start date", - "End date", - ], - "rangeWeekPlaceholder": Array [ - "Start week", - "End week", - ], - "rangeYearPlaceholder": Array [ - "Start year", - "End year", - ], - "timeSelect": "select time", - "today": "Today", - "weekPlaceholder": "Select week", - "weekSelect": "Choose a week", - "year": "Year", - "yearFormat": "YYYY", - "yearPlaceholder": "Select year", - "yearSelect": "Choose a year", - } - } - nextIcon={ - - } - onChange={[Function]} - pickerRef={ - Object { - "current": Object { - "blur": [Function], - "focus": [Function], - }, - } - } - placeholder="Select date" - prefixCls="ant-picker" - prevIcon={ - - } - showToday={true} - suffixIcon={} - superNextIcon={ - - } - superPrevIcon={ - - } - transitionName="ant-slide-up" - value={null} - > - - } - components={ - Object { - "button": [Function], - "rangeItem": [Function], - } - } - generateConfig={ - Object { - "addDate": [Function], - "addMonth": [Function], - "addYear": [Function], - "getDate": [Function], - "getEndDate": [Function], - "getFixedDate": [Function], - "getHour": [Function], - "getMinute": [Function], - "getMonth": [Function], - "getNow": [Function], - "getSecond": [Function], - "getWeekDay": [Function], - "getYear": [Function], - "isAfter": [Function], - "isValidate": [Function], - "locale": Object { - "format": [Function], - "getShortMonths": [Function], - "getShortWeekDays": [Function], - "getWeek": [Function], - "getWeekFirstDate": [Function], - "getWeekFirstDay": [Function], - "parse": [Function], - }, - "setDate": [Function], - "setHour": [Function], - "setMinute": [Function], - "setMonth": [Function], - "setSecond": [Function], - "setYear": [Function], - } - } - id="published_date" - locale={ - Object { - "backToToday": "Back to today", - "clear": "Clear", - "dateFormat": "M/D/YYYY", - "dateSelect": "select date", - "dateTimeFormat": "M/D/YYYY HH:mm:ss", - "dayFormat": "D", - "decadeSelect": "Choose a decade", - "locale": "en_US", - "month": "Month", - "monthBeforeYear": true, - "monthPlaceholder": "Select month", - "monthSelect": "Choose a month", - "nextCentury": "Next century", - "nextDecade": "Next decade", - "nextMonth": "Next month (PageDown)", - "nextYear": "Next year (Control + right)", - "now": "Now", - "ok": "Ok", - "placeholder": "Select date", - "previousCentury": "Last century", - "previousDecade": "Last decade", - "previousMonth": "Previous month (PageUp)", - "previousYear": "Last year (Control + left)", - "quarterPlaceholder": "Select quarter", - "rangeMonthPlaceholder": Array [ - "Start month", - "End month", - ], - "rangePlaceholder": Array [ - "Start date", - "End date", - ], - "rangeWeekPlaceholder": Array [ - "Start week", - "End week", - ], - "rangeYearPlaceholder": Array [ - "Start year", - "End year", - ], - "timeSelect": "select time", - "today": "Today", - "weekPlaceholder": "Select week", - "weekSelect": "Choose a week", - "year": "Year", - "yearFormat": "YYYY", - "yearPlaceholder": "Select year", - "yearSelect": "Choose a year", - } - } - nextIcon={ - - } - onChange={null} - onPanelChange={[Function]} - onSelect={[Function]} - pickerRef={ - Object { - "current": Object { - "blur": [Function], - "focus": [Function], - }, - } - } - placeholder="Select date" - prefixCls="ant-picker" - prevIcon={ - - } - showToday={true} - suffixIcon={} - superNextIcon={ - - } - superPrevIcon={ - - } - tabIndex={-1} - transitionName="ant-slide-up" - value={null} - /> -
- } - popupPlacement="bottomLeft" - prefixCls="ant-picker" - transitionName="ant-slide-up" - visible={false} - > - - } - components={ - Object { - "button": [Function], - "rangeItem": [Function], - } - } - generateConfig={ - Object { - "addDate": [Function], - "addMonth": [Function], - "addYear": [Function], - "getDate": [Function], - "getEndDate": [Function], - "getFixedDate": [Function], - "getHour": [Function], - "getMinute": [Function], - "getMonth": [Function], - "getNow": [Function], - "getSecond": [Function], - "getWeekDay": [Function], - "getYear": [Function], - "isAfter": [Function], - "isValidate": [Function], - "locale": Object { - "format": [Function], - "getShortMonths": [Function], - "getShortWeekDays": [Function], - "getWeek": [Function], - "getWeekFirstDate": [Function], - "getWeekFirstDay": [Function], - "parse": [Function], - }, - "setDate": [Function], - "setHour": [Function], - "setMinute": [Function], - "setMonth": [Function], - "setSecond": [Function], - "setYear": [Function], - } - } - id="published_date" - locale={ - Object { - "backToToday": "Back to today", - "clear": "Clear", - "dateFormat": "M/D/YYYY", - "dateSelect": "select date", - "dateTimeFormat": "M/D/YYYY HH:mm:ss", - "dayFormat": "D", - "decadeSelect": "Choose a decade", - "locale": "en_US", - "month": "Month", - "monthBeforeYear": true, - "monthPlaceholder": "Select month", - "monthSelect": "Choose a month", - "nextCentury": "Next century", - "nextDecade": "Next decade", - "nextMonth": "Next month (PageDown)", - "nextYear": "Next year (Control + right)", - "now": "Now", - "ok": "Ok", - "placeholder": "Select date", - "previousCentury": "Last century", - "previousDecade": "Last decade", - "previousMonth": "Previous month (PageUp)", - "previousYear": "Last year (Control + left)", - "quarterPlaceholder": "Select quarter", - "rangeMonthPlaceholder": Array [ - "Start month", - "End month", - ], - "rangePlaceholder": Array [ - "Start date", - "End date", - ], - "rangeWeekPlaceholder": Array [ - "Start week", - "End week", - ], - "rangeYearPlaceholder": Array [ - "Start year", - "End year", - ], - "timeSelect": "select time", - "today": "Today", - "weekPlaceholder": "Select week", - "weekSelect": "Choose a week", - "year": "Year", - "yearFormat": "YYYY", - "yearPlaceholder": "Select year", - "yearSelect": "Choose a year", - } - } - nextIcon={ - - } - onChange={null} - onPanelChange={[Function]} - onSelect={[Function]} - pickerRef={ - Object { - "current": Object { - "blur": [Function], - "focus": [Function], - }, - } - } - placeholder="Select date" - prefixCls="ant-picker" - prevIcon={ - - } - showToday={true} - suffixIcon={} - superNextIcon={ - - } - superPrevIcon={ - - } - tabIndex={-1} - transitionName="ant-slide-up" - value={null} - /> -
- } - popupAlign={Object {}} - popupClassName="" - popupPlacement="bottomLeft" - popupStyle={Object {}} - popupTransitionName="ant-slide-up" - popupVisible={false} - prefixCls="ant-picker-dropdown" - showAction={Array []} - > -
-
- - - - - - - - - - - - -
-
- - - - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - } - /> - } - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - placeholder="Select categories" - searchValue="" - value={Array []} - > - - -
-
-
- - Select categories - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={ - } - /> - } - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select categories" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select categories - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={ - } - /> - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select categories" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select categories - - - - - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - } - /> - } - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - placeholder="Select tags" - searchValue="" - value={Array []} - > - - -
-
-
- - Select tags - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={ - } - /> - } - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select tags" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select tags - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={ - } - /> - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select tags" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select tags - - - - - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - -
-
-
- - Select authors - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - key="trigger" - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select authors" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > -
- } - defaultValue={Array []} - domRef={ - Object { - "current":
-
-
- -
-
- - Select authors - -
, - } - } - dropdownClassName="" - filterOption={[Function]} - getPopupContainer={[Function]} - inputElement={null} - inputIcon={ - - } - inputRef={ - Object { - "current": , - } - } - listHeight={128} - listItemHeight={24} - loading={true} - menuItemSelectedIcon={} - mode="multiple" - multiple={true} - notFoundContent={null} - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onPopupScroll={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - placeholder="Select authors" - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={true} - tokenWithEnter={false} - transitionName="ant-slide-up" - value={Array []} - values={Array []} - > - - - - -   - -
- } - > -
- -
-
- - - - -   - -
-
-
-
- - - Select authors - - - - - - - - } - customizeIconProps={ - Object { - "focused": false, - "loading": true, - "open": undefined, - "searchValue": "", - "showSearch": true, - } - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - Copy - , - - Test in Google Rich Results Text - , - ] - } - okType="primary" - onCancel={[Function]} - onOk={[Function]} - title="View Schemas" - visible={false} - width={520} - > - - - - } - confirmLoading={false} - focusTriggerAfterClose={true} - footer={ - Array [ - - Copy - , - - Test in Google Rich Results Text - , - ] - } - maskTransitionName="ant-fade" - okType="primary" - onCancel={[Function]} - onClose={[Function]} - onOk={[Function]} - prefixCls="ant-modal" - title="View Schemas" - transitionName="ant-zoom" - visible={false} - width={520} - wrapClassName="" - > - - - - - - - - - - - - - - - Post Meta data - - } - visible={false} - width={480} - > - - Post Meta data - - } - visible={false} - width={480} - > - -
- -
-
-
-
-
-
-
-

- Post Meta data -

-
- -
-
- - -
- - - -
-
-
- - -
-
- - - - - -
- -
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="meta_title" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - handleReset={[Function]} - id="meta_description" - inputType="text" - prefixCls="ant-input" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="meta_canonical_URL" - inputType="input" - onChange={[Function]} - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
-
-
-
-
-
- -
- - - - - Code Injection - - } - visible={false} - width={710} - > - - Code Injection - - } - visible={false} - width={710} - > - -
- -
-
-
-
-
-
-
-

- Code Injection -

-
- -
-
- - -
- - - -
-
-
- - -
-
- - - - - -
- -
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - -
- - - -
-
- - - - - -
- - -
- - - - - - - - -
- - -
- -
- -
- - -
-
-
- - - -
- - - -
-
- - - - - -
- - -
- - - - -
-
-
-
-
- -
- - - - - Meta Fields - - } - visible={false} - width={480} - > - - Meta Fields - - } - visible={false} - width={480} - > - -
- -
-
-
-
-
-
-
-

- Meta Fields -

-
- -
-
- - -
- - - -
-
-
- - -
-
- - - - - -
- -
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - -
- - - -
-
- - - - - -
- add JSON if you have to pass any extra data -
-
- - -
- - - - -
-
-
-
-
- -
- - - -
- -
- -
- -
- - - - - - - - - - -`; diff --git a/studio/src/pages/fact-checks/__snapshots__/GoogleFactCheck.test.js.snap b/studio/src/pages/fact-checks/__snapshots__/GoogleFactCheck.test.js.snap deleted file mode 100644 index c19d9f26a..000000000 --- a/studio/src/pages/fact-checks/__snapshots__/GoogleFactCheck.test.js.snap +++ /dev/null @@ -1,9713 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`GoogleFactCheck component snapshot testing should match when component loading 1`] = ` - - - -
- -
- - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="google-fact-check_query" - inputType="input" - onChange={[Function]} - placeholder="search fact checks" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - - All - -
, - } - } - dropdownClassName="" - id="google-fact-check_language" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - values={ - Array [ - Object { - "disabled": undefined, - "key": "all", - "label": "All", - "value": "all", - }, - ] - } - > -
- } - defaultValue="all" - domRef={ - Object { - "current":
- - - - - All - -
, - } - } - dropdownClassName="" - id="google-fact-check_language" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - values={ - Array [ - Object { - "disabled": undefined, - "key": "all", - "label": "All", - "value": "all", - }, - ] - } - > - - - - - - - All - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - -
- - - - - - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - - - -
- - -
- -
- -
-
-
- - - - - - -
-
-
-
    - -
  • - - <Base - component="h5" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h5" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h5 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Claim by Facebook posts: - </h5> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - - <Base - component="h4" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h4" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h4 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Video shows Russian doctors celebrating the new COVID-19 vaccine. - </h4> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - -
    - - BOOM - - rating : - - False - -
    -
    - - Video From Saudi Arabia Shared As Russian Doctors Celebrating COVID-19 Vaccine - -
  • -
    - -
  • - - <Base - component="h5" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h5" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h5 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Claim by social media users: - </h5> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - - <Base - component="h4" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h4" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h4 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Pelosi travels weekly to California on a 200-seat Boeing that costs millions annually in fuel - </h4> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - -
    - - BOOM - - rating : - - False - -
    -
    - - Fact check: False claim that Pelosi travels weekly on 200-seat ... - -
  • -
    -
-
-
-
-
-
-
-
-
- - - -`; - -exports[`GoogleFactCheck component snapshot testing should match when data 1`] = ` - - - -
- -
- - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="google-fact-check_query" - inputType="input" - onChange={[Function]} - placeholder="search fact checks" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - - All - -
, - } - } - dropdownClassName="" - id="google-fact-check_language" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - values={ - Array [ - Object { - "disabled": undefined, - "key": "all", - "label": "All", - "value": "all", - }, - ] - } - > -
- } - defaultValue="all" - domRef={ - Object { - "current":
- - - - - All - -
, - } - } - dropdownClassName="" - id="google-fact-check_language" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - values={ - Array [ - Object { - "disabled": undefined, - "key": "all", - "label": "All", - "value": "all", - }, - ] - } - > - - - - - - - All - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - -
- - - - - - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - - - - - - -
- - - - Back - - - Next - - -
- } - loading={false} - renderItem={[Function]} - > -
- -
-
-
    - -
  • - - <Base - component="h5" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h5" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h5 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Claim by Facebook posts: - </h5> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - - <Base - component="h4" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h4" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h4 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Video shows Russian doctors celebrating the new COVID-19 vaccine. - </h4> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - -
    - - BOOM - - rating : - - False - -
    -
    - - Video From Saudi Arabia Shared As Russian Doctors Celebrating COVID-19 Vaccine - -
  • -
    - -
  • - - <Base - component="h5" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h5" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h5 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Claim by social media users: - </h5> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - - <Base - component="h4" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h4" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h4 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Pelosi travels weekly to California on a 200-seat Boeing that costs millions annually in fuel - </h4> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - -
    - - BOOM - - rating : - - False - -
    -
    - - Fact check: False claim that Pelosi travels weekly on 200-seat ... - -
  • -
    -
-
-
-
-
- -
- -
- - - -
-
- -
- - - -
-
-
-
-
-
- - -
- -
-
-
-`; - -exports[`GoogleFactCheck component snapshot testing should render the component 1`] = ` - - - -
- -
- - - -
- - - - -
- - -
- -
- -
- - -
-
-
- - - - } - focused={false} - handleReset={[Function]} - id="google-fact-check_query" - inputType="input" - onChange={[Function]} - placeholder="search fact checks" - prefixCls="ant-input" - triggerFocus={[Function]} - type="text" - value="" - > - - - - -
-
- - - - - -
- -
-
-
-
-
-
- - - - -
- - -
- -
- -
- - -
-
-
- - - - - - All - -
, - } - } - dropdownClassName="" - id="google-fact-check_language" - inputElement={null} - inputIcon={[Function]} - key="trigger" - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - values={ - Array [ - Object { - "disabled": undefined, - "key": "all", - "label": "All", - "value": "all", - }, - ] - } - > -
- } - defaultValue="all" - domRef={ - Object { - "current":
- - - - - All - -
, - } - } - dropdownClassName="" - id="google-fact-check_language" - inputElement={null} - inputIcon={[Function]} - inputRef={ - Object { - "current": , - } - } - listHeight={256} - listItemHeight={24} - menuItemSelectedIcon={null} - multiple={false} - notFoundContent={ - - [Function] - - } - onChange={[Function]} - onInputChange={[Function]} - onInputCompositionEnd={[Function]} - onInputCompositionStart={[Function]} - onInputKeyDown={[Function]} - onInputMouseDown={[Function]} - onInputPaste={[Function]} - onSearch={[Function]} - onSearchSubmit={[Function]} - onSelect={[Function]} - onToggleOpen={[Function]} - prefixCls="ant-select" - removeIcon={} - searchValue="" - showSearch={false} - tokenWithEnter={false} - transitionName="ant-slide-up" - values={ - Array [ - Object { - "disabled": undefined, - "key": "all", - "label": "All", - "value": "all", - }, - ] - } - > - - - - - - - All - -
-
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - -
- - -
- - - - - - -
- - - -
-
-
- - - -
-
- - - - - -
- -
-
-
-
- - - - - - - -
- - - - Back - - - Next - - -
- } - loading={false} - renderItem={[Function]} - > -
- -
-
-
    - -
  • - - <Base - component="h5" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h5" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h5 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Claim by Facebook posts: - </h5> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - - <Base - component="h4" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h4" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h4 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Video shows Russian doctors celebrating the new COVID-19 vaccine. - </h4> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - -
    - - BOOM - - rating : - - False - -
    -
    - - Video From Saudi Arabia Shared As Russian Doctors Celebrating COVID-19 Vaccine - -
  • -
    - -
  • - - <Base - component="h5" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h5" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h5 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Claim by social media users: - </h5> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - - <Base - component="h4" - > - <LocaleReceiver - componentName="Text" - > - <ResizeObserver - disabled={true} - onResize={[Function]} - > - <Typography - className="" - component="h4" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - <h4 - className="ant-typography" - style={ - Object { - "WebkitLineClamp": undefined, - } - } - > - Pelosi travels weekly to California on a 200-seat Boeing that costs millions annually in fuel - </h4> - </Typography> - </ResizeObserver> - </LocaleReceiver> - </Base> - - -
    - - BOOM - - rating : - - False - -
    -
    - - Fact check: False claim that Pelosi travels weekly on 200-seat ... - -
  • -
    -
-
-
-
-
- -
- -
- - - -
-
- -
- - - -
-
-
-
-
-
- - -
- -
-
-
-`; diff --git a/studio/src/pages/fact-checks/__snapshots__/index.test.js.snap b/studio/src/pages/fact-checks/__snapshots__/index.test.js.snap deleted file mode 100644 index 36946389b..000000000 --- a/studio/src/pages/fact-checks/__snapshots__/index.test.js.snap +++ /dev/null @@ -1,7397 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FactCheck component snapshot testing should render the component 1`] = ` - - - - - -
- -
- - - - - -
-
- -
-