diff --git a/.cspell.json b/.cspell.json index d45a9d1ec51..30f04772d3f 100644 --- a/.cspell.json +++ b/.cspell.json @@ -3,6 +3,15 @@ "version": "0.2", "language": "en", "words": [ + "Styleable", + "Usergroup", + "Dispatchable", + "MPIMs", + "mpim", + "datetimepicker", + "Placeholdable", + "EARLYHINTS", + "nuxt", "websockets", "cacheable", "mrkdwn", diff --git a/package.json b/package.json index d47d4d10a84..d4bd924b755 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,32 @@ "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "^4.4.0", "eslint-plugin-spellcheck": "0.0.20", + "eslint-config-adjunct": "^4.13.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-auto": "^0.9.0", + "eslint-plugin-chai-expect": "^3.0.0", + "eslint-plugin-chai-friendly": "^0.7.4", + "eslint-plugin-const-case": "^1.2.2", + "eslint-plugin-html": "^8.0.0", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jest-async": "^1.0.3", + "eslint-plugin-jest-dom": "^5.4.0", + "eslint-plugin-json": "^3.1.0", + "eslint-plugin-markdown": "^3.0.1", + "eslint-plugin-mocha": "^10.4.3", + "eslint-plugin-mocha-cleanup": "^1.11.3", + "eslint-plugin-no-constructor-bind": "^2.0.4", + "eslint-plugin-no-secrets": "^0.8.9", + "eslint-plugin-no-unsanitized": "^4.0.2", + "eslint-plugin-no-use-extend-native": "^0.5.0", + "eslint-plugin-optimize-regex": "^1.2.1", + "eslint-plugin-pii": "^1.0.2", + "eslint-plugin-security": "^2.1.1", + "eslint-plugin-simple-import-sort": "^12.0.0", + "eslint-plugin-sonarjs": "^0.24.0", + "eslint-plugin-switch-case": "^1.1.2", + "eslint-plugin-unicorn": "^51.0.1", + "eslint-plugin-xss": "^0.1.12", "execa": "^6.1.0", "globby": "^12.2.0", "gradient-string": "^2.0.1", diff --git a/packages/cli-next/.eslintrc.js b/packages/cli-next/.eslintrc.js new file mode 100644 index 00000000000..a9b83317c5f --- /dev/null +++ b/packages/cli-next/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + extends: ['../../.eslintrc.js'], + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2020, + sourceType: 'module', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/cli-next/.gitignore b/packages/cli-next/.gitignore new file mode 100644 index 00000000000..78bd28b805f --- /dev/null +++ b/packages/cli-next/.gitignore @@ -0,0 +1,120 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.idea +.build +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +dist +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/*/workspace.xml +.idea/**/*/tasks.xml +.idea/**/*/dictionaries +.idea/**/*/shelf + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +.serverless +newrelic_agent.log diff --git a/packages/cli-next/README.MD b/packages/cli-next/README.MD new file mode 100644 index 00000000000..c474f236c8d --- /dev/null +++ b/packages/cli-next/README.MD @@ -0,0 +1,158 @@ +
+ + ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only) + +
+ +
+ + ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only) + +
+ +

Notification management simplified.

+ +
+The ultimate service for managing multi-channel notifications with a single API. +
+ +

+
+ Explore the docs » +
+ +
+ Report Bug + · + Request Feature + · + Join Our Discord + · + Roadmap + · + X +

+ +## ⭐️ Why +Building a notification system is hard, at first it seems like just sending an email but in reality it's just the beginning. In today's world users expect multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are popping up each day, and notifications are spread around the code. Novu's goal is to simplify notifications and provide developers the tools to create meaningful communication between the system and its users. + +## ✨ Features + +- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat) +- 💅 Easily manage notification over multiple channels +- 🚀 Equipped with a CMS for advanced layouts and design management +- 🛡 Built-in protection for missing variables (Coming Soon) +- 📦 Easy to set up and integrate +- 🛡 Debug and analyze multichannel messages in a single dashboard +- 📦 Embeddable notification center with real-time updates +- 👨‍💻 Community driven + +## 🚀 Getting Started + +We are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how: + +``` +npx novu init +``` + +After setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package. + +```bash +npm install @novu/node +``` + +```ts +import { Novu } from '@novu/node'; + +const novu = new Novu(process.env.NOVU_API_KEY); + +await novu.trigger('', { + to: { + subscriberId: '', + email: 'john@doemail.com', + firstName: 'John', + lastName: 'Doe', + }, + payload: { + name: 'Hello World', + organization: { + logo: 'https://happycorp.com/logo.png', + } + }, +}); +``` + +## Embeddable notification center + +Using the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React. + +
+notification-center-912bb96e009fb3a69bafec23bcde00b0 + + Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction) + +
+ +## Providers + +Novu provides a single API to manage providers across multiple channels with a simple-to-use interface. + +#### 💌 Email + +- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid) +- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore) +- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun) +- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses) +- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark) +- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer) +- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet) +- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill) +- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue) +- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs) +- [ ] SparkPost + +#### 📞 SMS + +- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio) +- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo) +- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns) +- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo) +- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77) +- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx) +- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii) +- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup) +- [ ] Bandwidth +- [ ] RingCentral + +#### 📱 Push + +- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm) +- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo) +- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns) +- [ ] Pushwoosh + +#### 👇 Chat + +- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack) +- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord) +- [ ] MS Teams +- [ ] Mattermost + +#### 📱 In-App + +- [x] [Novu](https://docs.novu.co/notification-center/introduction) +- [ ] MagicBell + +#### Other (Coming Soon...) + +- [ ] PagerDuty + +## 💻 Need Help? + +We are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project. + +Just Join Our Discord server and ask for help. + +## 🔗 Links + +- [Home page](https://novu.co/) diff --git a/packages/cli-next/nodemon-debug.json b/packages/cli-next/nodemon-debug.json new file mode 100644 index 00000000000..052b0236723 --- /dev/null +++ b/packages/cli-next/nodemon-debug.json @@ -0,0 +1,6 @@ +{ + "watch": ["src"], + "ext": "ts", + "ignore": ["src/**/*.spec.ts"], + "exec": "node --inspect-brk -r ts-node/register -r tsconfig-paths/register src/main.ts" +} diff --git a/packages/cli-next/nodemon.json b/packages/cli-next/nodemon.json new file mode 100644 index 00000000000..eaca987777d --- /dev/null +++ b/packages/cli-next/nodemon.json @@ -0,0 +1,8 @@ +{ + "watch": ["src", "../core/dist"], + "ext": "ts", + "delay": 2, + "ignoreRoot": [".git"], + "ignore": ["src/**/*.spec.ts"], + "exec": "ts-node -r tsconfig-paths/register src/index.ts" +} diff --git a/packages/cli-next/package.json b/packages/cli-next/package.json new file mode 100644 index 00000000000..8523579fe87 --- /dev/null +++ b/packages/cli-next/package.json @@ -0,0 +1,58 @@ +{ + "name": "@novu/novu-labs", + "version": "0.0.1-alpha.77", + "description": "On-Boarding Cli", + "main": "index.js", + "engines": { + "node": ">=18.17.0" + }, + "scripts": { + "build:post": "cross-env mkdir dist/constants/dashboard", + "prebuild": "rimraf dist", + "build": "pnpm prebuild && tsc -p tsconfig.build.json && pnpm build:post", + "build:prod": "pnpm prebuild && pnpm build && pnpm build:post", + "format": "prettier --write \"src/**/*.ts\"", + "precommit": "lint-staged", + "start": "pnpm start:dev", + "start:sync": "cross-env NODE_ENV=development TZ=UTC nodemon sync --backend-url=http://localhost:3000 --echo-url=http://localhost:4000/api --api-key=9185a6719c99faa9142b08c94e3b65ca", + "start:dev": "cross-env NODE_ENV=development NOVU_EMBED_PATH=http://127.0.0.1:4701/embed.umd.min.js NOVU_API_ADDRESS=http://127.0.0.1:3000 NOVU_CLIENT_LOGIN=http://127.0.0.1:4200/auth/login CLI_SEGMENT_WRITE_KEY=GdQ594CEBj4pU6RFldDOjKJwZjxZOsIj TZ=UTC nodemon echo", + "start:test": "cross-env NODE_ENV=test PORT=1336 TZ=UTC nodemon init", + "start:debug": "cross-env TZ=UTC nodemon --config nodemon-debug.json", + "start:prod": "cross-env TZ=UTC node dist/index.js", + "release:alpha": "npm i && npm version prerelease --preid=alpha && npm run build && npm publish" + }, + "author": "Novu Labs Team.", + "license": "ISC", + "bin": { + "novu-labs": "./dist/index.js" + }, + "devDependencies": { + "@types/configstore": "^5.0.1", + "@types/inquirer": "^8.2.0", + "@types/mocha": "10.0.2", + "eslint-config-adjunct": "^4.13.0", + "ncp": "^2.0.0", + "nodemon": "^3.0.1", + "rimraf": "^5.0.5", + "ts-node": "~10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "4.9.5" + }, + "dependencies": { + "@novu/shared": "^0.23.1", + "@novu/studio": "^0.0.1-alpha.87", + "@segment/analytics-node": "^1.1.4", + "axios": "^1.6.2", + "chalk": "4.1.2", + "commander": "^9.0.0", + "configstore": "^5.0.0", + "cross-env": "^7.0.3", + "dotenv": "^8.2.0", + "get-port": "^5.1.1", + "gradient-string": "^2.0.0", + "inquirer": "^8.2.0", + "jwt-decode": "^3.1.2", + "open": "^8.4.2", + "uuid": "^9.0.0" + } +} diff --git a/packages/cli-next/pnpm-lock.yaml b/packages/cli-next/pnpm-lock.yaml new file mode 100644 index 00000000000..b050bdc57fd --- /dev/null +++ b/packages/cli-next/pnpm-lock.yaml @@ -0,0 +1,10 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@novu/studio': + specifier: ^0.0.1-alpha.47 + version: link:../studio diff --git a/packages/cli-next/src/api/api.service.ts b/packages/cli-next/src/api/api.service.ts new file mode 100644 index 00000000000..64e3167d082 --- /dev/null +++ b/packages/cli-next/src/api/api.service.ts @@ -0,0 +1,17 @@ +import axios from 'axios'; + +export async function get(url: string) { + return await axios.get(url).then((response) => response.data.data); +} + +export async function post(url: string, body = {}) { + return await axios.post(url, body).then((response) => response.data.data); +} + +export async function put(url: string, body = {}) { + return await axios.put(url, body).then((response) => response.data.data); +} + +export function storeHeader(key: string, value: string): void { + axios.defaults.headers.common[key] = value; +} diff --git a/packages/cli-next/src/api/auth.ts b/packages/cli-next/src/api/auth.ts new file mode 100644 index 00000000000..97960efb388 --- /dev/null +++ b/packages/cli-next/src/api/auth.ts @@ -0,0 +1,17 @@ +import { IUserEntity, SignUpOriginEnum } from '@novu/shared'; +import { get, post, put } from './api.service'; +import { API_AUTH_SIGNUP, API_UPDATE_EMAIL } from '../constants'; + +export function signup(details: { + firstName: string; + lastName?: string; + email: string; + password: string; + origin: SignUpOriginEnum; +}): Promise<{ token: string }> { + return post(API_AUTH_SIGNUP, details); +} + +export function updateEmail(details: { email: string }): Promise { + return put(API_UPDATE_EMAIL, details); +} diff --git a/packages/cli-next/src/api/environment.ts b/packages/cli-next/src/api/environment.ts new file mode 100644 index 00000000000..b9fb9b4a688 --- /dev/null +++ b/packages/cli-next/src/api/environment.ts @@ -0,0 +1,24 @@ +import { IEnvironment } from '@novu/shared'; +import { + API_ENVIRONMENT_KEYS, + API_ENVIRONMENT_ME_URL, + API_CREATE_ENVIRONMENT_URL, + API_SWITCH_ENVIRONMENT_FORMAT_URL, +} from '../constants'; +import { get, post } from './api.service'; + +export function createEnvironment(environmentName: string) { + return post(API_CREATE_ENVIRONMENT_URL, { name: environmentName }); +} + +export function getEnvironmentMe(): Promise { + return get(API_ENVIRONMENT_ME_URL); +} + +export async function switchEnvironment(environmentId: string): Promise { + return (await post(API_SWITCH_ENVIRONMENT_FORMAT_URL.replace('{environmentId}', environmentId), {})).token; +} + +export function getEnvironmentApiKeys(): Promise { + return get(API_ENVIRONMENT_KEYS); +} diff --git a/packages/cli-next/src/api/index.ts b/packages/cli-next/src/api/index.ts new file mode 100644 index 00000000000..867eb211da2 --- /dev/null +++ b/packages/cli-next/src/api/index.ts @@ -0,0 +1,5 @@ +export * from './api.service'; +export * from './organization'; +export * from './environment'; +export * from './notification-groups'; +export * from './notification-templates'; diff --git a/packages/cli-next/src/api/notification-groups.ts b/packages/cli-next/src/api/notification-groups.ts new file mode 100644 index 00000000000..339b6f64c6f --- /dev/null +++ b/packages/cli-next/src/api/notification-groups.ts @@ -0,0 +1,6 @@ +import { get } from './api.service'; +import { API_NOTIFICATION_GROUP_URL } from '../constants'; + +export function getNotificationGroup() { + return get(API_NOTIFICATION_GROUP_URL); +} diff --git a/packages/cli-next/src/api/notification-templates.ts b/packages/cli-next/src/api/notification-templates.ts new file mode 100644 index 00000000000..d1396b3e551 --- /dev/null +++ b/packages/cli-next/src/api/notification-templates.ts @@ -0,0 +1,7 @@ +import { ICreateNotificationTemplateDto } from '@novu/shared'; +import { post } from './api.service'; +import { API_NOTIFICATION_TEMPLATES_URL } from '../constants'; + +export function createNotificationTemplates(body: ICreateNotificationTemplateDto) { + return post(API_NOTIFICATION_TEMPLATES_URL, body); +} diff --git a/packages/cli-next/src/api/organization.ts b/packages/cli-next/src/api/organization.ts new file mode 100644 index 00000000000..cdda5269325 --- /dev/null +++ b/packages/cli-next/src/api/organization.ts @@ -0,0 +1,11 @@ +import { IOrganizationDTO } from '@novu/shared'; +import { API_CREATE_ORGANIZATION_URL, API_SWITCH_ORGANIZATION_FORMAT_URL } from '../constants'; +import { post } from './api.service'; + +export function createOrganization(organizationName: string): Promise { + return post(API_CREATE_ORGANIZATION_URL, { name: organizationName }); +} + +export function switchOrganization(organizationId: string): Promise { + return post(API_SWITCH_ORGANIZATION_FORMAT_URL.replace('{organizationId}', organizationId), {}); +} diff --git a/packages/cli-next/src/client/cli.client.ts b/packages/cli-next/src/client/cli.client.ts new file mode 100644 index 00000000000..a8cf2fdbc0e --- /dev/null +++ b/packages/cli-next/src/client/cli.client.ts @@ -0,0 +1,5 @@ +import { prompt as InquirerPrompt, ListQuestionOptions, Answers } from 'inquirer'; + +export async function prompt(questions: ListQuestionOptions[]): Promise { + return InquirerPrompt(questions); +} diff --git a/packages/cli-next/src/client/index.ts b/packages/cli-next/src/client/index.ts new file mode 100644 index 00000000000..d087c13fb51 --- /dev/null +++ b/packages/cli-next/src/client/index.ts @@ -0,0 +1 @@ +export * from './cli.client'; diff --git a/packages/cli-next/src/commands/index.ts b/packages/cli-next/src/commands/index.ts new file mode 100644 index 00000000000..09419962940 --- /dev/null +++ b/packages/cli-next/src/commands/index.ts @@ -0,0 +1 @@ +export * from './init'; diff --git a/packages/cli-next/src/commands/init.consts.ts b/packages/cli-next/src/commands/init.consts.ts new file mode 100644 index 00000000000..39acd1d6833 --- /dev/null +++ b/packages/cli-next/src/commands/init.consts.ts @@ -0,0 +1,191 @@ +import { ListQuestionOptions } from 'inquirer'; +import chalk from 'chalk'; +import gradient from 'gradient-string'; + +import { passwordConstraints } from '@novu/shared'; + +import { logo } from '../constants'; + +export const introQuestions: ListQuestionOptions[] = [ + { + name: 'environmentName', + message: 'What is your organization or project name?', + validate(input: any, answers?): boolean | string | Promise { + if ( + ['test', 'testnovu', 'testapp', 'novutest'].includes( + input + ?.trim() + .toLowerCase() + .replace(/[^\w\s]/gi, '') + ) + ) { + return `Cache invalidation and naming things... \n +We recommend writing your project or company name ;) If you're just curious about Novu, type 'curious' + `; + } else if (!input?.trim().length) { + return `Please enter a valid name. If you're just curious about Novu, type 'curious' ;)`; + } + + return true; + }, + }, +]; + +export const existingSessionQuestions = (existingEnvironment): ListQuestionOptions[] => { + return [ + { + type: 'list', + name: 'result', + message: `Looks like you already have a created an account for ${existingEnvironment.name}`, + choices: [ + { + name: `Visit ${existingEnvironment.name} Dashboard`, + value: 'visitDashboard', + }, + { + name: 'Cancel', + value: 'exit', + }, + ], + }, + ]; +}; + +export const environmentQuestions: ListQuestionOptions[] = [ + { + type: 'list', + name: 'env', + message: `Now lets setup your environment. How would you like to proceed?`, + choices: [ + { + name: `Try on a free cloud account ${chalk.bold.green(`(Quickest)`)}`, + value: 'cloud', + }, + { + name: 'Self-hosting - Manual Setup', + value: 'self-hosted-docker', + }, + ], + }, +]; + +export const registerMethodQuestions: ListQuestionOptions[] = [ + { + type: 'list', + name: 'value', + message: `Create your account with:`, + choices: [ + { + name: `Sign-up with GitHub`, + value: 'github', + }, + { + name: 'With Email & Password', + value: 'email', + }, + ], + }, +]; + +export const privateDomainQuestions: (email: string) => ListQuestionOptions[] = (email: string) => [ + { + name: 'domain', + type: 'list', + message: `We recommend to use you work e-mail, so important updates won't reach your personal e-mail.`, + choices: [ + { + name: `Update to work e-mail`, + value: 'updateEmail', + }, + { + name: `Keep current e-mail ${chalk.grey('(' + email + ')')}`, + value: 'keepCurrent', + }, + ], + }, +]; + +export const fullNameQuestion: ListQuestionOptions[] = [ + { + type: 'text', + name: 'fullName', + message: 'Your Full Name', + validate: (input) => { + if (!input || input.length < 3) return 'Please write your full name'; + + return true; + }, + }, +]; + +export const proceedSignupQuestions: ListQuestionOptions[] = [ + { + type: 'list', + name: 'proceedSignup', + message: `${chalk.red('Error:')} This account already exists, how do you want to proceed?`, + choices: [ + { + name: `Reset Password`, + value: 'resetPassword', + }, + { + name: 'Use a different email', + value: 'differentEmail', + }, + ], + }, +]; + +export const passwordQuestion: ListQuestionOptions[] = [ + { + type: 'password', + name: 'password', + message: 'Password', + validate: (input) => { + const match = input.match(passwordConstraints.pattern); + + return match + ? true + : 'The password must contain minimum 8 and maximum 64 characters, at least one uppercase letter, one lowercase letter, one number and one special character #?!@$%^&*()-'; + }, + }, +]; + +export const emailQuestion: ListQuestionOptions[] = [ + { + type: 'text', + name: 'email', + message: 'E-mail address', + }, +]; + +export const termAndPrivacyQuestions: ListQuestionOptions[] = [ + { + type: 'list', + name: 'accept', + message: `I accept the Terms and Conditions (https://novu.co/terms) and have read the Privacy Policy (https://novu.co/privacy)`, + choices: [ + { + name: `Yes`, + value: true, + }, + { + name: 'No', + value: false, + }, + ], + }, +]; + +export const showWelcomeScreen = (): void => { + const textGradient = gradient('#0099F7', '#ff3432'); + const logoGradient = gradient('#DD2476', '#FF512F'); + + const items = logo.split('\n').map((row) => logoGradient(row)); + + /* eslint-disable no-console */ + console.log(chalk.bold(items.join('\n'))); + console.log(chalk.bold(` Welcome to NOVU ECHO!`)); + console.log(chalk.bold(textGradient(` The open-source notification infrastructure\n`))); + /* eslint-enable no-console */ +}; diff --git a/packages/cli-next/src/commands/init.ts b/packages/cli-next/src/commands/init.ts new file mode 100644 index 00000000000..f3ac865441e --- /dev/null +++ b/packages/cli-next/src/commands/init.ts @@ -0,0 +1,402 @@ +import open from 'open'; +import { Answers } from 'inquirer'; +import ora from 'ora'; +import { v4 as uuidv4 } from 'uuid'; +import { IEnvironment, SignUpOriginEnum } from '@novu/shared'; +import { prompt } from '../client'; +import { + emailQuestion, + environmentQuestions, + existingSessionQuestions, + fullNameQuestion, + introQuestions, + passwordQuestion, + privateDomainQuestions, + proceedSignupQuestions, + registerMethodQuestions, + termAndPrivacyQuestions, + showWelcomeScreen, +} from './init.consts'; +import { HttpServer } from '../server'; +import { + SERVER_HOST, + REDIRECT_ROUTE, + API_OAUTH_URL, + WIDGET_DEMO_ROUTE, + API_TRIGGER_URL, + CLIENT_LOGIN_URL, + getServerPort, + GITHUB_DOCKER_URL, + EMBED_PATH, +} from '../constants'; +import { + storeHeader, + createOrganization, + switchOrganization, + createEnvironment, + getEnvironmentMe, + switchEnvironment, + getNotificationGroup, + createNotificationTemplates, + getEnvironmentApiKeys, +} from '../api'; +import { AnalyticService, ConfigService, AnalyticsEventEnum, ANALYTICS_SOURCE } from '../services'; +import { signup, updateEmail } from '../api/auth'; +import * as chalk from 'chalk'; +import { privateEmailDomains } from '../constants/domains'; + +export enum ChannelCTATypeEnum { + REDIRECT = 'redirect', +} + +const anonymousId = uuidv4(); +const analytics = new AnalyticService(); + +export async function initCommand() { + try { + await showWelcomeScreen(); + + const config = new ConfigService(); + if (process.env.NODE_ENV === 'development') { + await config.clearStore(); + } + + const existingEnvironment = await checkExistingEnvironment(config); + const isSessionExists = config.getDecodedToken(); + + analytics.track({ + event: AnalyticsEventEnum.CLI_LAUNCHED, + identity: { anonymousId: isSessionExists ? undefined : anonymousId, userId: isSessionExists?._id }, + data: { + existingEnvironment: !!existingEnvironment, + }, + }); + + if (existingEnvironment) { + const { result } = await prompt(existingSessionQuestions(existingEnvironment)); + const user = config.getDecodedToken(); + + analytics.identify(user); + if (result === 'visitDashboard') { + await handleExistingSession(result, config); + + return; + } + await analytics.flush(); + process.exit(); + } + + await handleOnboardingFlow(config); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + } +} + +async function handleOnboardingFlow(config: ConfigService) { + const httpServer = new HttpServer(); + + await httpServer.listen(); + + let spinner: ora.Ora = null; + + try { + const answers = await prompt(introQuestions); + + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.CREATE_APP_QUESTION_EVENT, + }); + + const envAnswer = await prompt(environmentQuestions); + + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.ENVIRONMENT_SELECT_EVENT, + data: { + environment: envAnswer.env, + }, + }); + + if (envAnswer.env === 'self-hosted-docker') { + await open(GITHUB_DOCKER_URL); + await analytics.flush(); + + return; + } + + const regMethod = await prompt(registerMethodQuestions); + + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.REGISTER_METHOD_SELECT_EVENT, + data: { + environment: regMethod.value, + }, + }); + + const { accept } = await prompt(termAndPrivacyQuestions); + + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.TERMS_AND_CONDITIONS_QUESTION, + data: { + accepted: accept, + }, + }); + + if (accept === false) { + await analytics.flush(); + process.exit(); + } + + if (regMethod.value === 'github') { + spinner = ora('Waiting for a brave unicorn to login').start(); + await gitHubOAuth(httpServer, config); + spinner.stop(); + } else if (regMethod.value === 'email') { + await signUp(config); + } + + spinner = ora('Setting up your new account').start(); + + await createOrganizationHandler(config, answers); + + const user = config.getDecodedToken(); + + if (regMethod.value === 'github' && privateEmailDomains.includes(user.email.split('@')[1])) { + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.PRIVATE_EMAIL_ATTEMPT, + data: { + method: 'github', + }, + }); + + spinner.stop(); + let updateErrorForEmail = false; + do { + const { domain } = await prompt(privateDomainQuestions(user.email)); + + if (domain === 'updateEmail') { + const { email } = await prompt(emailQuestion); + + try { + await updateEmail({ email }); + } catch (e) { + const error = e.response.data; + updateErrorForEmail = true; + console.error('Un-expected error ', error); + } + } + } while (updateErrorForEmail); + } + + spinner.start(); + + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.ACCOUNT_CREATED, + data: { + method: regMethod.value, + }, + }); + + const redirectUrl = `${CLIENT_LOGIN_URL}/?token=${config.getToken()}`; + + spinner.succeed(`Your account has been successfully created. + + To help you get started quickly, + we've developed a quick start that will guide you through setting up and testing Novu notifications with ease. + + In case the browser haven't opened automatically, you can access the quick start here: + ${chalk.blue(redirectUrl)} + `); + + httpServer.redirectSuccessDashboard(redirectUrl); + + await exitHandler(); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + spinner?.fail('Something un-expected happened :('); + } finally { + spinner?.stop(); + httpServer.close(); + } +} + +async function gitHubOAuth(httpServer: HttpServer, config: ConfigService): Promise { + const redirectUrl = `http://${SERVER_HOST}:${await getServerPort()}${REDIRECT_ROUTE}`; + + try { + await open(`${API_OAUTH_URL}?&redirectUrl=${redirectUrl}&source=${SignUpOriginEnum.CLI}&distinctId=${anonymousId}`); + + const userJwt = await httpServer.redirectResponse(); + + storeToken(config, userJwt); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } +} + +async function createOrganizationHandler(config: ConfigService, answers: Answers) { + if (config.isOrganizationIdExist()) return; + + const createOrganizationResponse = await createOrganization(answers.environmentName); + + const newUserJwt = await switchOrganization(createOrganizationResponse._id); + + storeToken(config, newUserJwt); +} + +async function createEnvironmentHandler(config: ConfigService, answers: Answers): Promise { + if (config.isEnvironmentIdExist()) { + const existingEnvironment = await getEnvironmentMe(); + const keys = await getEnvironmentApiKeys(); + + config.setValue('apiKey', keys[0]?.key); + + return existingEnvironment.identifier; + } + + const createEnvironmentResponse = await createEnvironment(answers.environmentName); + const newUserJwt = await switchEnvironment(createEnvironmentResponse._id); + + config.setValue('apiKey', createEnvironmentResponse.apiKeys[0].key); + storeToken(config, newUserJwt); + + return createEnvironmentResponse.identifier; +} + +/* + * Stores token in config and axios default headers + */ +function storeToken(config: ConfigService, userJwt: string) { + config.setValue('token', userJwt); + storeHeader('authorization', `Bearer ${config.getToken()}`); +} + +async function exitHandler(): Promise { + await keyPress(); +} + +const keyPress = async (): Promise => { + return new Promise((resolve) => + process.stdin.once('data', () => { + resolve(); + }) + ); +}; + +async function checkExistingEnvironment(config: ConfigService): Promise { + const isSessionExists = !!config.getDecodedToken(); + + if (isSessionExists && process.env.NODE_ENV !== 'development') { + storeToken(config, config.getToken()); + + let existingEnvironment: IEnvironment; + + try { + existingEnvironment = await getEnvironmentMe(); + if (!existingEnvironment) { + return null; + } + } catch (e) { + await config.clearStore(); + + return null; + } + + return existingEnvironment; + } + + return null; +} + +async function handleExistingSession(result: string, config: ConfigService) { + if (result === 'visitDashboard') { + analytics.track({ + identity: { userId: config.getDecodedToken()._id }, + event: AnalyticsEventEnum.OPEN_DASHBOARD, + data: { + existingUser: true, + }, + }); + + const dashboardURL = `${CLIENT_LOGIN_URL}?token=${config.getToken()}&source=${SignUpOriginEnum.CLI}`; + + await open(dashboardURL); + } else if (result === 'exit') { + analytics.track({ + identity: { userId: config.getDecodedToken()._id }, + event: AnalyticsEventEnum.EXIT_EXISTING_SESSION, + }); + await analytics.flush(); + process.exit(); + } +} + +async function signUp(config: ConfigService) { + let errorInSignup = true; + const { fullName } = await prompt(fullNameQuestion); + + while (errorInSignup) { + const { email } = await prompt(emailQuestion); + + if (privateEmailDomains.includes(email.split('@')[1])) { + analytics.track({ + identity: { anonymousId }, + event: AnalyticsEventEnum.PRIVATE_EMAIL_ATTEMPT, + data: { + method: 'email', + }, + }); + + const { domain } = await prompt(privateDomainQuestions(email)); + + if (domain === 'updateEmail') { + errorInSignup = true; + + continue; + } + } + + const { password } = await prompt(passwordQuestion); + try { + const response = await signup({ + email, + password, + firstName: fullName.split(' ')[0], + lastName: fullName.split(' ')[1] || '', + origin: SignUpOriginEnum.CLI, + }); + + storeToken(config, response.token); + + errorInSignup = false; + } catch (e) { + const error = e?.response?.data; + + if (error?.message === 'User already exists') { + const { proceedSignup } = await prompt(proceedSignupQuestions); + + if (proceedSignup === 'resetPassword') { + await open(`${CLIENT_LOGIN_URL.replace('/auth/login', '/auth/reset/request')}`); + console.log('Finished flow'); + process.exit(); + } else { + errorInSignup = true; + } + } else { + errorInSignup = true; + console.log( + chalk.bold.red( + Array.isArray(error?.message) ? error?.messag?.join('\n') : error?.message || 'Something went wrong' + ) + ); + } + } + } +} diff --git a/packages/cli-next/src/constants/assets/novu-logo.ts b/packages/cli-next/src/constants/assets/novu-logo.ts new file mode 100644 index 00000000000..9565523bffe --- /dev/null +++ b/packages/cli-next/src/constants/assets/novu-logo.ts @@ -0,0 +1,16 @@ +/** cspell:disable */ +export const logo = ` + εεεεεεεεεεεεε + εεε εεεεεεεεεεε + εεεεεεεε εεεεεεεε + εεεεεεεεεεεε εεεεεε εε + εεεεεεεεεεεεεεεε εεεε εεε + εεεεεεεεεεεεεεεεεεε ε εεε + εεεεε εεεεεεεε εεεε + εεε ε εεεεεεεεεεεεεεεεεε + εεε εεεε εεεεεεεεεεεεεεεε + εε εεεεεε εεεεεεεεεεεε + εεεεεεεε εεεεεεεε + εεεεεεεεεεε εεε + εεεεεεεεεεεεε + `; diff --git a/packages/cli-next/src/constants/constants.ts b/packages/cli-next/src/constants/constants.ts new file mode 100644 index 00000000000..ecffbca4182 --- /dev/null +++ b/packages/cli-next/src/constants/constants.ts @@ -0,0 +1,52 @@ +import * as getPort from 'get-port'; +import * as dotenv from 'dotenv'; +import chalk from 'chalk'; // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import + +dotenv.config(); +// CLI Server +export const SERVER_HOST = 'localhost'; +export const REDIRECT_ROUTE = '/cli/callback'; +export const WIDGET_DEMO_ROUTE = '/demo'; +export const TRIGGER_ROUTE = '/trigger'; + +export const EMBED_PATH = process.env.NOVU_EMBED_PATH ?? 'https://embed.novu.co/embed.umd.min.js'; + +// API +const apiAddress = process.env.NOVU_API_ADDRESS ?? 'https://api.novu.co'; + +export const API_OAUTH_URL = `${apiAddress}/v1/auth/github`; +export const API_AUTH_SIGNUP = `${apiAddress}/v1/auth/register`; +export const API_UPDATE_EMAIL = `${apiAddress}/v1/users/profile/email`; +export const API_CREATE_ORGANIZATION_URL = `${apiAddress}/v1/organizations`; +export const API_SWITCH_ORGANIZATION_FORMAT_URL = `${apiAddress}/v1/auth/organizations/{organizationId}/switch`; +export const API_CREATE_ENVIRONMENT_URL = `${apiAddress}/v1/environments`; +export const API_ENVIRONMENT_ME_URL = `${apiAddress}/v1/environments/me`; +export const API_ENVIRONMENT_KEYS = `${apiAddress}/v1/environments/api-keys`; +export const API_SWITCH_ENVIRONMENT_FORMAT_URL = `${apiAddress}/v1/auth/environments/{environmentId}/switch`; +export const API_NOTIFICATION_GROUP_URL = `${apiAddress}/v1/notification-groups`; +export const API_NOTIFICATION_TEMPLATES_URL = `${apiAddress}/v1/notification-templates`; +export const API_TRIGGER_URL = `${apiAddress}/v1/events/trigger`; + +// Client +export const CLIENT_LOGIN_URL = process.env.NOVU_CLIENT_LOGIN || 'https://web.novu.co/auth/login'; + +// github +export const GITHUB_DOCKER_URL = 'https://github.com/novuhq/novu/tree/main/docker'; + +// segment analytics +export const ANALYTICS_ENABLED = process.env.ANALYTICS_ENABLED === 'false' ? false : true; +export const SEGMENTS_WRITE_KEY = process.env.CLI_SEGMENT_WRITE_KEY || 'tz68K6ytWx6AUqDl30XAwiIoUfr7iWVW'; + +let SERVER_PORT; + +export async function setAvailablePort() { + SERVER_PORT = await (getPort as never as () => Promise)(); +} + +export async function getServerPort() { + if (!SERVER_PORT) { + throw new Error('setAvailablePort must be called a single time to generate available port'); + } + + return SERVER_PORT; +} diff --git a/packages/cli-next/src/constants/dashboard/index.html b/packages/cli-next/src/constants/dashboard/index.html new file mode 100644 index 00000000000..f4577c6be43 --- /dev/null +++ b/packages/cli-next/src/constants/dashboard/index.html @@ -0,0 +1,445 @@ + + + Getting Started + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+

+ Acme Corp. Demo Dashboard +

+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+

Welcome to your demo web environment

+

+ Here you can test the Novu in-app notification center and see it in action. +
+ Feel free to skip the tutorial and go straight to your admin panel. +

+
+ + Skip Tutorial +
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+

STEP 1

+

+ Trigger your first notification using the provided curl command from your terminal. +

+ +
+
+
+
+
+
+
+ +
+
+

STEP 2

+

+ Click on the received in-app notification to visit your management admin panel. Didn't get it? + Click here +

+
+
+ +
+ +
+
+
+ +
+
+
+
+                  curl --location --request POST 'REPLACE_WITH_url' \
+ --header 'Authorization: ApiKey *********' \
+ --header 'Content-Type: application/json' \
+ --data-raw '{
+    "name": "REPLACE_WITH_name",
+    "to": {
+        "subscriberId": "REPLACE_WITH_subscriberId",
+        "firstName": "REPLACE_WITH_firstName",
+        "lastName": "REPLACE_WITH_lastName"
+    },
+    "payload": {
+        "token": "*********"
+    }
+  }'
+
+ + Copied curl command successfully + +
+ +
+
+
+
+ + +
+
+
+
+
+
+ + +
+ + + + + + + +
+
curl --location --request POST 'REPLACE_WITH_url' \
+                         --header 'Authorization: ApiKey REPLACE_WITH_apiKey' \
+                         --header 'Content-Type: application/json' \
+                         --data-raw '{
+                            "name": "REPLACE_WITH_name",
+                            "to": {
+                                "subscriberId": "REPLACE_WITH_subscriberId",
+                                "firstName": "REPLACE_WITH_firstName",
+                                "lastName": "REPLACE_WITH_lastName"
+                            },
+                            "payload": {
+                                "$on_boarding_trigger": "true",
+                                "token": "REPLACE_WITH_token"
+                            }
+                        }'
+                    
+                  
+                  
+
+ + + + + diff --git a/packages/cli-next/src/constants/domains.ts b/packages/cli-next/src/constants/domains.ts new file mode 100644 index 00000000000..1ecc2e25262 --- /dev/null +++ b/packages/cli-next/src/constants/domains.ts @@ -0,0 +1,82 @@ +export const privateEmailDomains = [ + 'hotmail.ca', + 'hotmail.ch', + 'hotmail.co', + 'hotmail.co.il', + 'hotmail.co.jp', + 'hotmail.co.nz', + 'hotmail.co.uk', + 'hotmail.co.za', + 'hotmail.com', + 'hotmail.com.au', + 'hotmail.com.br', + 'hotmail.com.tr', + 'hotmail.de', + 'hotmail.es', + 'hotmail.fi', + 'hotmail.fr', + 'hotmail.it', + 'hotmail.kg', + 'hotmail.kz', + 'hotmail.nl', + 'hotmail.ru', + 'gmail.com', + 'gmail.com.br', + 'gmail.ru', + 'yahoo.ae', + 'yahoo.at', + 'yahoo.be', + 'yahoo.ca', + 'yahoo.ch', + 'yahoo.cn', + 'yahoo.co', + 'yahoo.co.id', + 'yahoo.co.il', + 'yahoo.co.in', + 'yahoo.co.jp', + 'yahoo.co.kr', + 'yahoo.co.nz', + 'yahoo.co.th', + 'yahoo.co.uk', + 'yahoo.co.za', + 'yahoo.com', + 'yahoo.com.ar', + 'yahoo.com.au', + 'yahoo.com.br', + 'yahoo.com.cn', + 'yahoo.com.co', + 'yahoo.com.hk', + 'yahoo.com.is', + 'yahoo.com.mx', + 'yahoo.com.my', + 'yahoo.com.ph', + 'yahoo.com.ru', + 'yahoo.com.sg', + 'yahoo.com.tr', + 'yahoo.com.tw', + 'yahoo.com.vn', + 'yahoo.cz', + 'yahoo.de', + 'yahoo.dk', + 'yahoo.es', + 'yahoo.fi', + 'yahoo.fr', + 'yahoo.gr', + 'yahoo.hu', + 'yahoo.ie', + 'yahoo.in', + 'yahoo.it', + 'yahoo.jp', + 'yahoo.nl', + 'yahoo.no', + 'yahoo.pl', + 'yahoo.pt', + 'yahoo.ro', + 'yahoo.ru', + 'yahoo.se', + 'yandex.com', + 'yandex.pl', + 'yandex.ru', + 'yandex.ua', + 'mail.ru', +]; diff --git a/packages/cli-next/src/constants/index.ts b/packages/cli-next/src/constants/index.ts new file mode 100644 index 00000000000..5dc5b4f94f8 --- /dev/null +++ b/packages/cli-next/src/constants/index.ts @@ -0,0 +1,2 @@ +export * from './constants'; +export * from './assets/novu-logo'; diff --git a/packages/cli-next/src/index.ts b/packages/cli-next/src/index.ts new file mode 100644 index 00000000000..170c53e93ba --- /dev/null +++ b/packages/cli-next/src/index.ts @@ -0,0 +1,60 @@ +#!/usr/bin/env node +import { Command } from 'commander'; +import { syncState } from './sync-state'; +import { startStudio } from './start-studio'; +import { AnalyticService, ConfigService } from './services'; +import { v4 as uuidv4 } from 'uuid'; + +const program = new Command().allowUnknownOption(true).allowExcessArguments(true); + +const analytics = new AnalyticService(); +const config = new ConfigService(); +if (process.env.NODE_ENV === 'development') { + config.clearStore(); +} + +const anonymousIdLocalState = config.getValue('anonymousId'); +const anonymousId = anonymousIdLocalState || uuidv4(); + +if (!anonymousIdLocalState) { + config.setValue('anonymousId', anonymousId); +} + +program.name('novu-labs').description('CLI to some JavaScript string utilities').version('0.0.1'); + +program + .command('echo') + .option('-p, --port ', 'A port to run Dev Studio on', '2022') + + .description('Start an echo server') + .action(async (options) => { + analytics.track({ + identity: { + anonymousId: anonymousId, + }, + data: {}, + event: 'Start Echo Server', + }); + + await startStudio(anonymousId, options.port); + }); + +program + .command('sync') + .option('-b, --backend-url ', 'The backend url to use', 'https://api.novu.co') + .requiredOption('--echo-url ', 'The cho url to use') + .requiredOption('--api-key ', 'The Novu api key to use') + .description('Sync your Echo state with Novu Cloud') + .action(async (options) => { + analytics.track({ + identity: { + anonymousId: anonymousId, + }, + data: {}, + event: 'Sync Echo State', + }); + + await syncState(options.echoUrl, options.apiKey, options.backendUrl); + }); + +program.parse(process.argv); diff --git a/packages/cli-next/src/server/http-server.ts b/packages/cli-next/src/server/http-server.ts new file mode 100644 index 00000000000..25d8a62cf8e --- /dev/null +++ b/packages/cli-next/src/server/http-server.ts @@ -0,0 +1,68 @@ +import * as http from 'http'; +import open from 'open'; +import { AddressInfo } from 'net'; + +import { SERVER_HOST, setAvailablePort, getServerPort, REDIRECT_ROUTE } from '../constants'; + +export class HttpServer { + private server: http.Server; + public token: string; + private authResponseHandle: http.ServerResponse; + + public async listen(): Promise { + await setAvailablePort(); + + this.server = http.createServer(); + this.server.on('request', async (req, res) => { + try { + if (req.url.startsWith(REDIRECT_ROUTE)) { + this.handleRedirectRequest(req, res); + } + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + } + }); + + this.server.listen(await getServerPort(), SERVER_HOST); + } + + public getAddress() { + const response = this.server.address() as AddressInfo; + + return `http://${SERVER_HOST}:${response.port}`; + } + + public redirectResponse(): Promise { + return new Promise((resolve) => { + const interval = setInterval(() => { + if (this.token) { + clearInterval(interval); + resolve(this.token); + } + }, 300); + }); + } + + public close(): void { + this.server.close(); + } + + public redirectSuccessDashboard(url: string) { + if (this.authResponseHandle) { + this.authResponseHandle + .writeHead(301, { + Location: url, + }) + .end(); + this.authResponseHandle = null; + } else { + open(url); + } + } + + private handleRedirectRequest(req: http.IncomingMessage, res: http.ServerResponse) { + this.token = new URLSearchParams(req.url.slice(REDIRECT_ROUTE.length)).get('token'); + this.authResponseHandle = res; + } +} diff --git a/packages/cli-next/src/server/index.ts b/packages/cli-next/src/server/index.ts new file mode 100644 index 00000000000..3c164c19d8a --- /dev/null +++ b/packages/cli-next/src/server/index.ts @@ -0,0 +1 @@ +export * from './http-server'; diff --git a/packages/cli-next/src/services/analytics.service.ts b/packages/cli-next/src/services/analytics.service.ts new file mode 100644 index 00000000000..518a324047f --- /dev/null +++ b/packages/cli-next/src/services/analytics.service.ts @@ -0,0 +1,99 @@ +import { Analytics } from '@segment/analytics-node'; +import { IJwtPayload } from '@novu/shared'; +import { ANALYTICS_ENABLED, SEGMENTS_WRITE_KEY } from '../constants'; + +export enum AnalyticsEventEnum { + ENVIRONMENT_SELECT_EVENT = 'Select Install Environment', + CREATE_APP_QUESTION_EVENT = 'Create App Question', + REGISTER_METHOD_SELECT_EVENT = 'Select Register Method', + TERMS_AND_CONDITIONS_QUESTION = 'Terms And Conditions Question', + PRIVATE_EMAIL_ATTEMPT = 'Private Email Register Attempt', + ACCOUNT_CREATED = 'account_created', + OPEN_DASHBOARD = 'open_dashboard', + DASHBOARD_PAGE_OPENED = 'Dashboard Page Opened', + EXIT_EXISTING_SESSION = 'exit_existing_session', + SKIP_TUTORIAL = 'skip_tutorial', + COPY_SNIPPET = 'copy_snippet', + TRIGGER_BUTTON = 'trigger_button', + CLI_LAUNCHED = 'Cli Launched', +} + +export const ANALYTICS_SOURCE = '[Echo CLI]'; + +export class AnalyticService { + private _analytics: Analytics; + private _analyticsEnabled: boolean; + + constructor() { + this._analyticsEnabled = ANALYTICS_ENABLED; + if (this._analyticsEnabled) { + this._analytics = new Analytics({ + writeKey: SEGMENTS_WRITE_KEY, + }); + } + } + + alias({ previousId, userId }: { previousId: string; userId: string }) { + if (!this.isAnalyticsEnabled()) { + return; + } + + this._analytics.alias({ + previousId, + userId, + }); + } + + identify(user: IJwtPayload) { + if (!this.isAnalyticsEnabled()) { + return; + } + + this._analytics.identify({ + userId: user._id, + traits: { + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + created: (user as any).createdAt, + }, + }); + } + + track({ + data, + event, + identity, + }: { + data?: Record; + event: string; + identity: { userId: string } | { anonymousId: string }; + }) { + if (!this.isAnalyticsEnabled()) { + return; + } + const payload = { + event: `${event} - ${ANALYTICS_SOURCE}`, + ...identity, + properties: {}, + }; + + if (data) { + payload.properties = { ...payload.properties, ...data }; + } + + this._analytics.track(payload); + } + + async flush() { + if (!this.isAnalyticsEnabled()) { + return; + } + + await this._analytics.closeAndFlush(); + } + + private isAnalyticsEnabled() { + return this._analyticsEnabled; + } +} diff --git a/packages/cli-next/src/services/config.service.ts b/packages/cli-next/src/services/config.service.ts new file mode 100644 index 00000000000..4a49c29c35b --- /dev/null +++ b/packages/cli-next/src/services/config.service.ts @@ -0,0 +1,42 @@ +import Configstore from 'configstore'; +import jwt_decode from 'jwt-decode'; +import { IJwtPayload } from '@novu/shared'; + +export class ConfigService { + private _config: Configstore; + constructor() { + this._config = new Configstore('novu-cli'); + } + + setValue(key: string, value: string) { + this._config.set(key, value); + } + + getValue(key: string) { + return this._config.get(key); + } + + async clearStore() { + return this._config.clear(); + } + + isOrganizationIdExist(): boolean { + return !!this.getDecodedToken().organizationId; + } + + isEnvironmentIdExist(): boolean { + return !!this.getDecodedToken().environmentId; + } + + getToken(): string { + return this._config.get('token'); + } + + getDecodedToken(): IJwtPayload { + if (!this.getToken()) { + return null; + } + + return jwt_decode(this.getToken()); + } +} diff --git a/packages/cli-next/src/services/index.ts b/packages/cli-next/src/services/index.ts new file mode 100644 index 00000000000..560f5b63037 --- /dev/null +++ b/packages/cli-next/src/services/index.ts @@ -0,0 +1,2 @@ +export * from './config.service'; +export * from './analytics.service'; diff --git a/packages/cli-next/src/start-studio.ts b/packages/cli-next/src/start-studio.ts new file mode 100644 index 00000000000..7638993173f --- /dev/null +++ b/packages/cli-next/src/start-studio.ts @@ -0,0 +1,85 @@ +import chalk from 'chalk'; +import gradient from 'gradient-string'; + +const { createServer } = require('http'); +const { parse } = require('url'); +const next = require('next'); +const getPort = require('get-port'); +import * as process from 'process'; +import open from 'open'; +import { logo } from './constants'; + +export const showWelcomeScreen = (): void => { + const textGradient = gradient('#0099F7', '#ff3432'); + const logoGradient = gradient('#DD2476', '#FF512F'); + + const items = logo.split('\n').map((row) => logoGradient(row)); + + /* eslint-disable no-console */ + console.log(chalk.bold(items.join('\n'))); + console.log(chalk.bold(` Welcome to NOVU ECHO!`)); + console.log(chalk.bold(textGradient(` The open-source notification infrastructure\n`))); + /* eslint-enable no-console */ +}; + +export async function startStudio(anonymousId: string, requestedPort = 2022) { + await showWelcomeScreen(); + const dev = false; + const hostname = 'localhost'; + const availablePort = await getPort({ + port: Number(requestedPort), + }); + + const config = { + reactStrictMode: false, + eslint: { + ignoreDuringBuilds: true, + }, + experimental: { + optimizePackageImports: ['@mantine/core', '@mantine/hooks'], + }, + }; + const studioPackage = require.resolve('@novu/studio/bin/start.js'); + + const app = next({ + conf: config, + dev, + hostname, + port: availablePort, + dir: studioPackage + '/../../', + }); + const handle = app.getRequestHandler(); + + await app.prepare(); + + createServer(async (req, res) => { + try { + // Be sure to pass `true` as the second argument to `url.parse`. + // This tells it to parse the query portion of the URL. + const parsedUrl = parse(req.url, true); + const { pathname, query } = parsedUrl; + + req.headers['x-novu-cli-anonymous'] = anonymousId; + + await handle(req, res, parsedUrl); + } catch (err) { + console.error('Error occurred handling', req.url, err); + res.statusCode = 500; + res.end('internal server error'); + } + }) + .once('error', (err) => { + console.error(err); + process.exit(1); + }) + .listen(availablePort, () => { + if (requestedPort && Number(availablePort) !== Number(requestedPort)) { + console.warn(`> Port ${requestedPort} is not available, using port ${availablePort}`); + } + console.log(`> Ready on http://${hostname}:${availablePort}`); + + if (process.env.NODE_ENV !== 'development') { + open(`http://${hostname}:${availablePort}`); + } + }); +} diff --git a/packages/cli-next/src/sync-state.ts b/packages/cli-next/src/sync-state.ts new file mode 100644 index 00000000000..b39ad7d63b6 --- /dev/null +++ b/packages/cli-next/src/sync-state.ts @@ -0,0 +1,33 @@ +import axios from 'axios'; +import { createHmac } from 'crypto'; + +export async function syncState(echoUrl: string, novuApiKey: string, backendUrl: string) { + const timestamp = Date.now(); + const discover = await axios.get(`${echoUrl}?action=discover`, { + headers: { + 'x-novu-signature': + 't=' + + timestamp + + ',v1=' + + createHmac('sha256', novuApiKey) + .update(timestamp + '.' + JSON.stringify({})) + .digest('hex'), + }, + }); + + const sync = await axios.post( + backendUrl + '/v1/echo/sync?source=cli', + { + chimeraUrl: echoUrl, + workflows: discover.data.workflows, + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: 'ApiKey ' + novuApiKey, + }, + } + ); + + return sync.data; +} diff --git a/packages/cli-next/tsconfig.build.json b/packages/cli-next/tsconfig.build.json new file mode 100644 index 00000000000..c56952bf169 --- /dev/null +++ b/packages/cli-next/tsconfig.build.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "./dist", + "module": "commonjs", + "types": ["node"], + "allowJs": false, + "baseUrl": ".", + "paths": {}, + "strictNullChecks": false, + "declaration": true, + "noImplicitAny": false, + "esModuleInterop": true, + "downlevelIteration": true, + "removeComments": true, + "allowSyntheticDefaultImports": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "suppressImplicitAnyIndexErrors": true, + "lib": ["es2015", "dom"], + "target": "es5", + "typeRoots": ["./node_modules/@types"], + "moduleResolution": "node", + "strictPropertyInitialization": false, + "resolveJsonModule": true, + "declarationMap": true, + "skipLibCheck": true + }, + "include": [".eslintrc.js", "src/**/*", "src/**/*.d.ts"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/packages/cli-next/tsconfig.json b/packages/cli-next/tsconfig.json new file mode 100644 index 00000000000..45128cc0019 --- /dev/null +++ b/packages/cli-next/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "module": "commonjs", + "types": ["node"], + "allowJs": false, + "baseUrl": ".", + "paths": {}, + "strictNullChecks": false, + "declaration": true, + "noImplicitAny": false, + "esModuleInterop": true, + "downlevelIteration": true, + "removeComments": true, + "allowSyntheticDefaultImports": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "suppressImplicitAnyIndexErrors": true, + "lib": ["es2015", "dom"], + "target": "es5", + "typeRoots": ["./node_modules/@types"], + "moduleResolution": "node", + "strictPropertyInitialization": false, + "resolveJsonModule": true, + "declarationMap": true, + "skipLibCheck": true + }, + "types": ["node", "mocha", "chai", "sinon", "cypress", "jest"] +} diff --git a/packages/cli-next/tsconfig.spec.json b/packages/cli-next/tsconfig.spec.json new file mode 100644 index 00000000000..b77fe7396a5 --- /dev/null +++ b/packages/cli-next/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "packages/cli/tsconfig.json", + "compilerOptions": { + "types": ["mocha", "node"], + "esModuleInterop": false + } +} diff --git a/packages/sdk/.eslintrc.js b/packages/sdk/.eslintrc.js new file mode 100644 index 00000000000..1e84a001783 --- /dev/null +++ b/packages/sdk/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + extends: ['../../.eslintrc.js'], + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2020, + sourceType: 'module', + tsconfigRootDir: __dirname, + }, + rules: { + '@typescript-eslint/no-explicit-any': 'off', + 'import/prefer-default-export': 0, + 'no-else-return': 0, + 'sonarjs/prefer-immediate-return': 0, + 'const-case/uppercase': 0, + 'unicorn/no-array-reduce': 0, + }, +}; diff --git a/packages/sdk/.gitignore b/packages/sdk/.gitignore new file mode 100644 index 00000000000..f0eef6453d7 --- /dev/null +++ b/packages/sdk/.gitignore @@ -0,0 +1,15 @@ +# Distribution +dist +out +build +node_modules + +# Logs +*.log* +logs + +# Environment +*.env* + +# Misc +.DS_Store diff --git a/packages/sdk/.prettierrc b/packages/sdk/.prettierrc new file mode 100644 index 00000000000..d327ba7d4af --- /dev/null +++ b/packages/sdk/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 120, + "trailingComma": "es5", + "singleQuote": true, + "semi": true, + "tabWidth": 2, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "arrowParens": "always" +} diff --git a/packages/sdk/README.md b/packages/sdk/README.md new file mode 100644 index 00000000000..0d2bafe83d8 --- /dev/null +++ b/packages/sdk/README.md @@ -0,0 +1,34 @@ +# Quickstart + +```typescript +const client = new Echo(); +client.workflow('comment-on-post', { type: 'object', properties: { post: { type: 'string' } } }, async ({ step }) => { + const userResponse = step.custom( + 'fetch-user', + { type: 'object', properties: { name: { type: 'string' } } }, + async () => ({ email: 'joe@bloggs.com' }) + ); + + step.email('send-email', async (payload) => { + return { + subject: 'You received a post', + body: `${payload.post}`, + to: userResponse.email, + }; + }); + + step.email('send-follow-up', async (payload) => { + return { + subject: 'You received a follow-up', + body: `${payload.post}`, + to: userResponse.email, + }; + }); +}); + +// Get the workflows +const workflows = client.getRegisteredWorkflows(); + +// Invoke a step +const result = client.invokeStep('comment-on-post', 'fetch-user', { post: 'Hello' }).then(console.log); +``` diff --git a/packages/sdk/jest.config.js b/packages/sdk/jest.config.js new file mode 100644 index 00000000000..446193a12f3 --- /dev/null +++ b/packages/sdk/jest.config.js @@ -0,0 +1,286 @@ +/* eslint-disable max-len */ +/** + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +module.exports = { + /* + * All imported modules in your tests should be mocked automatically + * automock: false, + */ + + /* + * Stop running tests after `n` failures + * bail: 0, + */ + + /* + * The directory where Jest should store its cached dependency information + * cspell:disable-next-line + * cacheDirectory: "/private/var/folders/h5/6fkfv6mj2wv2j74sgphjsxr00000gn/T/jest_dx", + */ + + // Automatically clear mock calls, instances, contexts and results before every test + clearMocks: true, + + /* + * Indicates whether the coverage information should be collected while executing the test + * collectCoverage: false, + */ + + /* + * An array of glob patterns indicating a set of files for which coverage information should be collected + * collectCoverageFrom: undefined, + */ + + /* + * The directory where Jest should output its coverage files + * coverageDirectory: undefined, + */ + + /* + * An array of regexp pattern strings used to skip coverage collection + * coveragePathIgnorePatterns: [ + * "/node_modules/" + * ], + */ + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: 'v8', + + /* + * A list of reporter names that Jest uses when writing coverage reports + * coverageReporters: [ + * "json", + * "text", + * "lcov", + * "clover" + * ], + */ + + /* + * An object that configures minimum threshold enforcement for coverage results + * coverageThreshold: undefined, + */ + + /* + * A path to a custom dependency extractor + * dependencyExtractor: undefined, + */ + + /* + * Make calling deprecated APIs throw helpful error messages + * errorOnDeprecated: false, + */ + + /* + * The default configuration for fake timers + * fakeTimers: { + * "enableGlobally": false + * }, + */ + + /* + * Force coverage collection from ignored files using an array of glob patterns + * forceCoverageMatch: [], + */ + + /* + * A path to a module which exports an async function that is triggered once before all test suites + * globalSetup: undefined, + */ + + /* + * A path to a module which exports an async function that is triggered once after all test suites + * globalTeardown: undefined, + */ + + /* + * A set of global variables that need to be available in all test environments + * globals: {}, + */ + + /* + * The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + * maxWorkers: "50%", + */ + + /* + * An array of directory names to be searched recursively up from the requiring module's location + * moduleDirectories: [ + * "node_modules" + * ], + */ + + /* + * An array of file extensions your modules use + * moduleFileExtensions: [ + * "js", + * "mjs", + * "cjs", + * "jsx", + * "ts", + * "tsx", + * "json", + * "node" + * ], + */ + + /* + * A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + * moduleNameMapper: {}, + */ + + /* + * An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + * modulePathIgnorePatterns: [], + */ + + /* + * Activates notifications for test results + * notify: false, + */ + + /* + * An enum that specifies notification mode. Requires { notify: true } + * notifyMode: "failure-change", + */ + + // A preset that is used as a base for Jest's configuration + preset: 'ts-jest', + + /* + * Run tests from one or more projects + * projects: undefined, + */ + + /* + * Use this configuration option to add custom reporters to Jest + * reporters: undefined, + */ + + /* + * Automatically reset mock state before every test + * resetMocks: false, + */ + + /* + * Reset the module registry before running each individual test + * resetModules: false, + */ + + /* + * A path to a custom resolver + * resolver: undefined, + */ + + /* + * Automatically restore mock state and implementation before every test + * restoreMocks: false, + */ + + /* + * The root directory that Jest should scan for tests and modules within + * rootDir: undefined, + */ + + // A list of paths to directories that Jest should use to search for files in + roots: ['/src'], + + /* + * Allows you to use a custom runner instead of Jest's default test runner + * runner: "jest-runner", + */ + + /* + * The paths to modules that run some code to configure or set up the testing environment before each test + * setupFiles: [], + */ + + /* + * A list of paths to modules that run some code to configure or set up the testing framework before each test + * setupFilesAfterEnv: [], + */ + + /* + * The number of seconds after which a test is considered as slow and reported as such in the results. + * slowTestThreshold: 5, + */ + + /* + * A list of paths to snapshot serializer modules Jest should use for snapshot testing + * snapshotSerializers: [], + */ + + // The test environment that will be used for testing + testEnvironment: 'node', + + /* + * Options that will be passed to the testEnvironment + * testEnvironmentOptions: {}, + */ + + /* + * Adds a location field to test results + * testLocationInResults: false, + */ + + // The glob patterns Jest uses to detect test files + testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'], + + /* + * An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + * testPathIgnorePatterns: [ + * "/node_modules/" + * ], + */ + + /* + * The regexp pattern or array of patterns that Jest uses to detect test files + * testRegex: [], + */ + + /* + * This option allows the use of a custom results processor + * testResultsProcessor: undefined, + */ + + /* + * This option allows use of a custom test runner + * testRunner: "jest-circus/runner", + */ + + /* + * A map from regular expressions to paths to transformers + * transform: undefined, + */ + + /* + * An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + * transformIgnorePatterns: [ + * "/node_modules/", + * "\\.pnp\\.[^\\/]+$" + * ], + */ + + /* + * An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + * unmockedModulePathPatterns: undefined, + */ + + /* + * Indicates whether each individual test should be reported during the run + * verbose: undefined, + */ + + /* + * An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + * watchPathIgnorePatterns: [], + */ + + /* + * Whether to use watchman for file crawling + * watchman: true, + */ +}; diff --git a/packages/sdk/package.json b/packages/sdk/package.json new file mode 100644 index 00000000000..c8cae31f4d2 --- /dev/null +++ b/packages/sdk/package.json @@ -0,0 +1,81 @@ +{ + "name": "@novu/echo", + "version": "0.0.1-alpha.23", + "description": "The Echo SDK, used to programmatically declare and manage your notifications.", + "main": "./index.js", + "types": "./index.d.ts", + "publishConfig": { + "registry": "https://registry.npmjs.org" + }, + "private": false, + "scripts": { + "preinstall": "npx only-allow pnpm", + "test": "jest", + "lint": "eslint src --ext .ts", + "lint:fix":"eslint src --ext .ts --fix", + "format": "prettier --check --ignore-path .gitignore .", + "format:fix": "prettier --write --ignore-path .gitignore .", + "start": "ts-node src/index.ts", + "clean": "rm -rf ./dist", + "build": "pnpm run clean && tsc --build && pnpm run build:copy", + "build:watch": "tsc --build --watch", + "build:copy": "cp package.json README.md dist", + "release:alpha": "pnpm i && npm version prerelease --preid=alpha && pnpm build && cd dist && npm publish" + }, + "keywords": [], + "author": "Athena", + "license": "ISC", + "exports": { + ".": { + "require": "./index.js", + "import": "./index.js", + "types": "./index.d.ts" + }, + "./express": { + "require": "./express.js", + "import": "./express.js", + "types": "./express.d.ts" + }, + "./next": { + "require": "./next.js", + "import": "./next.js", + "types": "./next.d.ts" + }, + "./nuxt": { + "require": "./nuxt.js", + "import": "./nuxt.js", + "types": "./nuxt.d.ts" + }, + "./h3": { + "require": "./h3.js", + "import": "./h3.js", + "types": "./h3.d.ts" + } + }, + "devDependencies": { + "@jest/globals": "^29.7.0", + "@types/express": "^4.17.13", + "@types/jest": "^29.5.12", + "@types/json-schema": "^7.0.15", + "@types/node": "^20.11.20", + "@vercel/node": "^2.15.9", + "express": "^4.18.2", + "jest": "^29.7.0", + "next": "^13.5.4", + "prettier": "^3.2.5", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" + }, + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "better-ajv-errors": "^1.2.0", + "chalk": "^4.1.2", + "cross-fetch": "^4.0.0", + "h3": "^1.11.1", + "json-schema-faker": "^0.5.6", + "json-schema-to-ts": "^3.0.0", + "ora": "^5.4.1" + } +} diff --git a/packages/sdk/pnpm-lock.yaml b/packages/sdk/pnpm-lock.yaml new file mode 100644 index 00000000000..bdb4ab45b01 --- /dev/null +++ b/packages/sdk/pnpm-lock.yaml @@ -0,0 +1,7225 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + ajv: + specifier: ^8.12.0 + version: 8.12.0 + ajv-formats: + specifier: ^2.1.1 + version: 2.1.1(ajv@8.12.0) + better-ajv-errors: + specifier: ^1.2.0 + version: 1.2.0(ajv@8.12.0) + chalk: + specifier: ^4.1.2 + version: 4.1.2 + cross-fetch: + specifier: ^4.0.0 + version: 4.0.0 + h3: + specifier: ^1.11.1 + version: 1.11.1 + json-schema-faker: + specifier: ^0.5.6 + version: 0.5.6 + json-schema-to-ts: + specifier: ^3.0.0 + version: 3.0.0 + ora: + specifier: ^5.4.1 + version: 5.4.1 + +devDependencies: + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/express': + specifier: ^4.17.13 + version: 4.17.21 + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/json-schema': + specifier: ^7.0.15 + version: 7.0.15 + '@types/node': + specifier: ^20.11.20 + version: 20.11.20 + '@typescript-eslint/eslint-plugin': + specifier: ^7.1.0 + version: 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^7.1.0 + version: 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@vercel/node': + specifier: ^2.15.9 + version: 2.15.10 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-adjunct: + specifier: ^4.13.0 + version: 4.13.0(typescript@5.3.3) + eslint-config-airbnb-base: + specifier: ^15.0.0 + version: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-config-airbnb-typescript: + specifier: ^18.0.0 + version: 18.0.0(@typescript-eslint/eslint-plugin@7.1.0)(@typescript-eslint/parser@7.1.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-config-auto: + specifier: ^0.9.0 + version: 0.9.0(typescript@5.3.3) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-const-case: + specifier: ^1.2.2 + version: 1.2.2 + eslint-plugin-eslint-comments: + specifier: ^3.2.0 + version: 3.2.0(eslint@8.57.0) + eslint-plugin-html: + specifier: ^8.0.0 + version: 8.0.0 + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) + eslint-plugin-jest: + specifier: ^27.9.0 + version: 27.9.0(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0)(jest@29.7.0)(typescript@5.3.3) + eslint-plugin-jest-async: + specifier: ^1.0.3 + version: 1.0.3 + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + eslint-plugin-markdown: + specifier: ^3.0.1 + version: 3.0.1(eslint@8.57.0) + eslint-plugin-no-constructor-bind: + specifier: ^2.0.4 + version: 2.0.4 + eslint-plugin-no-secrets: + specifier: ^0.8.9 + version: 0.8.9(eslint@8.57.0) + eslint-plugin-no-unsanitized: + specifier: ^4.0.2 + version: 4.0.2(eslint@8.57.0) + eslint-plugin-no-use-extend-native: + specifier: ^0.5.0 + version: 0.5.0 + eslint-plugin-optimize-regex: + specifier: ^1.2.1 + version: 1.2.1 + eslint-plugin-pii: + specifier: ^1.0.2 + version: 1.0.2(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@8.57.0) + eslint-plugin-security: + specifier: ^2.1.1 + version: 2.1.1 + eslint-plugin-simple-import-sort: + specifier: ^12.0.0 + version: 12.0.0(eslint@8.57.0) + eslint-plugin-sonarjs: + specifier: ^0.24.0 + version: 0.24.0(eslint@8.57.0) + eslint-plugin-switch-case: + specifier: ^1.1.2 + version: 1.1.2 + eslint-plugin-unicorn: + specifier: ^51.0.1 + version: 51.0.1(eslint@8.57.0) + eslint-plugin-xss: + specifier: ^0.1.12 + version: 0.1.12 + express: + specifier: ^4.18.2 + version: 4.18.3 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + next: + specifier: ^13.5.4 + version: 13.5.6(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0) + prettier: + specifier: ^3.2.5 + version: 3.2.5 + ts-jest: + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.24.0)(jest@29.7.0)(typescript@5.3.3) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.11.20)(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + +packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== } + engines: { node: '>=0.10.0' } + dev: true + + /@ampproject/remapping@2.3.0: + resolution: + { integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== } + engines: { node: '>=6.0.0' } + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/code-frame@7.23.5: + resolution: + { integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: + { integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/core@7.24.0: + resolution: + { integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== } + engines: { node: '>=6.9.0' } + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helpers': 7.24.0 + '@babel/parser': 7.24.0 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.6: + resolution: + { integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: + { integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: + { integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: + { integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: + { integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: + { integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: + { integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: + { integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: + { integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: + { integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: + { integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== } + engines: { node: '>=6.9.0' } + + /@babel/helper-validator-option@7.23.5: + resolution: + { integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== } + engines: { node: '>=6.9.0' } + dev: true + + /@babel/helpers@7.24.0: + resolution: + { integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: + { integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.24.0: + resolution: + { integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== } + engines: { node: '>=6.0.0' } + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + resolution: + { integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + resolution: + { integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + resolution: + { integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + resolution: + { integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + resolution: + { integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + resolution: + { integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/runtime@7.24.0: + resolution: + { integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== } + engines: { node: '>=6.9.0' } + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.24.0: + resolution: + { integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/traverse@7.24.0: + resolution: + { integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.24.0: + resolution: + { integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== } + engines: { node: '>=6.9.0' } + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: + { integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== } + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: + { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } + engines: { node: '>=12' } + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@edge-runtime/format@2.1.0: + resolution: + { integrity: sha512-gc2qbYEIIJRczBApBPznVI1c5vZgzrZQOsFZnAxxFiYah9qldHiu1YEitzSvXI8X8ZgvAguuIiyIbpWz17nlXA== } + engines: { node: '>=14' } + dev: true + + /@edge-runtime/node-utils@2.0.3: + resolution: + { integrity: sha512-JUSbi5xu/A8+D2t9B9wfirCI1J8n8q0660FfmqZgA+n3RqxD3y7SnamL1sKRE5/AbHsKs9zcqCbK2YDklbc9Bg== } + engines: { node: '>=14' } + dev: true + + /@edge-runtime/primitives@2.1.2: + resolution: + { integrity: sha512-SR04SMDybALlhIYIi0hiuEUwIl0b7Sn+RKwQkX6hydg4+AKMzBNDFhj2nqHDD1+xkHArV9EhmJIb6iGjShwSzg== } + engines: { node: '>=14' } + dev: true + + /@edge-runtime/primitives@3.0.1: + resolution: + { integrity: sha512-l5NNDcPkKW4N6qRmB8zzpCF6uRW1S808V/zm72z7b/aWwZUYbmEPPkzyhGAW0aQxLU1pGdZ8u2gNjamdaU6RXw== } + engines: { node: '>=14' } + dev: true + + /@edge-runtime/primitives@3.0.3: + resolution: + { integrity: sha512-YnfMWMRQABAH8IsnFMJWMW+SyB4ZeYBPnR7V0aqdnew7Pq60cbH5DyFjS/FhiLwvHQk9wBREmXD7PP0HooEQ1A== } + engines: { node: '>=14' } + dev: true + + /@edge-runtime/vm@3.0.1: + resolution: + { integrity: sha512-69twXLIcqVx0iNlc1vFqnXgka2CZi2c/QBAmMzXBk0M6mPG+ICCBh2dd+cv1K+HW2pfLuSW+EskkFXWGeCf1Vw== } + engines: { node: '>=14' } + dependencies: + '@edge-runtime/primitives': 3.0.1 + dev: true + + /@edge-runtime/vm@3.0.3: + resolution: + { integrity: sha512-SPfI1JeIRNs/4EEE2Oc0X6gG3RqjD1TnKu2lwmwFXq0435xgZGKhc3UiKkYAdoMn2dNFD73nlabMKHBRoMRpxg== } + engines: { node: '>=14' } + dependencies: + '@edge-runtime/primitives': 3.0.3 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: + { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: + { integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: + { integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/eslintrc@3.0.2: + resolution: + { integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: + { integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: + { integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== } + engines: { node: '>=10.10.0' } + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: '>=12.22' } + dev: true + + /@humanwhocodes/momoa@2.0.4: + resolution: + { integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA== } + engines: { node: '>=10.10.0' } + dev: false + + /@humanwhocodes/object-schema@2.0.2: + resolution: + { integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== } + dev: true + + /@isaacs/cliui@8.0.2: + resolution: + { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: '>=12' } + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: + { integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== } + engines: { node: '>=8' } + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: + { integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== } + engines: { node: '>=8' } + dev: true + + /@jest/console@29.7.0: + resolution: + { integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/core@29.7.0(ts-node@10.9.2): + resolution: + { integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@29.7.0: + resolution: + { integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: + { integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: + { integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.7.0: + resolution: + { integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.11.20 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /@jest/globals@29.7.0: + resolution: + { integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.7.0: + resolution: + { integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.11.20 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: + { integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.3: + resolution: + { integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.7.0: + resolution: + { integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.7.0: + resolution: + { integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/transform@29.7.0: + resolution: + { integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/core': 7.24.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.3: + resolution: + { integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.11.20 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: + { integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== } + engines: { node: '>=6.0.0' } + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: + { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } + engines: { node: '>=6.0.0' } + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: + { integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== } + engines: { node: '>=6.0.0' } + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } + dev: true + + /@jridgewell/trace-mapping@0.3.25: + resolution: + { integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== } + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: + { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@next/env@13.5.6: + resolution: + { integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw== } + dev: true + + /@next/swc-darwin-arm64@13.5.6: + resolution: + { integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@next/swc-darwin-x64@13.5.6: + resolution: + { integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA== } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-arm64-gnu@13.5.6: + resolution: + { integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-arm64-musl@13.5.6: + resolution: + { integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-x64-gnu@13.5.6: + resolution: + { integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-x64-musl@13.5.6: + resolution: + { integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-win32-arm64-msvc@13.5.6: + resolution: + { integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@next/swc-win32-ia32-msvc@13.5.6: + resolution: + { integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg== } + engines: { node: '>= 10' } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@next/swc-win32-x64-msvc@13.5.6: + resolution: + { integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ== } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: '>= 8' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: '>= 8' } + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: '>= 8' } + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: + { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } + engines: { node: '>=14' } + requiresBuild: true + dev: true + optional: true + + /@pkgr/core@0.1.1: + resolution: + { integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + dev: true + + /@sinclair/typebox@0.27.8: + resolution: + { integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== } + dev: true + + /@sinonjs/commons@3.0.1: + resolution: + { integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== } + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: + { integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== } + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true + + /@swc/helpers@0.5.2: + resolution: + { integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== } + dependencies: + tslib: 2.6.2 + dev: true + + /@ts-morph/common@0.11.1: + resolution: + { integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g== } + dependencies: + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: true + + /@tsconfig/node10@1.0.9: + resolution: + { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== } + dev: true + + /@tsconfig/node12@1.0.11: + resolution: + { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== } + dev: true + + /@tsconfig/node14@1.0.3: + resolution: + { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== } + dev: true + + /@tsconfig/node16@1.0.4: + resolution: + { integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== } + dev: true + + /@types/babel__core@7.20.5: + resolution: + { integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== } + dependencies: + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: + { integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== } + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/babel__template@7.4.4: + resolution: + { integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== } + dependencies: + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: + { integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== } + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/body-parser@1.19.5: + resolution: + { integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== } + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.11.20 + dev: true + + /@types/connect@3.4.38: + resolution: + { integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== } + dependencies: + '@types/node': 20.11.20 + dev: true + + /@types/express-serve-static-core@4.17.43: + resolution: + { integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== } + dependencies: + '@types/node': 20.11.20 + '@types/qs': 6.9.12 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: + { integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== } + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.43 + '@types/qs': 6.9.12 + '@types/serve-static': 1.15.5 + dev: true + + /@types/graceful-fs@4.1.9: + resolution: + { integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== } + dependencies: + '@types/node': 20.11.20 + dev: true + + /@types/http-errors@2.0.4: + resolution: + { integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== } + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: + { integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== } + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: + { integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== } + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: + { integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== } + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.5.12: + resolution: + { integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== } + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/json-schema@7.0.15: + resolution: + { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } + + /@types/json5@0.0.29: + resolution: + { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } + dev: true + + /@types/mdast@3.0.15: + resolution: + { integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== } + dependencies: + '@types/unist': 2.0.10 + dev: true + + /@types/mime@1.3.5: + resolution: + { integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== } + dev: true + + /@types/mime@3.0.4: + resolution: + { integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== } + dev: true + + /@types/node-fetch@2.6.3: + resolution: + { integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w== } + dependencies: + '@types/node': 20.11.20 + form-data: 3.0.1 + dev: true + + /@types/node@14.18.33: + resolution: + { integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== } + dev: true + + /@types/node@20.11.20: + resolution: + { integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg== } + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: + { integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== } + dev: true + + /@types/qs@6.9.12: + resolution: + { integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg== } + dev: true + + /@types/range-parser@1.2.7: + resolution: + { integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== } + dev: true + + /@types/semver@7.5.8: + resolution: + { integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== } + dev: true + + /@types/send@0.17.4: + resolution: + { integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== } + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.11.20 + dev: true + + /@types/serve-static@1.15.5: + resolution: + { integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== } + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.11.20 + dev: true + + /@types/stack-utils@2.0.3: + resolution: + { integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== } + dev: true + + /@types/unist@2.0.10: + resolution: + { integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== } + dev: true + + /@types/yargs-parser@21.0.3: + resolution: + { integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== } + dev: true + + /@types/yargs@17.0.32: + resolution: + { integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== } + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): + resolution: + { integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w== } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.1.0 + '@typescript-eslint/type-utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.1.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3): + resolution: + { integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w== } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.1.0 + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.1.0 + debug: 4.3.4 + eslint: 8.57.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: + { integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@7.1.0: + resolution: + { integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A== } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/visitor-keys': 7.1.0 + dev: true + + /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): + resolution: + { integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew== } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: + { integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@typescript-eslint/types@7.1.0: + resolution: + { integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA== } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + resolution: + { integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + 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.6.0 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3): + resolution: + { integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ== } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/visitor-keys': 7.1.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): + resolution: + { integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): + resolution: + { integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw== } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.1.0 + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: + { integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@7.1.0: + resolution: + { integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA== } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + '@typescript-eslint/types': 7.1.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: + { integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== } + dev: true + + /@vercel/build-utils@6.8.3: + resolution: + { integrity: sha512-C86OPuPAvG/pSr27DPKecmptkYYsgyhOKdHTLv9jI3Pv1yvru78k+JjrAyn7N+0ev75KNV0Prv4P3p76168ePw== } + dev: true + + /@vercel/error-utils@1.0.10: + resolution: + { integrity: sha512-nsKy2sy+pjUWyKI1V/XXKspVzHMYgSalmj5+EsKWFXZbnNZicqxNtMR94J8Hs7SB4TQxh0s4KhczJtL59AVGMg== } + dev: true + + /@vercel/node@2.15.10: + resolution: + { integrity: sha512-IfnqnKAJlL1+0FSDJgxoe9J3kfYAgPGDjz4aO/H5FSjvqP7cKJnns1F9GsQq4pM499+TY8T8mKAdos7/m+WOEw== } + dependencies: + '@edge-runtime/node-utils': 2.0.3 + '@edge-runtime/primitives': 2.1.2 + '@edge-runtime/vm': 3.0.1 + '@types/node': 14.18.33 + '@types/node-fetch': 2.6.3 + '@vercel/build-utils': 6.8.3 + '@vercel/error-utils': 1.0.10 + '@vercel/static-config': 2.0.17 + async-listen: 3.0.0 + content-type: 1.0.5 + edge-runtime: 2.4.4 + esbuild: 0.14.47 + exit-hook: 2.2.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + dev: true + + /@vercel/static-config@2.0.17: + resolution: + { integrity: sha512-2f50OTVrN07x7pH+XNW0e7cj7T+Ufg+19+a2N3/XZBjQmV+FaMlmSLiaQ4tBxp2H8lWWHzENua7ZSSQPtRZ3/A== } + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + dev: true + + /accepts@1.3.8: + resolution: + { integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== } + engines: { node: '>= 0.6' } + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: + { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: + { integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== } + engines: { node: '>=0.4.0' } + dev: true + + /acorn@8.11.3: + resolution: + { integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== } + engines: { node: '>=0.4.0' } + hasBin: true + dev: true + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: + { integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== } + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: + { integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.6.3: + resolution: + { integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-escapes@4.3.2: + resolution: + { integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== } + engines: { node: '>=8' } + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@5.0.1: + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: '>=8' } + + /ansi-regex@6.0.1: + resolution: + { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } + engines: { node: '>=12' } + dev: true + + /ansi-styles@3.2.1: + resolution: + { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== } + engines: { node: '>=4' } + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: '>=8' } + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: + { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } + engines: { node: '>=10' } + dev: true + + /ansi-styles@6.2.1: + resolution: + { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } + engines: { node: '>=12' } + dev: true + + /anymatch@3.1.3: + resolution: + { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } + engines: { node: '>= 8' } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@4.1.3: + resolution: + { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } + dev: true + + /argparse@1.0.10: + resolution: + { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: + { integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-flatten@1.1.1: + resolution: + { integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== } + dev: true + + /array-includes@3.1.7: + resolution: + { integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: + { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } + engines: { node: '>=8' } + dev: true + + /array.prototype.filter@1.0.3: + resolution: + { integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /array.prototype.findlastindex@1.2.4: + resolution: + { integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: + { integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: + { integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: + { integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== } + engines: { node: '>= 0.4' } + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /arrify@2.0.1: + resolution: + { integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== } + engines: { node: '>=8' } + dev: true + + /async-listen@3.0.0: + resolution: + { integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg== } + engines: { node: '>= 14' } + dev: true + + /asynckit@0.4.0: + resolution: + { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } + dev: true + + /available-typed-arrays@1.0.7: + resolution: + { integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== } + engines: { node: '>= 0.4' } + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /babel-jest@29.7.0(@babel/core@7.24.0): + resolution: + { integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.24.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: + { integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== } + engines: { node: '>=8' } + dependencies: + '@babel/helper-plugin-utils': 7.24.0 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.6.3: + resolution: + { integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): + resolution: + { integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.0): + resolution: + { integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + dev: true + + /balanced-match@1.0.2: + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + dev: true + + /base64-js@1.5.1: + resolution: + { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } + dev: false + + /better-ajv-errors@1.2.0(ajv@8.12.0): + resolution: + { integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA== } + engines: { node: '>= 12.13.0' } + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.23.5 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.12.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + + /bl@4.1.0: + resolution: + { integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== } + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /body-parser@1.20.2: + resolution: + { integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /brace-expansion@1.1.11: + resolution: + { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: + { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: + { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } + engines: { node: '>=8' } + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.23.0: + resolution: + { integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001591 + electron-to-chromium: 1.4.692 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /bs-logger@0.2.6: + resolution: + { integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== } + engines: { node: '>= 6' } + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: + { integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== } + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from@1.1.2: + resolution: + { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== } + dev: true + + /buffer@5.7.1: + resolution: + { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtin-modules@3.3.0: + resolution: + { integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== } + engines: { node: '>=6' } + dev: true + + /busboy@1.6.0: + resolution: + { integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== } + engines: { node: '>=10.16.0' } + dependencies: + streamsearch: 1.1.0 + dev: true + + /bytes@3.1.2: + resolution: + { integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== } + engines: { node: '>= 0.8' } + dev: true + + /call-bind@1.0.7: + resolution: + { integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== } + engines: { node: '>= 0.4' } + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + dev: true + + /call-me-maybe@1.0.2: + resolution: + { integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== } + dev: false + + /callsites@3.1.0: + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: '>=6' } + dev: true + + /camelcase@5.3.1: + resolution: + { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== } + engines: { node: '>=6' } + dev: true + + /camelcase@6.3.0: + resolution: + { integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== } + engines: { node: '>=10' } + dev: true + + /caniuse-lite@1.0.30001591: + resolution: + { integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== } + dev: true + + /chalk@2.4.2: + resolution: + { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } + engines: { node: '>=4' } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex@1.0.2: + resolution: + { integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== } + engines: { node: '>=10' } + dev: true + + /character-entities-legacy@1.1.4: + resolution: + { integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== } + dev: true + + /character-entities@1.2.4: + resolution: + { integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== } + dev: true + + /character-reference-invalid@1.1.4: + resolution: + { integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== } + dev: true + + /ci-info@3.9.0: + resolution: + { integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== } + engines: { node: '>=8' } + dev: true + + /ci-info@4.0.0: + resolution: + { integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== } + engines: { node: '>=8' } + dev: true + + /cjs-module-lexer@1.2.3: + resolution: + { integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== } + dev: true + + /clean-regexp@1.0.0: + resolution: + { integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== } + engines: { node: '>=4' } + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /cli-cursor@3.1.0: + resolution: + { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } + engines: { node: '>=8' } + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.9.2: + resolution: + { integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== } + engines: { node: '>=6' } + dev: false + + /client-only@0.0.1: + resolution: + { integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== } + dev: true + + /cliui@8.0.1: + resolution: + { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } + engines: { node: '>=12' } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@1.0.4: + resolution: + { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } + engines: { node: '>=0.8' } + dev: false + + /co@4.6.0: + resolution: + { integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== } + engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } + dev: true + + /code-block-writer@10.1.1: + resolution: + { integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== } + dev: true + + /collect-v8-coverage@1.0.2: + resolution: + { integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== } + dev: true + + /color-convert@1.9.3: + resolution: + { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: '>=7.0.0' } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: + { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== } + + /color-name@1.1.4: + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + + /combined-stream@1.0.8: + resolution: + { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: '>= 0.8' } + dependencies: + delayed-stream: 1.0.0 + dev: true + + /concat-map@0.0.1: + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + dev: true + + /confusing-browser-globals@1.0.11: + resolution: + { integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== } + dev: true + + /consola@3.2.3: + resolution: + { integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== } + engines: { node: ^14.18.0 || >=16.10.0 } + dev: false + + /content-disposition@0.5.4: + resolution: + { integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== } + engines: { node: '>= 0.6' } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: + { integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== } + engines: { node: '>= 0.6' } + dev: true + + /convert-hrtime@3.0.0: + resolution: + { integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA== } + engines: { node: '>=8' } + dev: true + + /convert-source-map@2.0.0: + resolution: + { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } + dev: true + + /cookie-es@1.1.0: + resolution: + { integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw== } + dev: false + + /cookie-signature@1.0.6: + resolution: + { integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== } + dev: true + + /cookie@0.5.0: + resolution: + { integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== } + engines: { node: '>= 0.6' } + dev: true + + /core-js-compat@3.36.0: + resolution: + { integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== } + dependencies: + browserslist: 4.23.0 + dev: true + + /cosmiconfig@9.0.0(typescript@5.3.3): + resolution: + { integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== } + engines: { node: '>=14' } + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.3.3 + dev: true + + /create-jest@29.7.0(@types/node@20.11.20)(ts-node@10.9.2): + resolution: + { integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /create-require@1.1.1: + resolution: + { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } + dev: true + + /cross-fetch@4.0.0: + resolution: + { integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== } + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: + { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } + engines: { node: '>= 8' } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crossws@0.2.4: + resolution: + { integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg== } + peerDependencies: + uWebSockets.js: '*' + peerDependenciesMeta: + uWebSockets.js: + optional: true + dev: false + + /debug@2.6.9: + resolution: + { integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: + { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4: + resolution: + { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /dedent@1.5.1: + resolution: + { integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== } + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-is@0.1.4: + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + dev: true + + /deepmerge@4.3.1: + resolution: + { integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== } + engines: { node: '>=0.10.0' } + dev: true + + /defaults@1.0.4: + resolution: + { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } + dependencies: + clone: 1.0.4 + dev: false + + /define-data-property@1.1.4: + resolution: + { integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== } + engines: { node: '>= 0.4' } + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: + { integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== } + engines: { node: '>= 0.4' } + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /defu@6.1.4: + resolution: + { integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== } + dev: false + + /delayed-stream@1.0.0: + resolution: + { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: '>=0.4.0' } + dev: true + + /depd@2.0.0: + resolution: + { integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== } + engines: { node: '>= 0.8' } + dev: true + + /destr@2.0.3: + resolution: + { integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== } + dev: false + + /destroy@1.2.0: + resolution: + { integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + dev: true + + /detect-newline@3.1.0: + resolution: + { integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== } + engines: { node: '>=8' } + dev: true + + /diff-sequences@29.6.3: + resolution: + { integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /diff@4.0.2: + resolution: + { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } + engines: { node: '>=0.3.1' } + dev: true + + /dir-glob@3.0.1: + resolution: + { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } + engines: { node: '>=8' } + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: + { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } + engines: { node: '>=0.10.0' } + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: + { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== } + engines: { node: '>=6.0.0' } + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer@2.0.0: + resolution: + { integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@2.3.0: + resolution: + { integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== } + dev: true + + /domhandler@5.0.3: + resolution: + { integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== } + engines: { node: '>= 4' } + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@3.1.0: + resolution: + { integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== } + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /eastasianwidth@0.2.0: + resolution: + { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } + dev: true + + /edge-runtime@2.4.4: + resolution: + { integrity: sha512-uq1YdIxkMDsBYLdSSp/w62PciCL46ic4m1Z/2G6N8RcAPI8p35O8u6hJQT83j28Dnt4U5iyvmwFMYouHMK51uA== } + engines: { node: '>=14' } + hasBin: true + dependencies: + '@edge-runtime/format': 2.1.0 + '@edge-runtime/vm': 3.0.3 + async-listen: 3.0.0 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-bytes: 5.6.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + dev: true + + /ee-first@1.1.1: + resolution: + { integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== } + dev: true + + /electron-to-chromium@1.4.692: + resolution: + { integrity: sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA== } + dev: true + + /emittery@0.13.1: + resolution: + { integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== } + engines: { node: '>=12' } + dev: true + + /emoji-regex@8.0.0: + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + dev: true + + /emoji-regex@9.2.2: + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + dev: true + + /encodeurl@1.0.2: + resolution: + { integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== } + engines: { node: '>= 0.8' } + dev: true + + /entities@4.5.0: + resolution: + { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } + engines: { node: '>=0.12' } + dev: true + + /env-paths@2.2.1: + resolution: + { integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== } + engines: { node: '>=6' } + dev: true + + /error-ex@1.3.2: + resolution: + { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.22.5: + resolution: + { integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== } + engines: { node: '>= 0.4' } + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.14 + dev: true + + /es-array-method-boxes-properly@1.0.0: + resolution: + { integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== } + dev: true + + /es-define-property@1.0.0: + resolution: + { integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== } + engines: { node: '>= 0.4' } + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: + { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } + engines: { node: '>= 0.4' } + dev: true + + /es-set-tostringtag@2.0.3: + resolution: + { integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== } + engines: { node: '>= 0.4' } + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: + { integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== } + dependencies: + hasown: 2.0.1 + dev: true + + /es-to-primitive@1.2.1: + resolution: + { integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== } + engines: { node: '>= 0.4' } + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild-android-64@0.14.47: + resolution: + { integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g== } + engines: { node: '>=12' } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.14.47: + resolution: + { integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ== } + engines: { node: '>=12' } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.14.47: + resolution: + { integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA== } + engines: { node: '>=12' } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.14.47: + resolution: + { integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== } + engines: { node: '>=12' } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.14.47: + resolution: + { integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ== } + engines: { node: '>=12' } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.14.47: + resolution: + { integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ== } + engines: { node: '>=12' } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.14.47: + resolution: + { integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw== } + engines: { node: '>=12' } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.14.47: + resolution: + { integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw== } + engines: { node: '>=12' } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.14.47: + resolution: + { integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw== } + engines: { node: '>=12' } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.14.47: + resolution: + { integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA== } + engines: { node: '>=12' } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.14.47: + resolution: + { integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg== } + engines: { node: '>=12' } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.14.47: + resolution: + { integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w== } + engines: { node: '>=12' } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.14.47: + resolution: + { integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g== } + engines: { node: '>=12' } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.14.47: + resolution: + { integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw== } + engines: { node: '>=12' } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.14.47: + resolution: + { integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ== } + engines: { node: '>=12' } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64@0.14.47: + resolution: + { integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw== } + engines: { node: '>=12' } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64@0.14.47: + resolution: + { integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ== } + engines: { node: '>=12' } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32@0.14.47: + resolution: + { integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ== } + engines: { node: '>=12' } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.14.47: + resolution: + { integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ== } + engines: { node: '>=12' } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.14.47: + resolution: + { integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ== } + engines: { node: '>=12' } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild@0.14.47: + resolution: + { integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== } + engines: { node: '>=12' } + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + dev: true + + /escalade@3.1.2: + resolution: + { integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== } + engines: { node: '>=6' } + dev: true + + /escape-html@1.0.3: + resolution: + { integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== } + dev: true + + /escape-string-regexp@1.0.5: + resolution: + { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } + engines: { node: '>=0.8.0' } + + /escape-string-regexp@2.0.0: + resolution: + { integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== } + engines: { node: '>=8' } + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: '>=10' } + dev: true + + /eslint-config-adjunct@4.13.0(typescript@5.3.3): + resolution: + { integrity: sha512-UHVbgnrSlJZ27ZCDnP2KNz54aIJk2t3mrnneGCD51kOg1jxxHz4Av6SxhLIGKRugqchaglvy6gMzpGTtzmkWNg== } + engines: { node: '>= 6.5' } + dependencies: + '@eslint/eslintrc': 3.0.2 + arrify: 2.0.1 + cosmiconfig: 9.0.0(typescript@5.3.3) + lodash: 4.17.21 + mkdirp: 3.0.1 + path: 0.12.7 + ramda: 0.29.1 + read-pkg-up: 7.0.1 + rimraf: 5.0.5 + url: 0.11.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): + resolution: + { integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== } + engines: { node: ^10.12.0 || >=12.0.0 } + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) + object.assign: 4.1.5 + object.entries: 1.1.7 + semver: 6.3.1 + dev: true + + /eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.1.0)(@typescript-eslint/parser@7.1.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + resolution: + { integrity: sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg== } + peerDependencies: + '@typescript-eslint/eslint-plugin': ^7.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + dependencies: + '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - eslint-plugin-import + dev: true + + /eslint-config-auto@0.9.0(typescript@5.3.3): + resolution: + { integrity: sha512-01brVJWU2THr9ReGT7nJL9Jye0IosAFVZjJMGM0DXENOrZ9iNug5X+Ak1382FCsXN4NTC61C0VTq471bT8Wo4Q== } + engines: { node: '>= 8.3' } + dependencies: + arrify: 2.0.1 + cosmiconfig: 9.0.0(typescript@5.3.3) + eslint-config-adjunct: 4.13.0(typescript@5.3.3) + lodash: 4.17.21 + mkdir: 0.0.2 + mkdirp: 3.0.1 + ramda: 0.29.1 + read-pkg-up: 7.0.1 + rimraf: 5.0.5 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: + { integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== } + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: + { integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== } + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.1.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: + { integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== } + engines: { node: '>=4' } + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-const-case@1.2.2: + resolution: + { integrity: sha512-ON8VLOfGqXRW9Zck+lhgT5k6+jAW+lH7RRjH0YvA42trYhSq6Ayq8m3frqCJhlArDwfPKnjHVVyZhQurTDL3OQ== } + engines: { node: '>=10' } + dependencies: + requireindex: 1.2.0 + dev: true + + /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): + resolution: + { integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== } + engines: { node: '>=6.5.0' } + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.57.0 + ignore: 5.3.1 + dev: true + + /eslint-plugin-html@8.0.0: + resolution: + { integrity: sha512-NINLBAXM3mLa3k5Ezr/kNLHAJJwbot6lS7Ro+SUftDw4cA51KMmcDuCf98GP6Q6kTVPY1hIggzskxAdxfUPXSA== } + engines: { node: '>=16.0.0' } + dependencies: + htmlparser2: 9.1.0 + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.1.0)(eslint@8.57.0): + resolution: + { integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== } + engines: { node: '>=4' } + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.1.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.1 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest-async@1.0.3: + resolution: + { integrity: sha512-NgpO6L9IWWgxxqbqvN+mCbGs4MMBsALpvagOFnWJgsQSkyYVmMzYwVe2b4Wpak3sfl8sPK13vnpqsEBNlpyTlQ== } + engines: { node: '>=0.10.0' } + dependencies: + requireindex: 1.1.0 + dev: true + + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.1.0)(eslint@8.57.0)(jest@29.7.0)(typescript@5.3.3): + resolution: + { integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + jest: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g== } + engines: { node: '>=12.0' } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-plugin-markdown@3.0.1(eslint@8.57.0): + resolution: + { integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.57.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-no-constructor-bind@2.0.4: + resolution: + { integrity: sha512-r0CGAE5SrRYt1OdACNiZGiOcBbFslKIPnMrFo3kPmX3iKZOm8HRD2eIbqhlc9lSSiBWcPZxXErXnroqgt+dKBg== } + engines: { node: '>=8.0.0' } + dependencies: + requireindex: 1.2.0 + dev: true + + /eslint-plugin-no-secrets@0.8.9(eslint@8.57.0): + resolution: + { integrity: sha512-CqaBxXrImABCtxMWspAnm8d5UKkpNylC7zqVveb+fJHEvsSiNGJlSWzdSIvBUnW1XhJXkzifNIZQC08rEII5Ng== } + engines: { node: '>=10.0.0', npm: '>=6.9.0' } + peerDependencies: + eslint: '>=3.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-no-unsanitized@4.0.2(eslint@8.57.0): + resolution: + { integrity: sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ== } + peerDependencies: + eslint: ^6 || ^7 || ^8 + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-no-use-extend-native@0.5.0: + resolution: + { integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ== } + engines: { node: '>=6.0.0' } + dependencies: + is-get-set-prop: 1.0.0 + is-js-type: 2.0.0 + is-obj-prop: 1.0.0 + is-proto-prop: 2.0.0 + dev: true + + /eslint-plugin-optimize-regex@1.2.1: + resolution: + { integrity: sha512-fUaU7Tj1G/KSTDTABJw4Wp427Rl7RPl9ViYTu1Jrv36fJw4DFhd4elPdXiuYtdPsNsvzn9GcVlKEssGIVjw0UQ== } + engines: { node: '>=10' } + dependencies: + regexp-tree: 0.1.27 + dev: true + + /eslint-plugin-pii@1.0.2(eslint@8.57.0): + resolution: + { integrity: sha512-UKOpjAxd2aGDfykeICHi6yceZOQD4KXTX25A/PLq1HCgkFRudRTvGkRzuDYZoI6oLj8TjHsEiHnDxkoapFKX4Q== } + engines: { node: '>=0.10.0' } + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 4.0.0 + eslint: 8.57.0 + ignore: 5.3.1 + requireindex: 1.1.0 + dev: true + + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): + resolution: + { integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.57.0): + resolution: + { integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-security@2.1.1: + resolution: + { integrity: sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w== } + dependencies: + safe-regex: 2.1.1 + dev: true + + /eslint-plugin-simple-import-sort@12.0.0(eslint@8.57.0): + resolution: + { integrity: sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ== } + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-sonarjs@0.24.0(eslint@8.57.0): + resolution: + { integrity: sha512-87zp50mbbNrSTuoEOebdRQBPa0mdejA5UEjyuScyIw8hEpEjfWP89Qhkq5xVZfVyVSRQKZc9alVm7yRKQvvUmg== } + engines: { node: '>=16' } + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-switch-case@1.1.2: + resolution: + { integrity: sha512-mhDdJ6WX5LKv0PccziefBGPhIryJamgd3vTNqhEZUBeTGUeGdsgttwU/68xOViyScwr8RqCwTGC2Pd1cPYGNRg== } + engines: { node: '>=4' } + dependencies: + lodash.last: 3.0.0 + lodash.zipobject: 4.1.3 + dev: true + + /eslint-plugin-unicorn@51.0.1(eslint@8.57.0): + resolution: + { integrity: sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw== } + engines: { node: '>=16' } + peerDependencies: + eslint: '>=8.56.0' + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 + clean-regexp: 1.0.0 + core-js-compat: 3.36.0 + eslint: 8.57.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.0 + strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-xss@0.1.12: + resolution: + { integrity: sha512-L5oYaD//ZE7fKNtWUfVgYTRW19jrZlvaHe2swyFLxXQ5pwVQLivi5m92rtXd/ww8yqg4Drasqyi0hlBmhf9YQg== } + engines: { node: '>=0.10.0' } + dependencies: + requireindex: 1.1.0 + dev: true + + /eslint-scope@5.1.1: + resolution: + { integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== } + engines: { node: '>=8.0.0' } + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: + { integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /eslint-visitor-keys@4.0.0: + resolution: + { integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + dev: true + + /eslint@8.57.0: + resolution: + { integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + 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.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@10.0.1: + resolution: + { integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + dev: true + + /espree@9.6.1: + resolution: + { integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: + { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } + engines: { node: '>=4' } + hasBin: true + + /esquery@1.5.0: + resolution: + { integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== } + engines: { node: '>=0.10' } + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: '>=4.0' } + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: + { integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== } + engines: { node: '>=4.0' } + dev: true + + /estraverse@5.3.0: + resolution: + { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } + engines: { node: '>=4.0' } + dev: true + + /esutils@2.0.3: + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: '>=0.10.0' } + dev: true + + /etag@1.8.1: + resolution: + { integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== } + engines: { node: '>= 0.6' } + dev: true + + /execa@5.1.1: + resolution: + { integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== } + engines: { node: '>=10' } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit-hook@2.2.1: + resolution: + { integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== } + engines: { node: '>=6' } + dev: true + + /exit@0.1.2: + resolution: + { integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== } + engines: { node: '>= 0.8.0' } + dev: true + + /expect@29.7.0: + resolution: + { integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /express@4.18.3: + resolution: + { integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw== } + engines: { node: '>= 0.10.0' } + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + + /fast-diff@1.3.0: + resolution: + { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } + dev: true + + /fast-glob@3.3.2: + resolution: + { integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== } + engines: { node: '>=8.6.0' } + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + dev: true + + /fast-levenshtein@2.0.6: + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } + dev: true + + /fastq@1.17.1: + resolution: + { integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== } + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: + { integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== } + dependencies: + bser: 2.1.1 + dev: true + + /file-entry-cache@6.0.1: + resolution: + { integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: + resolution: + { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } + engines: { node: '>=8' } + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: + { integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== } + engines: { node: '>= 0.8' } + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-up@4.1.0: + resolution: + { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== } + engines: { node: '>=8' } + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: '>=10' } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: + { integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: + { integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== } + dev: true + + /for-each@0.3.3: + resolution: + { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: + { integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== } + engines: { node: '>=14' } + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + dev: true + + /form-data@3.0.1: + resolution: + { integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== } + engines: { node: '>= 6' } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /format-util@1.0.5: + resolution: + { integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== } + dev: false + + /forwarded@0.2.0: + resolution: + { integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== } + engines: { node: '>= 0.6' } + dev: true + + /fresh@0.5.2: + resolution: + { integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== } + engines: { node: '>= 0.6' } + dev: true + + /fs.realpath@1.0.0: + resolution: + { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + dev: true + + /fsevents@2.3.3: + resolution: + { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: + { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } + dev: true + + /function.prototype.name@1.1.6: + resolution: + { integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: + { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } + dev: true + + /gensync@1.0.0-beta.2: + resolution: + { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } + engines: { node: '>=6.9.0' } + dev: true + + /get-caller-file@2.0.5: + resolution: + { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } + engines: { node: 6.* || 8.* || >= 10.* } + dev: true + + /get-intrinsic@1.2.4: + resolution: + { integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== } + engines: { node: '>= 0.4' } + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + dev: true + + /get-package-type@0.1.0: + resolution: + { integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== } + engines: { node: '>=8.0.0' } + dev: true + + /get-set-props@0.1.0: + resolution: + { integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q== } + engines: { node: '>=0.10.0' } + dev: true + + /get-stream@6.0.1: + resolution: + { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } + engines: { node: '>=10' } + dev: true + + /get-symbol-description@1.0.2: + resolution: + { integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /glob-parent@5.1.2: + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: '>= 6' } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: '>=10.13.0' } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: + { integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== } + dev: true + + /glob@10.3.10: + resolution: + { integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== } + engines: { node: '>=16 || 14 >=14.17' } + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + + /glob@7.2.3: + resolution: + { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: + { integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== } + engines: { node: '>=4' } + dev: true + + /globals@13.24.0: + resolution: + { integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== } + engines: { node: '>=8' } + dependencies: + type-fest: 0.20.2 + dev: true + + /globals@14.0.0: + resolution: + { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } + engines: { node: '>=18' } + dev: true + + /globalthis@1.0.3: + resolution: + { integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== } + engines: { node: '>= 0.4' } + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: + { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } + engines: { node: '>=10' } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: + { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== } + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + dev: true + + /graphemer@1.4.0: + resolution: + { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + dev: true + + /h3@1.11.1: + resolution: + { integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A== } + dependencies: + cookie-es: 1.1.0 + crossws: 0.2.4 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.1.0 + ohash: 1.1.3 + radix3: 1.1.2 + ufo: 1.5.3 + uncrypto: 0.1.3 + unenv: 1.9.0 + transitivePeerDependencies: + - uWebSockets.js + dev: false + + /has-bigints@1.0.2: + resolution: + { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } + dev: true + + /has-flag@3.0.0: + resolution: + { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } + engines: { node: '>=4' } + + /has-flag@4.0.0: + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: '>=8' } + + /has-property-descriptors@1.0.2: + resolution: + { integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== } + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: + { integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== } + engines: { node: '>= 0.4' } + dev: true + + /has-symbols@1.0.3: + resolution: + { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== } + engines: { node: '>= 0.4' } + dev: true + + /has-tostringtag@1.0.2: + resolution: + { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } + engines: { node: '>= 0.4' } + dependencies: + has-symbols: 1.0.3 + dev: true + + /hasown@2.0.1: + resolution: + { integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== } + engines: { node: '>= 0.4' } + dependencies: + function-bind: 1.1.2 + dev: true + + /hosted-git-info@2.8.9: + resolution: + { integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== } + dev: true + + /html-escaper@2.0.2: + resolution: + { integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== } + dev: true + + /htmlparser2@9.1.0: + resolution: + { integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-errors@2.0.0: + resolution: + { integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== } + engines: { node: '>= 0.8' } + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /human-signals@2.1.0: + resolution: + { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== } + engines: { node: '>=10.17.0' } + dev: true + + /iconv-lite@0.4.24: + resolution: + { integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== } + engines: { node: '>=0.10.0' } + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754@1.2.1: + resolution: + { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== } + dev: false + + /ignore@5.3.1: + resolution: + { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } + engines: { node: '>= 4' } + dev: true + + /import-fresh@3.3.0: + resolution: + { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } + engines: { node: '>=6' } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: + { integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== } + engines: { node: '>=8' } + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: '>=0.8.19' } + dev: true + + /indent-string@4.0.0: + resolution: + { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } + engines: { node: '>=8' } + dev: true + + /inflight@1.0.6: + resolution: + { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.3: + resolution: + { integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== } + dev: true + + /inherits@2.0.4: + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + + /internal-slot@1.0.7: + resolution: + { integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== } + engines: { node: '>= 0.4' } + dependencies: + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.6 + dev: true + + /ipaddr.js@1.9.1: + resolution: + { integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== } + engines: { node: '>= 0.10' } + dev: true + + /iron-webcrypto@1.1.0: + resolution: + { integrity: sha512-5vgYsCakNlaQub1orZK5QmNYhwYtcllTkZBp5sfIaCqY93Cf6l+v2rtE+E4TMbcfjxDMCdrO8wmp7+ZvhDECLA== } + dev: false + + /is-alphabetical@1.0.4: + resolution: + { integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== } + dev: true + + /is-alphanumerical@1.0.4: + resolution: + { integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== } + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-array-buffer@3.0.4: + resolution: + { integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.2.1: + resolution: + { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } + dev: true + + /is-bigint@1.0.4: + resolution: + { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object@1.1.2: + resolution: + { integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-builtin-module@3.2.1: + resolution: + { integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== } + engines: { node: '>=6' } + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: + { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } + engines: { node: '>= 0.4' } + dev: true + + /is-core-module@2.13.1: + resolution: + { integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== } + dependencies: + hasown: 2.0.1 + dev: true + + /is-date-object@1.0.5: + resolution: + { integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== } + engines: { node: '>= 0.4' } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-decimal@1.0.4: + resolution: + { integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== } + dev: true + + /is-extglob@2.1.1: + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: '>=0.10.0' } + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: '>=8' } + dev: true + + /is-generator-fn@2.1.0: + resolution: + { integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== } + engines: { node: '>=6' } + dev: true + + /is-get-set-prop@1.0.0: + resolution: + { integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ== } + dependencies: + get-set-props: 0.1.0 + lowercase-keys: 1.0.1 + dev: true + + /is-glob@4.0.3: + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: '>=0.10.0' } + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal@1.0.4: + resolution: + { integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== } + dev: true + + /is-interactive@1.0.0: + resolution: + { integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== } + engines: { node: '>=8' } + dev: false + + /is-js-type@2.0.0: + resolution: + { integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw== } + dependencies: + js-types: 1.0.0 + dev: true + + /is-negative-zero@2.0.3: + resolution: + { integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== } + engines: { node: '>= 0.4' } + dev: true + + /is-number-object@1.0.7: + resolution: + { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== } + engines: { node: '>= 0.4' } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: '>=0.12.0' } + dev: true + + /is-obj-prop@1.0.0: + resolution: + { integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w== } + dependencies: + lowercase-keys: 1.0.1 + obj-props: 1.4.0 + dev: true + + /is-path-inside@3.0.3: + resolution: + { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== } + engines: { node: '>=8' } + dev: true + + /is-proto-prop@2.0.0: + resolution: + { integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg== } + dependencies: + lowercase-keys: 1.0.1 + proto-props: 2.0.0 + dev: true + + /is-regex@1.1.4: + resolution: + { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: + { integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@2.0.1: + resolution: + { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } + engines: { node: '>=8' } + dev: true + + /is-string@1.0.7: + resolution: + { integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== } + engines: { node: '>= 0.4' } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: + { integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== } + engines: { node: '>= 0.4' } + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.13: + resolution: + { integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== } + engines: { node: '>= 0.4' } + dependencies: + which-typed-array: 1.1.14 + dev: true + + /is-unicode-supported@0.1.0: + resolution: + { integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== } + engines: { node: '>=10' } + dev: false + + /is-weakref@1.0.2: + resolution: + { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== } + dependencies: + call-bind: 1.0.7 + dev: true + + /isarray@2.0.5: + resolution: + { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } + dev: true + + /isexe@2.0.0: + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: + { integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== } + engines: { node: '>=8' } + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: + { integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== } + engines: { node: '>=8' } + dependencies: + '@babel/core': 7.24.0 + '@babel/parser': 7.24.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@6.0.2: + resolution: + { integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== } + engines: { node: '>=10' } + dependencies: + '@babel/core': 7.24.0 + '@babel/parser': 7.24.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: + { integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== } + engines: { node: '>=10' } + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: + { integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== } + engines: { node: '>=10' } + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: + { integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== } + engines: { node: '>=8' } + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak@2.3.6: + resolution: + { integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== } + engines: { node: '>=14' } + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jest-changed-files@29.7.0: + resolution: + { integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.7.0: + resolution: + { integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.0.4 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-cli@29.7.0(@types/node@20.11.20)(ts-node@10.9.2): + resolution: + { integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest-config@29.7.0(@types/node@20.11.20)(ts-node@10.9.2): + resolution: + { integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.24.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + babel-jest: 29.7.0(@babel/core@7.24.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@20.11.20)(typescript@5.3.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-diff@29.7.0: + resolution: + { integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@29.7.0: + resolution: + { integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.7.0: + resolution: + { integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /jest-environment-node@29.7.0: + resolution: + { integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: + { integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /jest-haste-map@29.7.0: + resolution: + { integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.11.20 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-leak-detector@29.7.0: + resolution: + { integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: + { integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@29.7.0: + resolution: + { integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/code-frame': 7.23.5 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.7.0: + resolution: + { integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + jest-util: 29.7.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: + { integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== } + engines: { node: '>=6' } + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-regex-util@29.6.3: + resolution: + { integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + /jest-resolve-dependencies@29.7.0: + resolution: + { integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.7.0: + resolution: + { integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.7.0: + resolution: + { integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.7.0: + resolution: + { integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.7.0: + resolution: + { integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@babel/core': 7.24.0 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) + '@babel/types': 7.24.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.7.0: + resolution: + { integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: + { integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watcher@29.7.0: + resolution: + { integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + + /jest-worker@29.7.0: + resolution: + { integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@types/node': 20.11.20 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.7.0(@types/node@20.11.20)(ts-node@10.9.2): + resolution: + { integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /js-tokens@4.0.0: + resolution: + { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + + /js-types@1.0.0: + resolution: + { integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw== } + engines: { node: '>=0.10.0' } + dev: true + + /js-yaml@3.14.1: + resolution: + { integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@0.5.0: + resolution: + { integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== } + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: + { integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== } + engines: { node: '>=4' } + hasBin: true + dev: true + + /jsesc@3.0.2: + resolution: + { integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== } + engines: { node: '>=6' } + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: + { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } + dev: true + + /json-schema-faker@0.5.6: + resolution: + { integrity: sha512-u/cFC26/GDxh2vPiAC8B8xVvpXAW+QYtG2mijEbKrimCk8IHtiwQBjCE8TwvowdhALWq9IcdIWZ+/8ocXvdL3Q== } + hasBin: true + dependencies: + json-schema-ref-parser: 6.1.0 + jsonpath-plus: 7.2.0 + dev: false + + /json-schema-ref-parser@6.1.0: + resolution: + { integrity: sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw== } + deprecated: Please switch to @apidevtools/json-schema-ref-parser + dependencies: + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + ono: 4.0.11 + dev: false + + /json-schema-to-ts@1.6.4: + resolution: + { integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA== } + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + dev: true + + /json-schema-to-ts@3.0.0: + resolution: + { integrity: sha512-2adDesYifYEXYxNySx3gG0RR69rDWIjqAFzK/JPXdOvjHLZ/UP6d2rkpy6a+AxyhtRp2SvFPZ4+EW36jBinUbA== } + engines: { node: '>=16' } + dependencies: + '@babel/runtime': 7.24.0 + '@types/json-schema': 7.0.15 + ts-algebra: 1.2.2 + dev: false + + /json-schema-traverse@0.4.1: + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + dev: true + + /json-schema-traverse@1.0.0: + resolution: + { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + dev: true + + /json5@1.0.2: + resolution: + { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: + { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } + engines: { node: '>=6' } + hasBin: true + dev: true + + /jsonc-parser@3.2.1: + resolution: + { integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== } + dev: true + + /jsonpath-plus@7.2.0: + resolution: + { integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA== } + engines: { node: '>=12.0.0' } + dev: false + + /jsonpointer@5.0.1: + resolution: + { integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== } + engines: { node: '>=0.10.0' } + dev: false + + /keyv@4.5.4: + resolution: + { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } + dependencies: + json-buffer: 3.0.1 + dev: true + + /kleur@3.0.3: + resolution: + { integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } + engines: { node: '>=6' } + dev: true + + /leven@3.1.0: + resolution: + { integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== } + engines: { node: '>=6' } + + /levn@0.4.1: + resolution: + { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } + engines: { node: '>= 0.8.0' } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: + { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + dev: true + + /locate-path@5.0.0: + resolution: + { integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== } + engines: { node: '>=8' } + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: '>=10' } + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.last@3.0.0: + resolution: + { integrity: sha512-14mq7rSkCxG4XMy9lF2FbIOqqgF0aH0NfPuQ3LPR3vIh0kHnUvIYP70dqa1Hf47zyXfQ8FzAg0MYOQeSuE1R7A== } + dev: true + + /lodash.memoize@4.1.2: + resolution: + { integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== } + dev: true + + /lodash.merge@4.6.2: + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } + dev: true + + /lodash.zipobject@4.1.3: + resolution: + { integrity: sha512-A9SzX4hMKWS25MyalwcOnNoplyHbkNVsjidhTp8ru0Sj23wY9GWBKS8gAIGDSAqeWjIjvE4KBEl24XXAs+v4wQ== } + dev: true + + /lodash@4.17.21: + resolution: + { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + dev: true + + /log-symbols@4.1.0: + resolution: + { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== } + engines: { node: '>=10' } + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /loose-envify@1.4.0: + resolution: + { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /lowercase-keys@1.0.1: + resolution: + { integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== } + engines: { node: '>=0.10.0' } + dev: true + + /lru-cache@10.2.0: + resolution: + { integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== } + engines: { node: 14 || >=16.14 } + dev: true + + /lru-cache@5.1.1: + resolution: + { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: + { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } + engines: { node: '>=10' } + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@4.0.0: + resolution: + { integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== } + engines: { node: '>=10' } + dependencies: + semver: 7.6.0 + dev: true + + /make-error@1.3.6: + resolution: + { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } + dev: true + + /makeerror@1.0.12: + resolution: + { integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== } + dependencies: + tmpl: 1.0.5 + dev: true + + /mdast-util-from-markdown@0.8.5: + resolution: + { integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== } + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-string@2.0.0: + resolution: + { integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== } + dev: true + + /media-typer@0.3.0: + resolution: + { integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== } + engines: { node: '>= 0.6' } + dev: true + + /merge-descriptors@1.0.1: + resolution: + { integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== } + dev: true + + /merge-stream@2.0.0: + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } + dev: true + + /merge2@1.4.1: + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: '>= 8' } + dev: true + + /methods@1.1.2: + resolution: + { integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== } + engines: { node: '>= 0.6' } + dev: true + + /micromark@2.11.4: + resolution: + { integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== } + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: + { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== } + engines: { node: '>=8.6' } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: + { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: '>= 0.6' } + dev: true + + /mime-types@2.1.35: + resolution: + { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: '>= 0.6' } + dependencies: + mime-db: 1.52.0 + dev: true + + /mime@1.6.0: + resolution: + { integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== } + engines: { node: '>=4' } + hasBin: true + dev: true + + /mime@3.0.0: + resolution: + { integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== } + engines: { node: '>=10.0.0' } + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: + { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } + engines: { node: '>=6' } + + /min-indent@1.0.1: + resolution: + { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } + engines: { node: '>=4' } + dev: true + + /minimatch@3.1.2: + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.3: + resolution: + { integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: + { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + dev: true + + /minipass@7.0.4: + resolution: + { integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== } + engines: { node: '>=16 || 14 >=14.17' } + dev: true + + /mkdir@0.0.2: + resolution: + { integrity: sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg== } + engines: { node: '>=0.4.0' } + dev: true + + /mkdirp@1.0.4: + resolution: + { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } + engines: { node: '>=10' } + hasBin: true + dev: true + + /mkdirp@3.0.1: + resolution: + { integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== } + engines: { node: '>=10' } + hasBin: true + dev: true + + /mri@1.2.0: + resolution: + { integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== } + engines: { node: '>=4' } + dev: true + + /ms@2.0.0: + resolution: + { integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== } + dev: true + + /ms@2.1.2: + resolution: + { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + dev: true + + /ms@2.1.3: + resolution: + { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + dev: true + + /nanoid@3.3.7: + resolution: + { integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + dev: true + + /negotiator@0.6.3: + resolution: + { integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== } + engines: { node: '>= 0.6' } + dev: true + + /next@13.5.6(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0): + resolution: + { integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw== } + engines: { node: '>=16.14.0' } + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.5.6 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001591 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.0)(react@18.2.0) + watchpack: 2.4.0 + optionalDependencies: + '@next/swc-darwin-arm64': 13.5.6 + '@next/swc-darwin-x64': 13.5.6 + '@next/swc-linux-arm64-gnu': 13.5.6 + '@next/swc-linux-arm64-musl': 13.5.6 + '@next/swc-linux-x64-gnu': 13.5.6 + '@next/swc-linux-x64-musl': 13.5.6 + '@next/swc-win32-arm64-msvc': 13.5.6 + '@next/swc-win32-ia32-msvc': 13.5.6 + '@next/swc-win32-x64-msvc': 13.5.6 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: true + + /node-fetch-native@1.6.4: + resolution: + { integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== } + dev: false + + /node-fetch@2.6.9: + resolution: + { integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch@2.7.0: + resolution: + { integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-int64@0.4.0: + resolution: + { integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== } + dev: true + + /node-releases@2.0.14: + resolution: + { integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== } + dev: true + + /normalize-package-data@2.5.0: + resolution: + { integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== } + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: + { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: '>=0.10.0' } + dev: true + + /npm-run-path@4.0.1: + resolution: + { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== } + engines: { node: '>=8' } + dependencies: + path-key: 3.1.1 + dev: true + + /obj-props@1.4.0: + resolution: + { integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ== } + engines: { node: '>=0.10.0' } + dev: true + + /object-inspect@1.13.1: + resolution: + { integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== } + dev: true + + /object-keys@1.1.1: + resolution: + { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } + engines: { node: '>= 0.4' } + dev: true + + /object.assign@4.1.5: + resolution: + { integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.7: + resolution: + { integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /object.fromentries@2.0.7: + resolution: + { integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /object.groupby@1.0.2: + resolution: + { integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== } + dependencies: + array.prototype.filter: 1.0.3 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-errors: 1.3.0 + dev: true + + /object.values@1.1.7: + resolution: + { integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /ohash@1.1.3: + resolution: + { integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== } + dev: false + + /on-finished@2.4.1: + resolution: + { integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== } + engines: { node: '>= 0.8' } + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: + { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } + engines: { node: '>=6' } + dependencies: + mimic-fn: 2.1.0 + + /ono@4.0.11: + resolution: + { integrity: sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== } + dependencies: + format-util: 1.0.5 + dev: false + + /optionator@0.9.3: + resolution: + { integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== } + engines: { node: '>= 0.8.0' } + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: + { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== } + engines: { node: '>=10' } + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /p-limit@2.3.0: + resolution: + { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== } + engines: { node: '>=6' } + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: '>=10' } + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: + { integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== } + engines: { node: '>=8' } + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: + { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } + engines: { node: '>=10' } + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: + { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } + engines: { node: '>=6' } + dev: true + + /parent-module@1.0.1: + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: '>=6' } + dependencies: + callsites: 3.1.0 + dev: true + + /parse-entities@2.0.0: + resolution: + { integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== } + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-json@5.2.0: + resolution: + { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } + engines: { node: '>=8' } + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-ms@2.1.0: + resolution: + { integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== } + engines: { node: '>=6' } + dev: true + + /parseurl@1.3.3: + resolution: + { integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== } + engines: { node: '>= 0.8' } + dev: true + + /path-browserify@1.0.1: + resolution: + { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== } + dev: true + + /path-exists@4.0.0: + resolution: + { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: '>=8' } + dev: true + + /path-is-absolute@1.0.1: + resolution: + { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } + engines: { node: '>=0.10.0' } + dev: true + + /path-key@3.1.1: + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: '>=8' } + dev: true + + /path-parse@1.0.7: + resolution: + { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } + dev: true + + /path-scurry@1.10.1: + resolution: + { integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== } + engines: { node: '>=16 || 14 >=14.17' } + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: true + + /path-to-regexp@0.1.7: + resolution: + { integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== } + dev: true + + /path-to-regexp@6.2.1: + resolution: + { integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== } + dev: true + + /path-type@4.0.0: + resolution: + { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: '>=8' } + dev: true + + /path@0.12.7: + resolution: + { integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== } + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: true + + /pathe@1.1.2: + resolution: + { integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== } + dev: false + + /picocolors@1.0.0: + resolution: + { integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== } + dev: true + + /picomatch@2.3.1: + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: '>=8.6' } + dev: true + + /pirates@4.0.6: + resolution: + { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } + engines: { node: '>= 6' } + dev: true + + /pkg-dir@4.2.0: + resolution: + { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } + engines: { node: '>=8' } + dependencies: + find-up: 4.1.0 + dev: true + + /pluralize@8.0.0: + resolution: + { integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== } + engines: { node: '>=4' } + dev: true + + /possible-typed-array-names@1.0.0: + resolution: + { integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== } + engines: { node: '>= 0.4' } + dev: true + + /postcss@8.4.31: + resolution: + { integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls@1.2.1: + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: '>= 0.8.0' } + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: + { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } + engines: { node: '>=6.0.0' } + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.2.5: + resolution: + { integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== } + engines: { node: '>=14' } + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: + { integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== } + engines: { node: '>=6' } + dev: true + + /pretty-format@29.7.0: + resolution: + { integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-ms@7.0.1: + resolution: + { integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== } + engines: { node: '>=10' } + dependencies: + parse-ms: 2.1.0 + dev: true + + /process@0.11.10: + resolution: + { integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== } + engines: { node: '>= 0.6.0' } + dev: true + + /prompts@2.4.2: + resolution: + { integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } + engines: { node: '>= 6' } + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proto-props@2.0.0: + resolution: + { integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ== } + engines: { node: '>=4' } + dev: true + + /proxy-addr@2.0.7: + resolution: + { integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== } + engines: { node: '>= 0.10' } + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /punycode@1.4.1: + resolution: + { integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== } + dev: true + + /punycode@2.3.1: + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: '>=6' } + + /pure-rand@6.0.4: + resolution: + { integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== } + dev: true + + /qs@6.11.0: + resolution: + { integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== } + engines: { node: '>=0.6' } + dependencies: + side-channel: 1.0.6 + dev: true + + /qs@6.11.2: + resolution: + { integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== } + engines: { node: '>=0.6' } + dependencies: + side-channel: 1.0.6 + dev: true + + /queue-microtask@1.2.3: + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + dev: true + + /radix3@1.1.2: + resolution: + { integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== } + dev: false + + /ramda@0.29.1: + resolution: + { integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA== } + dev: true + + /range-parser@1.2.1: + resolution: + { integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== } + engines: { node: '>= 0.6' } + dev: true + + /raw-body@2.5.2: + resolution: + { integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== } + engines: { node: '>= 0.8' } + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: + { integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== } + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: true + + /react-is@18.2.0: + resolution: + { integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== } + dev: true + + /react@18.2.0: + resolution: + { integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== } + engines: { node: '>=0.10.0' } + dependencies: + loose-envify: 1.4.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: + { integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== } + engines: { node: '>=8' } + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: + { integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== } + engines: { node: '>=8' } + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@3.6.2: + resolution: + { integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== } + engines: { node: '>= 6' } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /regenerator-runtime@0.14.1: + resolution: + { integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== } + dev: false + + /regexp-tree@0.1.27: + resolution: + { integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== } + hasBin: true + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: + { integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /regjsparser@0.10.0: + resolution: + { integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA== } + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /require-directory@2.1.1: + resolution: + { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } + engines: { node: '>=0.10.0' } + dev: true + + /require-from-string@2.0.2: + resolution: + { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } + engines: { node: '>=0.10.0' } + + /requireindex@1.1.0: + resolution: + { integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg== } + engines: { node: '>=0.10.5' } + dev: true + + /requireindex@1.2.0: + resolution: + { integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== } + engines: { node: '>=0.10.5' } + dev: true + + /resolve-cwd@3.0.0: + resolution: + { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } + engines: { node: '>=8' } + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: '>=4' } + dev: true + + /resolve-from@5.0.0: + resolution: + { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } + engines: { node: '>=8' } + dev: true + + /resolve.exports@2.0.2: + resolution: + { integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== } + engines: { node: '>=10' } + dev: true + + /resolve@1.22.8: + resolution: + { integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== } + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: + { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== } + engines: { node: '>=8' } + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: + { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + dev: true + + /rimraf@3.0.2: + resolution: + { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@5.0.5: + resolution: + { integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== } + engines: { node: '>=14' } + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + + /run-parallel@1.2.0: + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.1.0: + resolution: + { integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== } + engines: { node: '>=0.4' } + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: + { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== } + + /safe-regex-test@1.0.3: + resolution: + { integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safe-regex@2.1.1: + resolution: + { integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== } + dependencies: + regexp-tree: 0.1.27 + dev: true + + /safer-buffer@2.1.2: + resolution: + { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } + dev: true + + /scheduler@0.23.0: + resolution: + { integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== } + dependencies: + loose-envify: 1.4.0 + dev: true + + /semver@5.7.2: + resolution: + { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } + hasBin: true + dev: true + + /semver@6.3.1: + resolution: + { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + hasBin: true + dev: true + + /semver@7.6.0: + resolution: + { integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== } + engines: { node: '>=10' } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send@0.18.0: + resolution: + { integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== } + engines: { node: '>= 0.8.0' } + 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 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0: + resolution: + { integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== } + engines: { node: '>= 0.8.0' } + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-function-length@1.2.1: + resolution: + { integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== } + engines: { node: '>= 0.4' } + 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 + dev: true + + /set-function-name@2.0.2: + resolution: + { integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== } + engines: { node: '>= 0.4' } + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.2.0: + resolution: + { integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== } + dev: true + + /shebang-command@2.0.0: + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: '>=8' } + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: '>=8' } + dev: true + + /side-channel@1.0.6: + resolution: + { integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: + { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } + + /signal-exit@4.0.2: + resolution: + { integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== } + engines: { node: '>=14' } + dev: true + + /sisteransi@1.0.5: + resolution: + { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } + dev: true + + /slash@3.0.0: + resolution: + { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: '>=8' } + dev: true + + /source-map-js@1.0.2: + resolution: + { integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== } + engines: { node: '>=0.10.0' } + dev: true + + /source-map-support@0.5.13: + resolution: + { integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } + engines: { node: '>=0.10.0' } + dev: true + + /spdx-correct@3.2.0: + resolution: + { integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== } + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-exceptions@2.5.0: + resolution: + { integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== } + dev: true + + /spdx-expression-parse@3.0.1: + resolution: + { integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== } + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-license-ids@3.0.17: + resolution: + { integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== } + dev: true + + /sprintf-js@1.0.3: + resolution: + { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } + + /stack-utils@2.0.6: + resolution: + { integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== } + engines: { node: '>=10' } + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /statuses@2.0.1: + resolution: + { integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== } + engines: { node: '>= 0.8' } + dev: true + + /streamsearch@1.1.0: + resolution: + { integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== } + engines: { node: '>=10.0.0' } + dev: true + + /string-length@4.0.2: + resolution: + { integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== } + engines: { node: '>=10' } + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@4.2.3: + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: '>=8' } + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: + { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: '>=12' } + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.trim@1.2.8: + resolution: + { integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: + { integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: + { integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + dev: true + + /string_decoder@1.3.0: + resolution: + { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: '>=8' } + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: + { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } + engines: { node: '>=12' } + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: + { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } + engines: { node: '>=4' } + dev: true + + /strip-bom@4.0.0: + resolution: + { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== } + engines: { node: '>=8' } + dev: true + + /strip-final-newline@2.0.0: + resolution: + { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== } + engines: { node: '>=6' } + dev: true + + /strip-indent@3.0.0: + resolution: + { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== } + engines: { node: '>=8' } + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: '>=8' } + dev: true + + /styled-jsx@5.1.1(@babel/core@7.24.0)(react@18.2.0): + resolution: + { integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== } + engines: { node: '>= 12.0.0' } + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.24.0 + client-only: 0.0.1 + react: 18.2.0 + dev: true + + /supports-color@5.5.0: + resolution: + { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } + engines: { node: '>=4' } + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: '>=8' } + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: + { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } + engines: { node: '>=10' } + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } + engines: { node: '>= 0.4' } + dev: true + + /synckit@0.8.8: + resolution: + { integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== } + engines: { node: ^14.18.0 || >=16.0.0 } + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + dev: true + + /test-exclude@6.0.0: + resolution: + { integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== } + engines: { node: '>=8' } + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: + { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } + dev: true + + /time-span@4.0.0: + resolution: + { integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g== } + engines: { node: '>=10' } + dependencies: + convert-hrtime: 3.0.0 + dev: true + + /tmpl@1.0.5: + resolution: + { integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== } + dev: true + + /to-fast-properties@2.0.0: + resolution: + { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== } + engines: { node: '>=4' } + dev: true + + /to-regex-range@5.0.1: + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: '>=8.0' } + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: + { integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== } + engines: { node: '>=0.6' } + dev: true + + /tr46@0.0.3: + resolution: + { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } + + /ts-algebra@1.2.2: + resolution: + { integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA== } + dev: false + + /ts-api-utils@1.2.1(typescript@5.3.3): + resolution: + { integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA== } + engines: { node: '>=16' } + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + + /ts-jest@29.1.2(@babel/core@7.24.0)(jest@29.7.0)(typescript@5.3.3): + resolution: + { integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== } + engines: { node: ^16.10.0 || ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.24.0 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.11.20)(ts-node@10.9.2) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.0 + typescript: 5.3.3 + yargs-parser: 21.1.1 + dev: true + + /ts-morph@12.0.0: + resolution: + { integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA== } + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + dev: true + + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + resolution: + { integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.18.33 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.2(@types/node@20.11.20)(typescript@5.3.3): + resolution: + { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.11.20 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-toolbelt@6.15.5: + resolution: + { integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A== } + dev: true + + /tsconfig-paths@3.15.0: + resolution: + { integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== } + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: + { integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== } + dev: true + + /tslib@2.6.2: + resolution: + { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } + dev: true + + /tsutils@3.21.0(typescript@5.3.3): + resolution: + { integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== } + 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' + dependencies: + tslib: 1.14.1 + typescript: 5.3.3 + dev: true + + /type-check@0.4.0: + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: '>= 0.8.0' } + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: + { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } + engines: { node: '>=4' } + dev: true + + /type-fest@0.20.2: + resolution: + { integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== } + engines: { node: '>=10' } + dev: true + + /type-fest@0.21.3: + resolution: + { integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== } + engines: { node: '>=10' } + dev: true + + /type-fest@0.6.0: + resolution: + { integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== } + engines: { node: '>=8' } + dev: true + + /type-fest@0.8.1: + resolution: + { integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== } + engines: { node: '>=8' } + dev: true + + /type-is@1.6.18: + resolution: + { integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== } + engines: { node: '>= 0.6' } + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-array-buffer@1.0.2: + resolution: + { integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: + { integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: + { integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== } + engines: { node: '>= 0.4' } + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.5: + resolution: + { integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== } + engines: { node: '>= 0.4' } + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /typescript@4.9.5: + resolution: + { integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== } + engines: { node: '>=4.2.0' } + hasBin: true + dev: true + + /typescript@5.3.3: + resolution: + { integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== } + engines: { node: '>=14.17' } + hasBin: true + dev: true + + /ufo@1.5.3: + resolution: + { integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== } + dev: false + + /unbox-primitive@1.0.2: + resolution: + { integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== } + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /uncrypto@0.1.3: + resolution: + { integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== } + dev: false + + /undici-types@5.26.5: + resolution: + { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } + dev: true + + /unenv@1.9.0: + resolution: + { integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g== } + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + dev: false + + /unist-util-stringify-position@2.0.3: + resolution: + { integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== } + dependencies: + '@types/unist': 2.0.10 + dev: true + + /unpipe@1.0.0: + resolution: + { integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== } + engines: { node: '>= 0.8' } + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: + { integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + dependencies: + punycode: 2.3.1 + + /url@0.11.3: + resolution: + { integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== } + dependencies: + punycode: 1.4.1 + qs: 6.11.2 + dev: true + + /util-deprecate@1.0.2: + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + dev: false + + /util@0.10.4: + resolution: + { integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== } + dependencies: + inherits: 2.0.3 + dev: true + + /utils-merge@1.0.1: + resolution: + { integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== } + engines: { node: '>= 0.4.0' } + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: + { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } + dev: true + + /v8-to-istanbul@9.2.0: + resolution: + { integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== } + engines: { node: '>=10.12.0' } + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: + { integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== } + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary@1.1.2: + resolution: + { integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== } + engines: { node: '>= 0.8' } + dev: true + + /vscode-json-languageservice@4.2.1: + resolution: + { integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA== } + dependencies: + jsonc-parser: 3.2.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: + { integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== } + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: + { integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== } + dev: true + + /vscode-nls@5.2.0: + resolution: + { integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== } + dev: true + + /vscode-uri@3.0.8: + resolution: + { integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== } + dev: true + + /walker@1.0.8: + resolution: + { integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== } + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: + { integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== } + engines: { node: '>=10.13.0' } + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: + { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } + dependencies: + defaults: 1.0.4 + dev: false + + /webidl-conversions@3.0.1: + resolution: + { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } + + /whatwg-url@5.0.0: + resolution: + { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-boxed-primitive@1.0.2: + resolution: + { integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== } + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array@1.1.14: + resolution: + { integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== } + engines: { node: '>= 0.4' } + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: '>= 8' } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@7.0.0: + resolution: + { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: '>=10' } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: + { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: '>=12' } + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + dev: true + + /write-file-atomic@4.0.2: + resolution: + { integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /y18n@5.0.8: + resolution: + { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } + engines: { node: '>=10' } + dev: true + + /yallist@3.1.1: + resolution: + { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } + dev: true + + /yallist@4.0.0: + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + dev: true + + /yargs-parser@21.1.1: + resolution: + { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } + engines: { node: '>=12' } + dev: true + + /yargs@17.7.2: + resolution: + { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } + engines: { node: '>=12' } + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn@3.1.1: + resolution: + { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== } + engines: { node: '>=6' } + dev: true + + /yocto-queue@0.1.0: + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: '>=10' } + dev: true diff --git a/packages/sdk/src/client.test.ts b/packages/sdk/src/client.test.ts new file mode 100644 index 00000000000..269048a4dcc --- /dev/null +++ b/packages/sdk/src/client.test.ts @@ -0,0 +1,149 @@ +import { expect } from '@jest/globals'; + +import { Echo } from './client'; + +describe('Client', () => { + let echo: Echo; + + beforeEach(() => { + echo = new Echo(); + + echo.workflow('in-app-test-something-1', async ({ step }) => { + await step.email('send-email', async () => ({ + body: 'Test Body', + subject: 'Subject', + })); + }); + }); + + test('should discover 1 workflow', () => { + const discovery = echo.discover(); + expect(discovery.workflows).toHaveLength(1); + }); + + describe('Type tests', () => { + it('should not compile when the channel output is incorrect', async () => { + echo.workflow('email-test', async ({ step }) => { + // @ts-expect-error - email subject is missing from the output + await step.email('send-email', async () => ({ + body: 'Test Body', + })); + }); + }); + + it('should not compile when the custom output is incorrect', async () => { + echo.workflow('custom-test', async ({ step }) => { + await step.custom( + 'custom', + // @ts-expect-error - foo is a number + async () => ({ + foo: 'bar', + bar: 'baz', + }), + { + outputSchema: { + type: 'object', + properties: { + foo: { type: 'number' }, + bar: { type: 'string' }, + }, + required: ['foo', 'bar'], + additionalProperties: false, + } as const, + } + ); + }); + }); + + it('should not compile when the custom result is compared incorrectly', async () => { + echo.workflow('custom-test-something', async ({ step }) => { + const result = await step.custom( + 'custom', + async () => ({ + foo: 1, + bar: 'baz', + }), + { + outputSchema: { + type: 'object', + properties: { + foo: { type: 'number' }, + bar: { type: 'string' }, + }, + required: ['foo', 'bar'], + additionalProperties: false, + } as const, + } + ); + + // @ts-expect-error - result is a string + result?.foo === 'custom'; + }); + }); + }); + + test('should discover a complex workflow with all supported step types', () => { + echo.workflow('complex-workflow', async ({ step }) => { + await step.email('send-email', async () => ({ + body: 'Test Body', + subject: 'Subject', + })); + + const inAppRes = await step.inApp('send-in-app', async () => ({ + body: 'Test Body', + subject: 'Subject', + })); + + await step.chat('send-chat', async () => ({ + body: 'Test Body', + })); + + await step.push('send-push', async () => ({ + body: 'Test Body', + subject: 'Title', + })); + + await step.custom( + 'send-custom', + async (input) => ({ + fooBoolean: inAppRes.read, + fooString: input.someString, + }), + { + inputSchema: { + type: 'object', + properties: { + someString: { type: 'string' }, + }, + required: ['someString'], + additionalProperties: false, + } as const, + outputSchema: { + type: 'object', + properties: { + fooBoolean: { type: 'boolean' }, + fooString: { type: 'string' }, + }, + required: ['fooBoolean', 'fooString'], + additionalProperties: false, + } as const, + } + ); + + await step.sms('send-sms', async () => ({ + body: 'Test Body', + to: '+1234567890', + })); + + await step.digest('digest', async () => ({ + amount: 1, + unit: 'hours', + })); + + await step.delay('delay', async () => ({ + amount: 1, + unit: 'hours', + })); + }); + }); +}); diff --git a/packages/sdk/src/client.ts b/packages/sdk/src/client.ts new file mode 100644 index 00000000000..82b42694567 --- /dev/null +++ b/packages/sdk/src/client.ts @@ -0,0 +1,879 @@ +import Ajv, { ValidateFunction } from 'ajv'; +import addFormats from 'ajv-formats'; +import betterAjvErrors from 'better-ajv-errors'; +import { JSONSchema7 } from 'json-schema'; +import { JSONSchemaFaker } from 'json-schema-faker'; +import { FromSchema } from 'json-schema-to-ts'; +import ora from 'ora'; + +import { + ChannelStepEnum, + DEFAULT_NOVU_API_BASE_URL, + HttpHeaderKeysEnum, + HttpMethodEnum, + NovuApiEndpointsEnum, +} from './constants'; +import { + ExecutionEventDataInvalidError, + ExecutionEventInputInvalidError, + ExecutionProviderOutputInvalidError, + ExecutionStateCorruptError, + ExecutionStateInputInvalidError, + ExecutionStateOutputInvalidError, + ExecutionStateResultInvalidError, + ProviderExecutionFailedError, + ProviderNotFoundError, + StepAlreadyExistsError, + StepNotFoundError, + WorkflowAlreadyExistsError, + WorkflowNotFoundError, +} from './errors'; +import { + channelStepSchemas, + delayOutputSchema, + delayResultSchema, + digestOutputSchema, + digestResultSchema, + emptySchema, + providerSchemas, +} from './schemas'; +import { + ActionStep, + ClientConfig, + CodeResult, + CustomStep, + DiscoverOutput, + DiscoverProviderOutput, + DiscoverStepOutput, + DiscoverWorkflowOutput, + Execute, + ExecuteOutput, + HealthCheck, + IEvent, + StepType, + Validate, + WorkflowOptions, +} from './types'; +import { Schema } from './types/schema.types'; +import { EMOJI, log } from './utils'; +import { VERSION } from './version'; + +JSONSchemaFaker.option({ + useDefaultValue: true, + alwaysFakeOptionals: true, +}); + +export class Echo { + private discoveredWorkflows: Array = []; + + private ajv: Ajv; + + private backendUrl?: string; + + public apiKey?: string; + + public version: string = VERSION; + + public devModeBypassAuthentication: boolean; + + public static NOVU_SIGNATURE_HEADER = HttpHeaderKeysEnum.SIGNATURE; + + constructor(config?: ClientConfig) { + this.apiKey = config?.apiKey; + this.backendUrl = config?.backendUrl ?? DEFAULT_NOVU_API_BASE_URL; + this.devModeBypassAuthentication = config?.devModeBypassAuthentication || false; + + const ajv = new Ajv({ useDefaults: true }); + addFormats(ajv); + this.ajv = ajv; + } + + public healthCheck(): HealthCheck { + const workflowCount = this.discoveredWorkflows.length; + const stepCount = this.discoveredWorkflows.reduce((acc, workflow) => acc + workflow.steps.length, 0); + + return { + status: 'ok', + version: VERSION, + discovered: { + workflows: workflowCount, + steps: stepCount, + }, + }; + } + + /** + * Define a new notification workflow. + */ + public async workflow< + T_PayloadSchema extends Schema, + T_InputSchema extends Schema, + T_Payload = FromSchema, + T_Input = FromSchema + >( + workflowId: string, + execute: Execute, + workflowOptions?: WorkflowOptions + ): Promise { + // TODO: Transparently register the trigger step here + this.discoverWorkflow(workflowId, execute, workflowOptions); + + await execute({ + payload: {} as T_Payload, + subscriber: {}, + environment: {}, + input: {} as T_Input, + step: { + ...Object.entries(channelStepSchemas).reduce((acc, [channel, schemas]) => { + acc[channel] = this.discoverStepFactory( + workflowId, + channel as ChannelStepEnum, + schemas.output, + schemas.result + ); + + return acc; + }, {} as Record>), + /* + * Temporary workaround for inApp, which has snake_case step type + * TODO: decouple step types from the channel step types + */ + inApp: this.discoverStepFactory( + workflowId, + 'in_app', + channelStepSchemas.in_app.output, + channelStepSchemas.in_app.result + ), + digest: this.discoverStepFactory(workflowId, 'digest', digestOutputSchema, digestResultSchema), + delay: this.discoverStepFactory(workflowId, 'delay', delayOutputSchema, delayResultSchema), + /* + * custom: this.discoverStepFactory( + * workflowId, + * 'custom', + * customOutputResultSchema, + * customOutputResultSchema, + * ), + */ + + /* + * async custom(outputSchema: Schema) { + * this.discoverStepFactory( + * workflowId, + * 'custom', + * outputSchema, + * outputSchema, + * ); + * return undefined as any; + * }, + */ + + custom: this.discoverCustomStepFactory(workflowId, 'custom'), + }, + }); + + this.prettyPrintDiscovery(workflowId); + } + + private prettyPrintDiscovery(workflowId: string): void { + const workflow = this.getWorkflow(workflowId); + + // eslint-disable-next-line no-console + console.log(`\n${log.bold(log.underline('Discovered workflowId:'))} '${workflowId}'`); + workflow.steps.forEach((step, i) => { + const prefix = i === workflow.steps.length - 1 ? '└' : '├'; + // eslint-disable-next-line no-console + console.log(`${prefix} ${EMOJI.STEP} Discovered stepId: '${step.stepId}'\tType: '${step.type}'`); + step.providers.forEach((provider, providerIndex) => { + const providerPrefix = providerIndex === step.providers.length - 1 ? '└' : '├'; + // eslint-disable-next-line no-console + console.log(` ${providerPrefix} ${EMOJI.PROVIDER} Discovered provider: '${provider.type}'`); + }); + }); + } + + private discoverStepFactory( + workflowId: string, + type: StepType, + outputSchema: Schema, + resultSchema: Schema + ): ActionStep { + return async (stepId, resolve, options = {}) => { + const inputSchema = options?.inputSchema || emptySchema; + + this.discoverStep(workflowId, stepId, { + stepId, + type, + inputs: { + schema: inputSchema, + validate: this.ajv.compile(inputSchema), + }, + outputs: { + schema: outputSchema, + validate: this.ajv.compile(outputSchema), + }, + results: { + schema: resultSchema, + validate: this.ajv.compile(resultSchema), + }, + resolve, + code: resolve.toString(), + options, + providers: [], + }); + + if (Object.keys(options.providers || {}).length > 0) { + this.discoverProviders(workflowId, stepId, type, options.providers || {}); + } + + return undefined as any; + }; + } + + private discoverCustomStepFactory(workflowId: string, type: StepType): CustomStep { + return async (stepId, resolve, options = {}) => { + const inputSchema = options?.inputSchema || emptySchema; + const outputSchema = options?.outputSchema || emptySchema; + + this.discoverStep(workflowId, stepId, { + stepId, + type, + inputs: { + schema: inputSchema, + validate: this.ajv.compile(inputSchema), + }, + outputs: { + schema: outputSchema, + validate: this.ajv.compile(outputSchema), + }, + results: { + schema: outputSchema, + validate: this.ajv.compile(outputSchema), + }, + resolve, + code: resolve.toString(), + options, + providers: [], + }); + + return undefined as any; + }; + } + + private discoverProviders( + workflowId: string, + stepId: string, + channelType: string, + providers: Record unknown | Promise> + ): void { + const step = this.getStep(workflowId, stepId); + const channelSchemas = providerSchemas[channelType]; + + Object.entries(providers).forEach(([type, resolve]) => { + const schemas = channelSchemas[type]; + step.providers.push({ + type, + code: resolve.toString(), + resolve, + outputs: { + schema: schemas.output, + validate: this.ajv.compile(schemas.output), + }, + }); + }); + } + + private discoverWorkflow( + workflowId: string, + execute: Execute, + options: WorkflowOptions = {} + ): void { + if (this.discoveredWorkflows.some((workflow) => workflow.workflowId === workflowId)) { + throw new WorkflowAlreadyExistsError(workflowId); + } else { + this.discoveredWorkflows.push({ + workflowId, + options, + steps: [], + code: execute.toString(), + data: { + schema: options.payloadSchema || emptySchema, + validate: this.ajv.compile(options.payloadSchema || emptySchema), + }, + inputs: { + schema: options.inputSchema || emptySchema, + validate: this.ajv.compile(options.inputSchema || emptySchema), + }, + execute, + }); + } + } + + private discoverStep(workflowId: string, stepId: string, step: DiscoverStepOutput): void { + if (this.getWorkflow(workflowId).steps.some((workflowStep) => workflowStep.stepId === stepId)) { + throw new StepAlreadyExistsError(stepId); + } else { + const workflow = this.getWorkflow(workflowId); + workflow.steps.push(step); + } + } + + private getWorkflow(workflowId: string): DiscoverWorkflowOutput { + const foundWorkflow = this.discoveredWorkflows.find((workflow) => workflow.workflowId === workflowId); + + if (foundWorkflow) { + return foundWorkflow; + } else { + throw new WorkflowNotFoundError(workflowId); + } + } + + private getStep(workflowId: string, stepId: string): DiscoverStepOutput { + const workflow = this.getWorkflow(workflowId); + + const foundStep = workflow.steps.find((step) => step.stepId === stepId); + + if (foundStep) { + return foundStep; + } else { + throw new StepNotFoundError(stepId); + } + } + + private getRegisteredWorkflows(): Array { + return this.discoveredWorkflows; + } + + public discover(): DiscoverOutput { + return { + workflows: this.getRegisteredWorkflows(), + }; + } + + private getHeaders(anonymous?: string): Record { + const headers = { + [HttpHeaderKeysEnum.CONTENT_TYPE]: 'application/json', + [HttpHeaderKeysEnum.AUTHORIZATION]: `ApiKey ${this.apiKey}`, + }; + + if (anonymous) { + headers[HttpHeaderKeysEnum.ANONYMOUS] = anonymous; + } + + return headers; + } + + public async diff(echoUrl: string, anonymous?: string): Promise { + const workflows = this.discover()?.workflows || []; + + const workflowsResponse = await fetch(this.backendUrl + NovuApiEndpointsEnum.DIFF, { + method: HttpMethodEnum.POST, + headers: this.getHeaders(anonymous), + body: JSON.stringify({ workflows, chimeraUrl: echoUrl }), + }); + + return workflowsResponse.json(); + } + + public async sync(echoUrl: string, anonymous?: string, source?: string): Promise { + const { workflows } = this.discover(); + + const workflowsResponse = await fetch(`${this.backendUrl}${NovuApiEndpointsEnum.SYNC}?source=${source || 'sdk'}`, { + method: HttpMethodEnum.POST, + headers: this.getHeaders(anonymous), + body: JSON.stringify({ workflows, chimeraUrl: echoUrl }), + }); + + return workflowsResponse.json(); + } + + /** + * Mocks data based on the given schema. + * The `default` value in the schema is used as the base data. + * If no `default` value is provided, the data is generated using JSONSchemaFaker. + * + * @param schema + * @returns mocked data + */ + private mock(schema: Schema): Record { + return JSONSchemaFaker.generate(schema as JSONSchema7) as Record; + } + + private validate( + data: unknown, + validate: Validate, + schema: Schema, + component: 'event' | 'step' | 'provider', + payloadType: 'input' | 'output' | 'result' | 'data', + workflowId: string, + stepId?: string, + providerId?: string + ): void { + const valid = validate(data); + + if (!valid) { + const betterErrors = betterAjvErrors(schema, data, validate.errors || []); + // eslint-disable-next-line no-console + console.error(`\n${betterErrors}`); + + switch (component) { + case 'event': + this.validateEvent(payloadType, workflowId, validate); + + case 'step': + this.validateStep(stepId, payloadType, workflowId, validate); + + case 'provider': + this.validateProvider(stepId, providerId, payloadType, workflowId, validate); + } + } + } + + private validateProvider( + stepId: string | undefined, + providerId: string | undefined, + payloadType: 'input' | 'output' | 'result' | 'data', + workflowId: string, + validate: ValidateFunction + ) { + if (!stepId) { + throw new Error('stepId is required'); + } + + if (!providerId) { + throw new Error('providerId is required'); + } + + switch (payloadType) { + case 'output': + throw new ExecutionProviderOutputInvalidError(workflowId, stepId, providerId, validate.errors); + + default: + throw new Error(`Invalid payload type: '${payloadType}'`); + } + } + + private validateStep( + stepId: string | undefined, + payloadType: 'input' | 'output' | 'result' | 'data', + workflowId: string, + validate: ValidateFunction + ) { + if (!stepId) { + throw new Error('stepId is required'); + } + + switch (payloadType) { + case 'output': + throw new ExecutionStateOutputInvalidError(workflowId, stepId, validate.errors); + + case 'result': + throw new ExecutionStateResultInvalidError(workflowId, stepId, validate.errors); + + case 'input': + throw new ExecutionStateInputInvalidError(workflowId, stepId, validate.errors); + + default: + throw new Error(`Invalid payload type: '${payloadType}'`); + } + } + + private validateEvent( + payloadType: 'input' | 'output' | 'result' | 'data', + workflowId: string, + validate: ValidateFunction + ) { + switch (payloadType) { + case 'input': + throw new ExecutionEventInputInvalidError(workflowId, validate.errors); + + case 'data': + throw new ExecutionEventDataInvalidError(workflowId, validate.errors); + + default: + throw new Error(`Invalid payload type: '${payloadType}'`); + } + } + + private executeStepFactory(event: IEvent, setResult: (result: any) => void): ActionStep { + return async (stepId, stepResolve, options) => { + const step = this.getStep(event.workflowId, stepId); + + const previewStepHandler = this.previewStep.bind(this); + const executeStepHandler = this.executeStep.bind(this); + const handler = event.action === 'preview' ? previewStepHandler : executeStepHandler; + + const stepResult = await handler(event, { + ...step, + providers: step.providers.map((provider) => { + const providerResolve = options?.providers?.[provider.type]; + + if (!providerResolve) { + throw new ProviderNotFoundError(provider.type); + } + + return { + ...provider, + resolve: providerResolve, + }; + }), + resolve: stepResolve, + }); + + if (stepId === event.stepId) { + setResult(stepResult); + } + + return stepResult.outputs as any; + }; + } + + public async executeWorkflow(event: IEvent): Promise { + const actionMessages = { + execute: 'Executing', + preview: 'Previewing', + }; + + const actionMessage = actionMessages[event.action]; + const actionMessageFormatted = `${actionMessage} workflowId:`; + // eslint-disable-next-line no-console + console.log(`\n${log.bold(log.underline(actionMessageFormatted))} '${event.workflowId}'`); + const workflow = this.getWorkflow(event.workflowId); + + const startTime = process.hrtime(); + + let result: { + outputs: Record; + providers: Record; + } = { + outputs: {}, + providers: {}, + }; + let resolveEarlyExit: (value?: unknown) => void; + const earlyExitPromise = new Promise((resolve) => { + resolveEarlyExit = resolve; + }); + + const setResult = (stepResult: any): void => { + resolveEarlyExit(); + result = stepResult; + }; + + let executionError: Error | undefined; + try { + if ( + event.action === 'execute' && // TODO: move this validation to the handler layer + !event.data + ) { + throw new ExecutionEventInputInvalidError(event.workflowId, { + message: 'Event `data` is required', + }); + } + + const executionData = this.createExecutionInputs(event, workflow); + await Promise.race([ + earlyExitPromise, + workflow.execute({ + payload: executionData, + environment: {}, + input: {}, + subscriber: event.subscriber, + step: { + email: this.executeStepFactory(event, setResult), + sms: this.executeStepFactory(event, setResult), + inApp: this.executeStepFactory(event, setResult), + digest: this.executeStepFactory(event, setResult), + delay: this.executeStepFactory(event, setResult), + push: this.executeStepFactory(event, setResult), + chat: this.executeStepFactory(event, setResult), + custom: this.executeStepFactory(event, setResult), + }, + }), + ]); + } catch (error) { + executionError = error; + } + const endTime = process.hrtime(startTime); + + const elapsedSeconds = endTime[0]; + const elapsedNanoseconds = endTime[1]; + const elapsedTimeInMilliseconds = elapsedSeconds * 1000 + elapsedNanoseconds / 1_000_000; + + const emoji = executionError ? EMOJI.ERROR : EMOJI.SUCCESS; + const resultMessage = + event.action === 'execute' ? 'Executed' : event.action === 'preview' ? 'Previewed' : 'Invalid action'; + // eslint-disable-next-line no-console + console.log(`${emoji} ${resultMessage} workflowId: \`${event.workflowId}\``); + + this.prettyPrintExecute(event, elapsedTimeInMilliseconds, executionError); + + if (executionError) { + throw executionError; + } + + return { + outputs: result.outputs, + providers: result.providers, + metadata: { + status: 'success', + error: false, + duration: elapsedTimeInMilliseconds, + }, + }; + } + + private createExecutionInputs(event: IEvent, workflow: DiscoverWorkflowOutput): Record { + const executionData = event.data; + + this.validate(event.data, workflow.data.validate, workflow.data.schema, 'event', 'input', event.workflowId); + + return executionData; + } + + private prettyPrintExecute(payload: IEvent, duration: number, error?: Error): void { + const successPrefix = error ? EMOJI.ERROR : EMOJI.SUCCESS; + const actionMessage = + payload.action === 'execute' ? 'Executed' : payload.action === 'preview' ? 'Previewed' : 'Invalid action'; + const message = error ? 'Failed to execute' : actionMessage; + const executionLog = error ? log.error : log.success; + const logMessage = `${successPrefix} ${message} workflowId: '${payload.workflowId}`; + // eslint-disable-next-line no-console + console.log(`\n ${log.bold(executionLog(logMessage))}'`); + // eslint-disable-next-line no-console + console.log(` ├ ${EMOJI.STEP} stepId: '${payload.stepId}'`); + // eslint-disable-next-line no-console + console.log(` ├ ${EMOJI.ACTION} action: '${payload.action}'`); + // eslint-disable-next-line no-console + console.log(` └ ${EMOJI.DURATION} duration: '${duration.toFixed(2)}ms'\n`); + } + + private async executeProviders(payload: IEvent, step: DiscoverStepOutput): Promise> { + return step.providers.reduce(async (acc, provider) => { + const result = await acc; + const previewProviderHandler = this.previewProvider.bind(this); + const executeProviderHandler = this.executeProvider.bind(this); + const handler = payload.action === 'preview' ? previewProviderHandler : executeProviderHandler; + + const providerResult = await handler(payload, step, provider); + + return { + ...result, + [provider.type]: providerResult, + }; + }, Promise.resolve({} as Record)); + } + + private previewProvider(payload: IEvent, step: DiscoverStepOutput, provider: DiscoverProviderOutput): unknown { + // eslint-disable-next-line no-console + console.log(` ${EMOJI.MOCK} Mocked provider: \`${provider.type}\``); + const mockOutput = this.mock(provider.outputs.schema); + + return mockOutput; + } + + private async executeProvider( + payload: IEvent, + step: DiscoverStepOutput, + provider: DiscoverProviderOutput + ): Promise { + const spinner = ora({ indent: 2 }).start(`Executing provider: \`${provider.type}\``); + try { + if (payload.stepId === step.stepId) { + const input = this.createStepInputs(step, payload); + const result = await provider.resolve(input); + this.validate( + result, + provider.outputs.validate, + provider.outputs.schema, + 'step', + 'output', + payload.workflowId, + step.stepId, + provider.type + ); + spinner.succeed(`Executed provider: \`${provider.type}\``); + + return result; + } else { + // No-op. We don't execute providers for hydrated steps + spinner.stopAndPersist({ + symbol: EMOJI.HYDRATED, + text: `Hydrated provider: \`${provider.type}\``, + }); + } + } catch (error) { + spinner.stopAndPersist({ + symbol: EMOJI.ERROR, + text: `Failed to execute provider: \`${provider.type}\``, + }); + throw new ProviderExecutionFailedError(`Failed to execute provider: '${provider.type}'.\n${error.message}`); + } + } + + private async executeStep( + event: IEvent, + step: DiscoverStepOutput + ): Promise> { + if (event.stepId === step.stepId) { + const spinner = ora({ indent: 1 }).start(`Executing stepId: \`${step.stepId}\``); + try { + const input = this.createStepInputs(step, event); + const result = await step.resolve(input); + this.validate( + result, + step.outputs.validate, + step.outputs.schema, + 'step', + 'output', + event.workflowId, + step.stepId + ); + + const providers = await this.executeProviders(event, step); + + spinner.succeed(`Executed stepId: \`${step.stepId}\``); + + return { + outputs: result, + providers, + }; + } catch (error) { + spinner.stopAndPersist({ + prefixText: '', + symbol: EMOJI.ERROR, + text: `Failed to execute stepId: \`${step.stepId}\``, + }); + throw error; + } + } else { + const spinner = ora({ indent: 1 }).start(`Hydrating stepId: \`${step.stepId}\``); + try { + const result = event.state.find((state) => state.stepId === step.stepId); + + if (result) { + this.validate( + result.outputs, + step.results.validate, + step.results.schema, + 'step', + 'result', + event.workflowId, + step.stepId + ); + spinner.stopAndPersist({ + symbol: EMOJI.HYDRATED, + text: `Hydrated stepId: \`${step.stepId}\``, + }); + + return { + outputs: result.outputs, + providers: await this.executeProviders(event, step), + }; + } else { + throw new ExecutionStateCorruptError(event.workflowId, step.stepId); + } + } catch (error) { + spinner.stopAndPersist({ + symbol: EMOJI.ERROR, + text: `Failed to hydrate stepId: \`${step.stepId}\``, + }); + throw error; + } + } + } + + /** + * Create the inputs for a step, taking both the event inputs and the default inputs into account + * + * @param step The step to create the input for + * @param event The event that triggered the step + * @returns The input for the step + */ + private createStepInputs(step: DiscoverStepOutput, event: IEvent): Record { + const stepInputs = event.inputs; + + this.validate(stepInputs, step.inputs.validate, step.inputs.schema, 'step', 'input', event.workflowId, step.stepId); + + return stepInputs; + } + + private async previewStep( + payload: IEvent, + step: DiscoverStepOutput + ): Promise> { + const spinner = ora({ indent: 1 }).start(`Previewing stepId: \`${step.stepId}\``); + try { + if (payload.stepId === step.stepId) { + const input = this.createStepInputs(step, payload); + const previewOutput = await step.resolve(input); + this.validate( + previewOutput, + step.outputs.validate, + step.outputs.schema, + 'step', + 'output', + payload.workflowId, + step.stepId + ); + + spinner.stopAndPersist({ + symbol: EMOJI.MOCK, + text: `Mocked stepId: \`${step.stepId}\``, + }); + + return { + outputs: previewOutput, + providers: await this.executeProviders(payload, step), + }; + } else { + // TODO: add capability to mock parts of the step results during preview + const mockResult = this.mock(step.results.schema); + + spinner.stopAndPersist({ + symbol: EMOJI.MOCK, + text: `Mocked stepId: \`${step.stepId}\``, + }); + + return { + outputs: mockResult, + providers: await this.executeProviders(payload, step), + }; + } + } catch (error) { + spinner.stopAndPersist({ + symbol: EMOJI.ERROR, + text: `Failed to preview stepId: \`${step.stepId}\``, + }); + throw error; + } + } + + private getStepCode(workflowId: string, stepId: string): CodeResult { + const step = this.getStep(workflowId, stepId); + + return { + code: step.resolve.toString(), + }; + } + + private getWorkflowCode(workflowId: string): CodeResult { + const workflow = this.getWorkflow(workflowId); + + return { + code: workflow.execute.toString(), + }; + } + + public getCode(workflowId: string, stepId?: string): CodeResult { + let getCodeResult: CodeResult; + + if (!workflowId) { + throw new WorkflowNotFoundError(workflowId); + } else if (stepId) { + getCodeResult = this.getStepCode(workflowId, stepId); + } else { + getCodeResult = this.getWorkflowCode(workflowId); + } + + return getCodeResult; + } +} diff --git a/packages/sdk/src/constants/action.constants.ts b/packages/sdk/src/constants/action.constants.ts new file mode 100644 index 00000000000..e9d15ebff74 --- /dev/null +++ b/packages/sdk/src/constants/action.constants.ts @@ -0,0 +1,12 @@ +export enum PostActionEnum { + EXECUTE = 'execute', + PREVIEW = 'preview', + SYNC = 'sync', + DIFF = 'diff', +} + +export enum GetActionEnum { + DISCOVER = 'discover', + HEALTH_CHECK = 'health-check', + CODE = 'code', +} diff --git a/packages/sdk/src/constants/api.constants.ts b/packages/sdk/src/constants/api.constants.ts new file mode 100644 index 00000000000..97d2c23664a --- /dev/null +++ b/packages/sdk/src/constants/api.constants.ts @@ -0,0 +1,9 @@ +export const DEFAULT_NOVU_API_BASE_URL = 'https://api.novu.co'; + +export enum NovuApiEndpointsEnum { + SYNC = '/v1/echo/sync', + DIFF = '/v1/echo/diff', +} + +export const SIGNATURE_TIMESTAMP_TOLERANCE_MINUTES = 5; +export const SIGNATURE_TIMESTAMP_TOLERANCE = SIGNATURE_TIMESTAMP_TOLERANCE_MINUTES * 60 * 5; // 5 minutes diff --git a/packages/sdk/src/constants/error.constants.ts b/packages/sdk/src/constants/error.constants.ts new file mode 100644 index 00000000000..1bacf6700e1 --- /dev/null +++ b/packages/sdk/src/constants/error.constants.ts @@ -0,0 +1,31 @@ +import { testErrorCodeEnumValidity } from '../types/error.types'; + +export enum ErrorCodeEnum { + WORKFLOW_NOT_FOUND_ERROR = 'WorkflowNotFoundError', + WORKFLOW_ALREADY_EXISTS_ERROR = 'WorkflowAlreadyExistsError', + WORKFLOW_EXECUTION_FAILED_ERROR = 'WorkflowExecutionFailedError', + EXECUTION_STATE_OUTPUT_INVALID_ERROR = 'ExecutionStateOutputInvalidError', + EXECUTION_STATE_RESULT_INVALID_ERROR = 'ExecutionStateResultInvalidError', + EXECUTION_PROVIDER_OUTPUT_INVALID_ERROR = 'ExecutionProviderOutputInvalidError', + PROVIDER_NOT_FOUND_ERROR = 'ProviderNotFoundError', + PROVIDER_EXECUTION_FAILED_ERROR = 'ProviderExecutionFailedError', + STEP_NOT_FOUND_ERROR = 'StepNotFoundError', + STEP_ALREADY_EXISTS_ERROR = 'StepAlreadyExistsError', + STEP_EXECUTION_FAILED_ERROR = 'StepExecutionFailedError', + EXECUTION_STATE_CORRUPT_ERROR = 'ExecutionStateCorruptError', + EXECUTION_EVENT_DATA_INVALID_ERROR = 'ExecutionEventDataInvalidError', + EXECUTION_EVENT_INPUT_INVALID_ERROR = 'ExecutionEventInputInvalidError', + EXECUTION_STATE_INPUT_INVALID_ERROR = 'ExecutionStateInputInvalidError', + METHOD_NOT_ALLOWED_ERROR = 'MethodNotAllowedError', + INVALID_ACTION_ERROR = 'InvalidActionError', + MISSING_API_KEY_ERROR = 'MissingApiKeyError', + SIGNATURE_MISMATCH_ERROR = 'SignatureMismatchError', + SIGNATURE_NOT_FOUND_ERROR = 'SignatureNotFoundError', + SIGNATURE_INVALID_ERROR = 'SignatureInvalidError', + SIGNATURE_EXPIRED_ERROR = 'SignatureExpiredError', + SIGNING_KEY_NOT_FOUND_ERROR = 'SigningKeyNotFoundError', + PLATFORM_ERROR = 'PlatformError', + SIGNATURE_VERSION_INVALID_ERROR = 'SignatureVersionInvalidError', +} + +testErrorCodeEnumValidity(ErrorCodeEnum); diff --git a/packages/sdk/src/constants/http-headers.constants.ts b/packages/sdk/src/constants/http-headers.constants.ts new file mode 100644 index 00000000000..8970cfc886a --- /dev/null +++ b/packages/sdk/src/constants/http-headers.constants.ts @@ -0,0 +1,13 @@ +export enum HttpHeaderKeysEnum { + SIGNATURE = 'x-novu-signature', + ANONYMOUS = 'x-novu-anonymous', + EXECUTION_DURATION = 'x-echo-execution-duration', + SDK_VERSION = 'x-echo-sdk', + FRAMEWORK = 'x-echo-framework', + USER_AGENT = 'user-agent', + CONTENT_TYPE = 'content-type', + AUTHORIZATION = 'authorization', + ACCESS_CONTROL_ALLOW_ORIGIN = 'access-control-allow-origin', + ACCESS_CONTROL_ALLOW_METHODS = 'access-control-allow-methods', + ACCESS_CONTROL_ALLOW_HEADERS = 'access-control-allow-headers', +} diff --git a/packages/sdk/src/constants/http-methods.constants.ts b/packages/sdk/src/constants/http-methods.constants.ts new file mode 100644 index 00000000000..ac5d8c2fb89 --- /dev/null +++ b/packages/sdk/src/constants/http-methods.constants.ts @@ -0,0 +1,4 @@ +export enum HttpMethodEnum { + POST = 'POST', + GET = 'GET', +} diff --git a/packages/sdk/src/constants/http-query.constants.ts b/packages/sdk/src/constants/http-query.constants.ts new file mode 100644 index 00000000000..359f0c11302 --- /dev/null +++ b/packages/sdk/src/constants/http-query.constants.ts @@ -0,0 +1,6 @@ +export enum HttpQueryKeysEnum { + WORKFLOW_ID = 'workflowId', + STEP_ID = 'stepId', + ACTION = 'action', + SOURCE = 'source', +} diff --git a/packages/sdk/src/constants/http-status.constants.ts b/packages/sdk/src/constants/http-status.constants.ts new file mode 100644 index 00000000000..8c1ec5a32b0 --- /dev/null +++ b/packages/sdk/src/constants/http-status.constants.ts @@ -0,0 +1,52 @@ +export enum HttpStatusEnum { + CONTINUE = 100, + SWITCHING_PROTOCOLS = 101, + PROCESSING = 102, + EARLYHINTS = 103, + OK = 200, + CREATED = 201, + ACCEPTED = 202, + NON_AUTHORITATIVE_INFORMATION = 203, + NO_CONTENT = 204, + RESET_CONTENT = 205, + PARTIAL_CONTENT = 206, + AMBIGUOUS = 300, + MOVED_PERMANENTLY = 301, + FOUND = 302, + SEE_OTHER = 303, + NOT_MODIFIED = 304, + TEMPORARY_REDIRECT = 307, + PERMANENT_REDIRECT = 308, + BAD_REQUEST = 400, + UNAUTHORIZED = 401, + PAYMENT_REQUIRED = 402, + FORBIDDEN = 403, + NOT_FOUND = 404, + METHOD_NOT_ALLOWED = 405, + NOT_ACCEPTABLE = 406, + PROXY_AUTHENTICATION_REQUIRED = 407, + REQUEST_TIMEOUT = 408, + CONFLICT = 409, + GONE = 410, + LENGTH_REQUIRED = 411, + PRECONDITION_FAILED = 412, + PAYLOAD_TOO_LARGE = 413, + URI_TOO_LONG = 414, + UNSUPPORTED_MEDIA_TYPE = 415, + REQUESTED_RANGE_NOT_SATISFIABLE = 416, + EXPECTATION_FAILED = 417, + I_AM_A_TEAPOT = 418, + MISDIRECTED = 421, + UNPROCESSABLE_ENTITY = 422, + FAILED_DEPENDENCY = 424, + PRECONDITION_REQUIRED = 428, + TOO_MANY_REQUESTS = 429, + INTERNAL_SERVER_ERROR = 500, + NOT_IMPLEMENTED = 501, + BAD_GATEWAY = 502, + SERVICE_UNAVAILABLE = 503, + GATEWAY_TIMEOUT = 504, + HTTP_VERSION_NOT_SUPPORTED = 505, +} + +export const RETRYABLE_ERROR_STATUS_CODES = [HttpStatusEnum.INTERNAL_SERVER_ERROR]; diff --git a/packages/sdk/src/constants/index.ts b/packages/sdk/src/constants/index.ts new file mode 100644 index 00000000000..640976489e7 --- /dev/null +++ b/packages/sdk/src/constants/index.ts @@ -0,0 +1,9 @@ +export * from './action.constants'; +export * from './api.constants'; +export * from './error.constants'; +export * from './http-headers.constants'; +export * from './http-methods.constants'; +export * from './http-query.constants'; +export * from './http-status.constants'; +export * from './resource.constants'; +export * from './step.constants'; diff --git a/packages/sdk/src/constants/resource.constants.ts b/packages/sdk/src/constants/resource.constants.ts new file mode 100644 index 00000000000..50ec6f0818d --- /dev/null +++ b/packages/sdk/src/constants/resource.constants.ts @@ -0,0 +1,5 @@ +export enum ResourceEnum { + WORKFLOW = 'workflow', + PROVIDER = 'provider', + STEP = 'step', +} diff --git a/packages/sdk/src/constants/step.constants.ts b/packages/sdk/src/constants/step.constants.ts new file mode 100644 index 00000000000..d35451c7f90 --- /dev/null +++ b/packages/sdk/src/constants/step.constants.ts @@ -0,0 +1,13 @@ +export enum ChannelStepEnum { + EMAIL = 'email', + SMS = 'sms', + PUSH = 'push', + CHAT = 'chat', + IN_APP = 'in_app', +} + +export enum ActionStepEnum { + DIGEST = 'digest', + DELAY = 'delay', + CUSTOM = 'custom', +} diff --git a/packages/sdk/src/errors/.eslintrc.json b/packages/sdk/src/errors/.eslintrc.json new file mode 100644 index 00000000000..32a32d4bc3f --- /dev/null +++ b/packages/sdk/src/errors/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "rules": { + "max-classes-per-file": 0 + } +} diff --git a/packages/sdk/src/errors/base.errors.ts b/packages/sdk/src/errors/base.errors.ts new file mode 100644 index 00000000000..3ac60d87232 --- /dev/null +++ b/packages/sdk/src/errors/base.errors.ts @@ -0,0 +1,46 @@ +import { HttpStatusEnum } from '../constants'; +import { ErrorCodeEnum } from '../constants/error.constants'; + +/** + * Base error class for all Echo errors. + */ +export abstract class EchoError extends Error { + /** + * HTTP status code. + */ + public abstract readonly statusCode: HttpStatusEnum; + + /** + * Additional data that can be used to provide more information about the error. + */ + public data?: any; + + /** + * The error code, which is used to identify the error type. + */ + public abstract readonly code: ErrorCodeEnum; +} + +export abstract class NotFoundError extends EchoError { + statusCode = HttpStatusEnum.NOT_FOUND; +} + +export abstract class BadRequestError extends EchoError { + statusCode = HttpStatusEnum.BAD_REQUEST; +} + +export abstract class UnauthorizedError extends EchoError { + statusCode = HttpStatusEnum.UNAUTHORIZED; +} + +export abstract class InternalServerError extends EchoError { + statusCode = HttpStatusEnum.INTERNAL_SERVER_ERROR; +} + +export abstract class ConflictError extends EchoError { + statusCode = HttpStatusEnum.CONFLICT; +} + +export abstract class ForbiddenError extends EchoError { + statusCode = HttpStatusEnum.FORBIDDEN; +} diff --git a/packages/sdk/src/errors/execution.errors.ts b/packages/sdk/src/errors/execution.errors.ts new file mode 100644 index 00000000000..06be7417409 --- /dev/null +++ b/packages/sdk/src/errors/execution.errors.ts @@ -0,0 +1,76 @@ +/* eslint-disable max-len */ +import { ErrorCodeEnum } from '../constants'; +import { BadRequestError } from './base.errors'; + +export class ExecutionStateCorruptError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_STATE_CORRUPT_ERROR; + + constructor(workflowId: string, stepId: string) { + super( + `Workflow with id: \`${workflowId}\` has a corrupt state. Step with id: \`${stepId}\` does not exist. Please provide the missing state.` + ); + this.data = { workflowId, stepId }; + } +} + +export class ExecutionEventDataInvalidError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_EVENT_DATA_INVALID_ERROR; + + constructor(workflowId: string, data: any) { + super(`Workflow with id: \`${workflowId}\` has invalid \`data\`. Please provide the correct event data.`); + this.data = data; + } +} + +export class ExecutionEventInputInvalidError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_EVENT_INPUT_INVALID_ERROR; + + constructor(workflowId: string, data: any) { + super(`Workflow with id: \`${workflowId}\` has invalid \`inputs\`. Please provide the correct event inputs.`); + this.data = data; + } +} + +export class ExecutionStateInputInvalidError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_STATE_INPUT_INVALID_ERROR; + + constructor(workflowId: string, stepId: string, data: any) { + super( + `Workflow with id: \`${workflowId}\` has an invalid state. Step with id: \`${stepId}\` has invalid input. Please provide the correct step input.` + ); + this.data = data; + } +} + +export class ExecutionStateOutputInvalidError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_STATE_OUTPUT_INVALID_ERROR; + + constructor(workflowId: string, stepId: string, data: any) { + super( + `Workflow with id: \`${workflowId}\` has an invalid state. Step with id: \`${stepId}\` has invalid output. Please provide the correct step output.` + ); + this.data = data; + } +} + +export class ExecutionStateResultInvalidError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_STATE_RESULT_INVALID_ERROR; + + constructor(workflowId: string, stepId: string, data: any) { + super( + `Workflow with id: \`${workflowId}\` has an invalid state. Step with id: \`${stepId}\` has invalid result. Please provide the correct step result.` + ); + this.data = data; + } +} + +export class ExecutionProviderOutputInvalidError extends BadRequestError { + code = ErrorCodeEnum.EXECUTION_PROVIDER_OUTPUT_INVALID_ERROR; + + constructor(workflowId: string, stepId: string, providerId: string, data: any) { + super( + `Workflow with id: \`${workflowId}\` has an invalid state. Step with id: \`${stepId}\` and provider with id: \`${providerId}\` has invalid output. Please provide the correct provider output.` + ); + this.data = data; + } +} diff --git a/packages/sdk/src/errors/handler.errors.ts b/packages/sdk/src/errors/handler.errors.ts new file mode 100644 index 00000000000..f12b68da584 --- /dev/null +++ b/packages/sdk/src/errors/handler.errors.ts @@ -0,0 +1,28 @@ +import { ErrorCodeEnum, HttpMethodEnum, HttpStatusEnum } from '../constants'; +import { enumToPrettyString } from '../utils'; +import { BadRequestError, EchoError } from './base.errors'; + +export class MethodNotAllowedError extends EchoError { + code = ErrorCodeEnum.METHOD_NOT_ALLOWED_ERROR; + + statusCode = HttpStatusEnum.METHOD_NOT_ALLOWED; + + message = `Method not allowed. Please use one of ${enumToPrettyString(HttpMethodEnum)}`; +} + +export class InvalidActionError extends BadRequestError { + code = ErrorCodeEnum.INVALID_ACTION_ERROR; + + // eslint-disable-next-line @typescript-eslint/ban-types + constructor(action: string, allowedActions: Object) { + super(`Invalid query string: \`action\`=\`${action}\`. Please use one of ${enumToPrettyString(allowedActions)}`); + } +} + +export class MissingApiKeyError extends BadRequestError { + code = ErrorCodeEnum.MISSING_API_KEY_ERROR; + + constructor() { + super(`API Key is missing. Please add the API Key during Echo client initialization.`); + } +} diff --git a/packages/sdk/src/errors/index.ts b/packages/sdk/src/errors/index.ts new file mode 100644 index 00000000000..59e0f21ae88 --- /dev/null +++ b/packages/sdk/src/errors/index.ts @@ -0,0 +1,9 @@ +export * from './base.errors'; +export * from './execution.errors'; +export * from './handler.errors'; +export * from './platform.errors'; +export * from './provider.errors'; +export * from './resource.errors'; +export * from './signature.errors'; +export * from './step.errors'; +export * from './workflow.errors'; diff --git a/packages/sdk/src/errors/platform.errors.ts b/packages/sdk/src/errors/platform.errors.ts new file mode 100644 index 00000000000..abd01229a86 --- /dev/null +++ b/packages/sdk/src/errors/platform.errors.ts @@ -0,0 +1,8 @@ +import { ErrorCodeEnum } from '../constants'; +import { InternalServerError } from './base.errors'; + +export class PlatformError extends InternalServerError { + code = ErrorCodeEnum.PLATFORM_ERROR; + + message = 'Something went wrong. Please try again later.'; +} diff --git a/packages/sdk/src/errors/provider.errors.ts b/packages/sdk/src/errors/provider.errors.ts new file mode 100644 index 00000000000..d33f64d6157 --- /dev/null +++ b/packages/sdk/src/errors/provider.errors.ts @@ -0,0 +1,18 @@ +import { ErrorCodeEnum, ResourceEnum } from '../constants'; +import { ResourceExecutionFailed, ResourceNotFoundError } from './resource.errors'; + +export class ProviderNotFoundError extends ResourceNotFoundError { + code = ErrorCodeEnum.PROVIDER_NOT_FOUND_ERROR; + + constructor(id: string) { + super(ResourceEnum.PROVIDER, id); + } +} + +export class ProviderExecutionFailedError extends ResourceExecutionFailed { + code = ErrorCodeEnum.PROVIDER_EXECUTION_FAILED_ERROR; + + constructor(id: string) { + super(ResourceEnum.WORKFLOW, id); + } +} diff --git a/packages/sdk/src/errors/resource.errors.ts b/packages/sdk/src/errors/resource.errors.ts new file mode 100644 index 00000000000..309850d5403 --- /dev/null +++ b/packages/sdk/src/errors/resource.errors.ts @@ -0,0 +1,27 @@ +import { ResourceEnum } from '../constants/resource.constants'; +import { toPascalCase } from '../utils'; +import { ConflictError, InternalServerError, NotFoundError } from './base.errors'; + +export abstract class ResourceConflictError extends ConflictError { + constructor(resource: ResourceEnum, id: string) { + super(`${toPascalCase(resource)} with id: \`${id}\` already exists. Please use a different id.`); + } +} + +export abstract class ResourceNotFoundError extends NotFoundError { + constructor(resource: ResourceEnum, id: string) { + super(`${toPascalCase(resource)} with id: \`${id}\` does not exist. Please provide a valid id.`); + } +} + +export abstract class ResourceExecutionFailed extends InternalServerError { + constructor(resource: ResourceEnum, id: string) { + super(`Failed to execute ${toPascalCase(resource)} with id: \`${id}\`. Please try again later.`); + } +} + +export abstract class ResourcePreviewFailed extends InternalServerError { + constructor(resource: ResourceEnum, id: string) { + super(`Failed to preview ${toPascalCase(resource)} with id: \`${id}\`. Please try again later.`); + } +} diff --git a/packages/sdk/src/errors/signature.errors.ts b/packages/sdk/src/errors/signature.errors.ts new file mode 100644 index 00000000000..bcb56bd8124 --- /dev/null +++ b/packages/sdk/src/errors/signature.errors.ts @@ -0,0 +1,57 @@ +/* eslint-disable max-len */ +import { ErrorCodeEnum, HttpHeaderKeysEnum, SIGNATURE_TIMESTAMP_TOLERANCE_MINUTES } from '../constants'; +import { UnauthorizedError } from './base.errors'; + +export class SignatureMismatchError extends UnauthorizedError { + code = ErrorCodeEnum.SIGNATURE_MISMATCH_ERROR; + + constructor() { + super( + `Signature does not match the expected signature. Please ensure the signature provided in the \`${HttpHeaderKeysEnum.SIGNATURE}\` header is correct and try again.` + ); + } +} + +export class SignatureNotFoundError extends UnauthorizedError { + code = ErrorCodeEnum.SIGNATURE_NOT_FOUND_ERROR; + + constructor() { + super(`Signature not found. Please provide a signature in the \`${HttpHeaderKeysEnum.SIGNATURE}\` header`); + } +} + +export class SignatureInvalidError extends UnauthorizedError { + code = ErrorCodeEnum.SIGNATURE_INVALID_ERROR; + + constructor() { + super(`Signature is invalid. Please provide a valid signature in the \`${HttpHeaderKeysEnum.SIGNATURE}\` header`); + } +} + +export class SignatureExpiredError extends UnauthorizedError { + code = ErrorCodeEnum.SIGNATURE_EXPIRED_ERROR; + + constructor() { + super( + `Signature expired. Please provide a signature with a timestamp no older than ${SIGNATURE_TIMESTAMP_TOLERANCE_MINUTES} minutes in the \`${HttpHeaderKeysEnum.SIGNATURE}\` header` + ); + } +} + +export class SigningKeyNotFoundError extends UnauthorizedError { + code = ErrorCodeEnum.SIGNING_KEY_NOT_FOUND_ERROR; + + constructor() { + super('Signature key not found. Please provide a valid key in the Echo client constructor `config.apiKey`'); + } +} + +export class SignatureVersionInvalidError extends UnauthorizedError { + code = ErrorCodeEnum.SIGNATURE_VERSION_INVALID_ERROR; + + constructor() { + super( + `Signature version is invalid. Please provide a signature version with version \`v1\` in the \`${HttpHeaderKeysEnum.SIGNATURE}\` header` + ); + } +} diff --git a/packages/sdk/src/errors/step.errors.ts b/packages/sdk/src/errors/step.errors.ts new file mode 100644 index 00000000000..09a3b7edb87 --- /dev/null +++ b/packages/sdk/src/errors/step.errors.ts @@ -0,0 +1,26 @@ +import { ErrorCodeEnum, ResourceEnum } from '../constants'; +import { ResourceConflictError, ResourceExecutionFailed, ResourceNotFoundError } from './resource.errors'; + +export class StepNotFoundError extends ResourceNotFoundError { + code = ErrorCodeEnum.STEP_NOT_FOUND_ERROR; + + constructor(id: string) { + super(ResourceEnum.STEP, id); + } +} + +export class StepAlreadyExistsError extends ResourceConflictError { + code = ErrorCodeEnum.STEP_ALREADY_EXISTS_ERROR; + + constructor(id: string) { + super(ResourceEnum.STEP, id); + } +} + +export class StepExecutionFailedError extends ResourceExecutionFailed { + code = ErrorCodeEnum.STEP_EXECUTION_FAILED_ERROR; + + constructor(id: string) { + super(ResourceEnum.WORKFLOW, id); + } +} diff --git a/packages/sdk/src/errors/workflow.errors.ts b/packages/sdk/src/errors/workflow.errors.ts new file mode 100644 index 00000000000..f160f8b0652 --- /dev/null +++ b/packages/sdk/src/errors/workflow.errors.ts @@ -0,0 +1,26 @@ +import { ErrorCodeEnum, ResourceEnum } from '../constants'; +import { ResourceConflictError, ResourceExecutionFailed, ResourceNotFoundError } from './resource.errors'; + +export class WorkflowNotFoundError extends ResourceNotFoundError { + code = ErrorCodeEnum.WORKFLOW_NOT_FOUND_ERROR; + + constructor(id: string) { + super(ResourceEnum.WORKFLOW, id); + } +} + +export class WorkflowAlreadyExistsError extends ResourceConflictError { + code = ErrorCodeEnum.WORKFLOW_ALREADY_EXISTS_ERROR; + + constructor(id: string) { + super(ResourceEnum.WORKFLOW, id); + } +} + +export class WorkflowExecutionFailedError extends ResourceExecutionFailed { + code = ErrorCodeEnum.WORKFLOW_EXECUTION_FAILED_ERROR; + + constructor(id: string) { + super(ResourceEnum.WORKFLOW, id); + } +} diff --git a/packages/sdk/src/express.ts b/packages/sdk/src/express.ts new file mode 100644 index 00000000000..e5f3cdb5262 --- /dev/null +++ b/packages/sdk/src/express.ts @@ -0,0 +1,48 @@ +import { type VercelRequest, type VercelResponse } from '@vercel/node'; +import { type Request, type Response } from 'express'; + +import { EchoRequestHandler, IServeHandlerOptions } from './handler'; +import { Either } from './types'; +import { type SupportedFrameworkName } from './types'; + +export const frameworkName: SupportedFrameworkName = 'express'; + +export const serve = (options: IServeHandlerOptions): any => { + const echoHandler = new EchoRequestHandler({ + frameworkName, + ...options, + handler: (incomingRequest: Either, response: Either) => ({ + body: () => incomingRequest.body, + headers: (key) => { + const header = incomingRequest.headers[key]; + + return Array.isArray(header) ? header[0] : header; + }, + method: () => incomingRequest.method || 'GET', + url: () => { + // `req.hostname` can filter out port numbers; beware! + const hostname = incomingRequest.headers.host || ''; + + const protocol = hostname?.includes('://') ? '' : `${incomingRequest.protocol || 'https'}://`; + + const url = new URL(incomingRequest.originalUrl || incomingRequest.url || '', `${protocol}${hostname || ''}`); + + return url; + }, + queryString: (key) => { + const qs = incomingRequest.query[key]; + + return Array.isArray(qs) ? qs[0] : qs; + }, + transformResponse: ({ body, headers, status }) => { + Object.entries(headers).forEach(([headerName, headerValue]) => { + response.setHeader(headerName, headerValue); + }); + + return response.status(status).send(body); + }, + }), + }); + + return echoHandler.createHandler(); +}; diff --git a/packages/sdk/src/h3.ts b/packages/sdk/src/h3.ts new file mode 100644 index 00000000000..775b6440266 --- /dev/null +++ b/packages/sdk/src/h3.ts @@ -0,0 +1,34 @@ +import { getHeader, getQuery, type H3Event, readBody, send, setHeaders } from 'h3'; + +import { EchoRequestHandler, IServeHandlerOptions } from './handler'; +import { type SupportedFrameworkName } from './types'; + +export const frameworkName: SupportedFrameworkName = 'h3'; + +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +export const serve = (options: IServeHandlerOptions) => { + const handler = new EchoRequestHandler({ + frameworkName, + ...options, + handler: (event: H3Event) => ({ + body: () => readBody(event), + headers: (key) => getHeader(event, key), + method: () => event.method, + url: () => + new URL( + String(event.path), + `${process.env.NODE_ENV === 'development' ? 'http' : 'https'}://${String(getHeader(event, 'host'))}` + ), + queryString: (key) => String(getQuery(event)[key]), + transformResponse: (actionRes) => { + const { res } = event.node; + res.statusCode = actionRes.status; + setHeaders(event, actionRes.headers); + + return send(event, actionRes.body); + }, + }), + }); + + return handler.createHandler(); +}; diff --git a/packages/sdk/src/handler.ts b/packages/sdk/src/handler.ts new file mode 100644 index 00000000000..789cd7455a3 --- /dev/null +++ b/packages/sdk/src/handler.ts @@ -0,0 +1,314 @@ +import { createHmac } from 'node:crypto'; + +import { Echo } from './client'; +import { + GetActionEnum, + HttpHeaderKeysEnum, + HttpMethodEnum, + HttpQueryKeysEnum, + HttpStatusEnum, + PostActionEnum, + SIGNATURE_TIMESTAMP_TOLERANCE, +} from './constants'; +import { + EchoError, + InvalidActionError, + MethodNotAllowedError, + MissingApiKeyError, + PlatformError, + SignatureExpiredError, + SignatureInvalidError, + SignatureMismatchError, + SignatureNotFoundError, + SigningKeyNotFoundError, +} from './errors'; +import { MaybePromise } from './types'; + +export interface IServeHandlerOptions { + client: Echo; +} + +interface IEchoRequestHandlerOptions extends IServeHandlerOptions { + frameworkName: string; + client: Echo; + handler: Handler; +} + +type Handler = (...args: Input) => HandlerResponse; + +type HandlerResponse = { + body: () => MaybePromise; + headers: (key: string) => MaybePromise; + method: () => MaybePromise; + queryString?: (key: string, url: URL) => MaybePromise; + url: () => MaybePromise; + transformResponse: (res: IActionResponse) => Output; +}; + +interface IActionResponse { + status: number; + headers: Record; + body: TBody; +} + +export class EchoRequestHandler { + public readonly frameworkName: string; + + public readonly handler: Handler; + + public readonly client: Echo; + + private readonly hmacEnabled: boolean; + + constructor(options: IEchoRequestHandlerOptions) { + this.handler = options.handler; + this.client = options.client; + this.frameworkName = options.frameworkName; + this.hmacEnabled = !options.client.devModeBypassAuthentication; + } + + public createHandler(): (...args: Input) => Promise { + return async (...args: Input) => { + const actions = await this.handler(...args); + const actionResponse = await this.handleAction({ + actions, + }); + + return actions.transformResponse(actionResponse); + }; + } + + private getStaticHeaders(): Partial> { + const sdkVersion = `novu-echo:v${this.client.version}`; + + return { + [HttpHeaderKeysEnum.CONTENT_TYPE]: 'application/json', + [HttpHeaderKeysEnum.ACCESS_CONTROL_ALLOW_ORIGIN]: '*', + [HttpHeaderKeysEnum.ACCESS_CONTROL_ALLOW_METHODS]: 'GET, POST', + [HttpHeaderKeysEnum.ACCESS_CONTROL_ALLOW_HEADERS]: '*', + [HttpHeaderKeysEnum.FRAMEWORK]: this.frameworkName, + [HttpHeaderKeysEnum.USER_AGENT]: sdkVersion, + [HttpHeaderKeysEnum.SDK_VERSION]: sdkVersion, + }; + } + + private createResponse( + status: number, + body: any, + headers: Record = {} + ): IActionResponse { + return { + status, + body: JSON.stringify(body) as TBody, + headers: { + ...this.getStaticHeaders(), + ...headers, + }, + }; + } + + private createError(error: EchoError): IActionResponse { + return { + status: error.statusCode, + body: JSON.stringify({ + message: error.message, + data: error.data, + code: error.code, + }) as TBody, + headers: this.getStaticHeaders(), + }; + } + + private async handleAction({ actions }: { actions: HandlerResponse }): Promise { + const url = await actions.url(); + const method = await actions.method(); + const action = url.searchParams.get(HttpQueryKeysEnum.ACTION) || ''; + const workflowId = url.searchParams.get(HttpQueryKeysEnum.WORKFLOW_ID) || ''; + const stepId = url.searchParams.get(HttpQueryKeysEnum.STEP_ID) || ''; + const signatureHeader = (await actions.headers(HttpHeaderKeysEnum.SIGNATURE)) || ''; + const anonymousHeader = (await actions.headers(HttpHeaderKeysEnum.ANONYMOUS)) || ''; + const source = url.searchParams.get(HttpQueryKeysEnum.SOURCE) || ''; + + let body: Record = {}; + try { + if (method === HttpMethodEnum.POST) { + body = await actions.body(); + } + } catch (error) { + // NO-OP - body was not provided + } + + try { + if (action !== GetActionEnum.HEALTH_CHECK) { + this.validateHmac(body, signatureHeader); + } + + const postActionMap = this.getPostActionMap(body, workflowId, stepId, action, anonymousHeader, source); + const getActionMap = this.getGetActionMap(workflowId, stepId); + + if (method === HttpMethodEnum.POST) { + return await this.handlePostAction(action, postActionMap); + } + + if (method === HttpMethodEnum.GET) { + return await this.handleGetAction(action, getActionMap); + } + } catch (error) { + return this.handleError(error); + } + + return this.createError(new MethodNotAllowedError(method)); + } + + private getPostActionMap( + body: any, + workflowId: string, + stepId: string, + action: string, + anonymousHeader: string, + source: string + ): Record Promise> { + return { + [PostActionEnum.EXECUTE]: async () => { + const result = await this.client.executeWorkflow({ + ...body, + workflowId, + stepId, + action, + }); + + return this.createResponse(HttpStatusEnum.OK, result, { + [HttpHeaderKeysEnum.EXECUTION_DURATION]: result.metadata.duration.toString(), + }); + }, + [PostActionEnum.PREVIEW]: async () => { + const result = await this.client.executeWorkflow({ + ...body, + workflowId, + stepId, + action, + }); + + return this.createResponse(HttpStatusEnum.OK, result, { + [HttpHeaderKeysEnum.EXECUTION_DURATION]: result.metadata.duration.toString(), + }); + }, + [PostActionEnum.SYNC]: async () => { + if (!this.client.apiKey) { + throw new MissingApiKeyError(); + } + + const result = await this.client.sync(body.echoUrl, anonymousHeader, source); + + return this.createResponse(HttpStatusEnum.OK, result); + }, + [PostActionEnum.DIFF]: async () => { + if (!this.client.apiKey) { + throw new MissingApiKeyError(); + } + + const result = await this.client.diff(body.echoUrl, anonymousHeader); + + return this.createResponse(HttpStatusEnum.OK, result); + }, + }; + } + + private getGetActionMap(workflowId: string, stepId: string): Record Promise> { + return { + [GetActionEnum.DISCOVER]: async () => { + const result = await this.client.discover(); + + return this.createResponse(HttpStatusEnum.OK, result); + }, + [GetActionEnum.HEALTH_CHECK]: async () => { + const result = await this.client.healthCheck(); + + return this.createResponse(HttpStatusEnum.OK, result); + }, + [GetActionEnum.CODE]: async () => { + const result = await this.client.getCode(workflowId, stepId); + + return this.createResponse(HttpStatusEnum.OK, result); + }, + }; + } + + private async handlePostAction( + action: string, + postActionMap: Record Promise> + ): Promise { + if (Object.values(PostActionEnum).includes(action as PostActionEnum)) { + const actionFunction = postActionMap[action as PostActionEnum]; + + return actionFunction(); + } else { + throw new InvalidActionError(action, PostActionEnum); + } + } + + private async handleGetAction( + action: string, + getActionMap: Record Promise> + ): Promise { + if (Object.values(GetActionEnum).includes(action as GetActionEnum)) { + const actionFunction = getActionMap[action as GetActionEnum]; + + return actionFunction(); + } else { + throw new InvalidActionError(action, GetActionEnum); + } + } + + private handleError(error: any): IActionResponse { + if (error instanceof EchoError) { + if (error.statusCode === HttpStatusEnum.INTERNAL_SERVER_ERROR) { + // eslint-disable-next-line no-console + console.error(error); + } + + return this.createError(error); + } else { + // eslint-disable-next-line no-console + console.error(error); + + return this.createError(new PlatformError()); + } + } + + private validateHmac(payload: unknown, hmacHeader: string | null): void { + if (!this.hmacEnabled) return; + if (!hmacHeader) { + throw new SignatureNotFoundError(); + } + + if (!this.client.apiKey) { + throw new SigningKeyNotFoundError(); + } + + const [timestampPart, signaturePart] = hmacHeader.split(','); + if (!timestampPart || !signaturePart) { + throw new SignatureInvalidError(); + } + + const [timestamp, timestampPayload] = timestampPart.split('='); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [signatureVersion, signaturePayload] = signaturePart.split('='); + + if (Number(timestamp) < Date.now() - SIGNATURE_TIMESTAMP_TOLERANCE) { + throw new SignatureExpiredError(); + } + + const localHash = this.hashHmac(this.client.apiKey as string, `${timestampPayload}.${JSON.stringify(payload)}`); + + const isMatching = localHash === signaturePayload; + + if (!isMatching) { + throw new SignatureMismatchError(); + } + } + + private hashHmac(apiKey: string, data: string): string { + return createHmac('sha256', apiKey).update(data).digest('hex'); + } +} diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts new file mode 100644 index 00000000000..781f68b4585 --- /dev/null +++ b/packages/sdk/src/index.ts @@ -0,0 +1,2 @@ +export { Echo } from './client'; +export * from './types'; diff --git a/packages/sdk/src/next.ts b/packages/sdk/src/next.ts new file mode 100644 index 00000000000..932a6d98405 --- /dev/null +++ b/packages/sdk/src/next.ts @@ -0,0 +1,190 @@ +import { type NextApiRequest, type NextApiResponse } from 'next'; +import { type NextRequest } from 'next/server'; + +import { EchoRequestHandler, IServeHandlerOptions } from './handler'; +import { Either } from './types'; +import { type SupportedFrameworkName } from './types'; +import { getResponse } from './utils'; + +export const frameworkName: SupportedFrameworkName = 'nextjs'; + +/** + * In Next.js, serve and register any declared workflows with Echo, making + * them available to be triggered by events. + * + * Supports Next.js 12+, both serverless and edge. + * + * @example Next.js <=12 or the pages router can export the handler directly + * ```ts + * export default serve({ client: echo }); + * ``` + * + * @example Next.js >=13 with the `app` dir must export individual methods + * ```ts + * export const { GET, POST, PUT } = serve({ client: echo }); + * ``` + */ +export const serve = (options: IServeHandlerOptions): any => { + const echoHandler = new EchoRequestHandler({ + frameworkName, + ...options, + handler: ( + requestMethod: 'GET' | 'POST' | 'PUT' | undefined, + incomingRequest: NextRequest, + response: NextApiResponse + ) => { + const request = incomingRequest as Either; + + const extractHeader = (key: string): string | null | undefined => { + const header = typeof request.headers.get === 'function' ? request.headers.get(key) : request.headers[key]; + + return Array.isArray(header) ? header[0] : header; + }; + + return { + body: () => (typeof request.json === 'function' ? request.json() : request.body), + headers: extractHeader, + method: () => { + /** + * `req.method`, though types say otherwise, is not available in Next.js + * 13 {@link https://nextjs.org/docs/app/building-your-application/routing/route-handlers Route Handlers}. + * + * Therefore, we must try to set the method ourselves where we know it. + */ + const method = requestMethod || request.method || ''; + + return method; + }, + queryString: (key, url) => { + const qs = request.query?.[key] || url.searchParams.get(key); + + return Array.isArray(qs) ? qs[0] : qs; + }, + + url: () => { + let absoluteUrl: URL | undefined; + try { + absoluteUrl = new URL(request.url as string); + } catch { + // no-op + } + + if (absoluteUrl) { + /** + * `req.url` here should may be the full URL, including query string. + * There are some caveats, however, where Next.js will obfuscate + * the host. For example, in the case of `host.docker.internal`, + * Next.js will instead set the host here to `localhost`. + * + * To avoid this, we'll try to parse the URL from `req.url`, but + * also use the `host` header if it's available. + */ + const host = extractHeader('host'); + if (host) { + const hostWithProtocol = new URL(host.includes('://') ? host : `${absoluteUrl.protocol}//${host}`); + + absoluteUrl.protocol = hostWithProtocol.protocol; + absoluteUrl.host = hostWithProtocol.host; + absoluteUrl.port = hostWithProtocol.port; + absoluteUrl.username = hostWithProtocol.username; + absoluteUrl.password = hostWithProtocol.password; + } + + return absoluteUrl; + } + + let protocol: 'http' | 'https' = 'https'; + const hostHeader = extractHeader('host') || ''; + + try { + if (process.env.NODE_ENV === 'development') { + protocol = 'http'; + } + } catch (error) { + // no-op + } + + const url = new URL(request.url as string, `${protocol}://${hostHeader}`); + + return url; + }, + transformResponse: ({ body, headers, status }): Response => { + /** + * Carefully attempt to set headers and data on the response object + * for Next.js 12 support. + */ + if (typeof response?.setHeader === 'function') { + Object.entries(headers).forEach(([headerName, headerValue]) => { + response.setHeader(headerName, headerValue); + }); + } + + if (typeof response?.status === 'function' && typeof response?.send === 'function') { + response.status(status).send(body); + + /** + * If we're here, we're in a serverless endpoint (not edge), so + * we've correctly sent the response and can return `undefined`. + * + * Next.js 13 edge requires that the return value is typed as + * `Response`, so we still enforce that as we cannot dynamically + * adjust typing based on the environment. + */ + return undefined as unknown as Response; + } + + /** + * If we're here, we're in an edge environment and need to return a + * `Response` object. + * + * We also don't know if the current environment has a native + * `Response` object, so we'll grab that first. + */ + // eslint-disable-next-line @typescript-eslint/naming-convention + const Res = getResponse(); + + return new Res(body, { status, headers }); + }, + }; + }, + }); + + /** + * Next.js 13 uses + * {@link https://nextjs.org/docs/app/building-your-application/routing/route-handlers Route Handlers} + * to declare API routes instead of a generic catch-all method that was + * available using the `pages/api` directory. + * + * This means that users must now export a function for each method supported + * by the endpoint. For us, this means requiring a user explicitly exports + * `GET`, `POST`, and `PUT` functions. + * + * Because of this, we'll add circular references to those property names of + * the returned handler, meaning we can write some succinct code to export + * cspell:disable-next-line + * them. Thanks, @goodoldneon. + * + * @example + * ```ts + * export const { GET, POST, PUT } = serve(...); + * ``` + * + * See {@link https://nextjs.org/docs/app/building-your-application/routing/route-handlers} + */ + const baseHandler = echoHandler.createHandler(); + + const defaultHandler = baseHandler.bind(null, undefined); + type HandlerFunction = typeof defaultHandler; + + const handlerFunctions = Object.defineProperties(defaultHandler, { + GET: { value: baseHandler.bind(null, 'GET') }, + POST: { value: baseHandler.bind(null, 'POST') }, + PUT: { value: baseHandler.bind(null, 'PUT') }, + }) as HandlerFunction & { + GET: HandlerFunction; + POST: HandlerFunction; + PUT: HandlerFunction; + }; + + return handlerFunctions; +}; diff --git a/packages/sdk/src/nuxt.ts b/packages/sdk/src/nuxt.ts new file mode 100644 index 00000000000..c7b365f9624 --- /dev/null +++ b/packages/sdk/src/nuxt.ts @@ -0,0 +1,36 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { getHeader, getQuery, H3Event, readBody, send, setHeaders } from 'h3'; + +import { EchoRequestHandler, IServeHandlerOptions } from './handler'; +import { type SupportedFrameworkName } from './types'; + +export const frameworkName: SupportedFrameworkName = 'nuxt'; + +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +export const serve = (options: IServeHandlerOptions) => { + const handler = new EchoRequestHandler({ + frameworkName, + ...options, + handler: (event: H3Event) => ({ + queryString: (key) => String(getQuery(event)[key]), + body: () => readBody(event), + headers: (key) => getHeader(event, key), + url: () => + new URL( + String(event.path), + `${process.env.NODE_ENV === 'development' ? 'http' : 'https'}://${String(getHeader(event, 'host'))}` + ), + method: () => event.method, + transformResponse: (actionRes) => { + const { res } = event.node; + + res.statusCode = actionRes.status; + setHeaders(event, actionRes.headers); + + return send(event, actionRes.body); + }, + }), + }); + + return handler.createHandler(); +}; diff --git a/packages/sdk/src/schemas/index.ts b/packages/sdk/src/schemas/index.ts new file mode 100644 index 00000000000..a2d87f2d3b1 --- /dev/null +++ b/packages/sdk/src/schemas/index.ts @@ -0,0 +1,2 @@ +export * from './providers'; +export * from './steps'; diff --git a/packages/sdk/src/schemas/providers/chat/index.ts b/packages/sdk/src/schemas/providers/chat/index.ts new file mode 100644 index 00000000000..8aa36a220ab --- /dev/null +++ b/packages/sdk/src/schemas/providers/chat/index.ts @@ -0,0 +1,5 @@ +import { slackProviderSchemas } from './slack'; + +export const chatProviderSchemas = { + slack: slackProviderSchemas, +}; diff --git a/packages/sdk/src/schemas/providers/chat/slack.ts b/packages/sdk/src/schemas/providers/chat/slack.ts new file mode 100644 index 00000000000..536d837e6c4 --- /dev/null +++ b/packages/sdk/src/schemas/providers/chat/slack.ts @@ -0,0 +1,2640 @@ +/* eslint-disable max-len */ +import { Schema } from '../../../types/schema.types'; + +/** + * Slack message payload schema + * + * @see https://api.slack.com/reference/messaging/payload + */ + +export const slackOutputSchema = { + type: 'object', + properties: { + webhookUrl: { type: 'string', format: 'uri' }, + text: { type: 'string' }, + blocks: { + type: 'array', + items: { + type: 'object', + properties: { + type: { + enum: [ + 'image', + 'context', + 'actions', + 'divider', + 'section', + 'input', + 'file', + 'header', + 'video', + 'rich_text', + ], + }, + }, + required: ['type'], + additionalProperties: true, + allOf: [ + { + if: { + properties: { + type: { + const: 'image', + }, + }, + }, + then: { + $ref: '#/definitions/ImageBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'context', + }, + }, + }, + then: { + $ref: '#/definitions/ContextBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'actions', + }, + }, + }, + then: { + $ref: '#/definitions/ActionsBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'divider', + }, + }, + }, + then: { + $ref: '#/definitions/DividerBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'section', + }, + }, + }, + then: { + $ref: '#/definitions/SectionBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'Input', + }, + }, + }, + then: { + $ref: '#/definitions/InputBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'Video', + }, + }, + }, + then: { + $ref: '#/definitions/VideoBlock', + }, + }, + { + if: { + properties: { + type: { + const: 'rich_text', + }, + }, + }, + then: { + $ref: '#/definitions/RichTextBlock', + }, + }, + ], + }, + definitions: { + KnownBlock: { + oneOf: [ + { + $ref: '#/definitions/ImageBlock', + }, + { + $ref: '#/definitions/ContextBlock', + }, + { + $ref: '#/definitions/ActionsBlock', + }, + { + $ref: '#/definitions/DividerBlock', + }, + { + $ref: '#/definitions/SectionBlock', + }, + { + $ref: '#/definitions/InputBlock', + }, + { + $ref: '#/definitions/FileBlock', + }, + { + $ref: '#/definitions/HeaderBlock', + }, + { + $ref: '#/definitions/VideoBlock', + }, + { + $ref: '#/definitions/RichTextBlock', + }, + ], + }, + ImageBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'image', + description: 'The type of block. For an image block, `type` is always `image`.', + }, + block_id: { + type: 'string', + }, + image_url: { + type: 'string', + description: 'The URL of the image to be displayed. Maximum length for this field is 3000 characters.', + }, + alt_text: { + type: 'string', + description: + 'A plain-text summary of the image. This should not contain any markup.\nMaximum length for this field is 2000 characters.', + }, + title: { + $ref: '#/definitions/PlainTextElement', + description: + 'An optional title for the image in the form of a {@link PlainTextElement } object.\nMaximum length for the text in this field is 2000 characters.', + }, + }, + required: ['alt_text', 'image_url', 'type'], + additionalProperties: false, + description: 'Displays an image. A simple image block, designed to make those cat photos really pop.', + }, + PlainTextElement: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'plain_text', + description: 'The formatting to use for this text object.', + }, + text: { + type: 'string', + description: 'The text for the block. The minimum length is 1 and maximum length is 3000 characters.', + }, + emoji: { + type: 'boolean', + description: 'Indicates whether emojis in a text field should be escaped into the colon emoji format.', + }, + }, + required: ['type', 'text'], + additionalProperties: false, + description: 'Defines an object containing some text.', + }, + ContextBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'context', + description: 'The type of block. For a context block, `type` is always `context`.', + }, + block_id: { + type: 'string', + }, + elements: { + type: 'array', + items: { + anyOf: [ + { + $ref: '#/definitions/ImageElement', + }, + { + $ref: '#/definitions/PlainTextElement', + }, + { + $ref: '#/definitions/MrkdwnElement', + }, + ], + }, + description: + 'An array of {@link ImageElement }, {@link PlainTextElement } or {@link MrkdwnElement } objects.\nMaximum number of items is 10.', + }, + }, + required: ['elements', 'type'], + additionalProperties: false, + description: 'Displays contextual info, which can include both images and text.', + }, + ImageElement: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'image', + description: 'The type of element. In this case `type` is always `image`.', + }, + image_url: { + type: 'string', + description: 'The URL of the image to be displayed.', + }, + alt_text: { + type: 'string', + description: 'A plain-text summary of the image. This should not contain any markup.', + }, + }, + required: ['type', 'image_url', 'alt_text'], + additionalProperties: false, + description: + 'Displays an image as part of a larger block of content. Use this `image` block if you want a block with\nonly an image in it.', + }, + MrkdwnElement: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'mrkdwn', + description: 'The formatting to use for this text object.', + }, + text: { + type: 'string', + description: + 'The text for the block. This field accepts any of the standard text formatting markup.\nThe minimum length is 1 and maximum length is 3000 characters.', + }, + verbatim: { + type: 'boolean', + description: + 'When set to `false` (as is default) URLs will be auto-converted into links, conversation names will\nbe converted to links, and certain mentions will be {@link https://api.slack.com/reference/surfaces/formatting#automatic-parsing automatically parsed}.\nUsing a value of `true` will skip any preprocessing of this nature, although you can still include\n{@link https://api.slack.com/reference/surfaces/formatting#advanced manual parsing strings}.', + }, + }, + required: ['type', 'text'], + additionalProperties: false, + description: 'Defines an object containing some text.', + }, + ActionsBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'actions', + description: 'The type of block. For an actions block, `type` is always `actions`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + elements: { + type: 'array', + items: { + anyOf: [ + { + $ref: '#/definitions/Button', + }, + { + $ref: '#/definitions/Checkboxes', + }, + { + $ref: '#/definitions/Datepicker', + }, + { + $ref: '#/definitions/DateTimepicker', + }, + { + $ref: '#/definitions/MultiSelect', + }, + { + $ref: '#/definitions/Overflow', + }, + { + $ref: '#/definitions/RadioButtons', + }, + { + $ref: '#/definitions/Select', + }, + { + $ref: '#/definitions/Timepicker', + }, + { + $ref: '#/definitions/WorkflowButton', + }, + { + $ref: '#/definitions/RichTextInput', + }, + ], + }, + description: + 'An array of {@link InteractiveElements } objects.\nThere is a maximum of 25 elements in each action block.', + }, + }, + required: ['elements', 'type'], + additionalProperties: false, + description: 'Holds multiple interactive elements.', + }, + Button: { + type: 'object', + properties: { + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'button', + description: 'The type of element. In this case `type` is always `button`.', + }, + action_id: { + type: 'string', + }, + text: { + $ref: '#/definitions/PlainTextElement', + description: + "A {@link PlainTextElement } that defines the button's text. `text` may truncate with ~30 characters.\nMaximum length for the text in this field is 75 characters.", + }, + value: { + type: 'string', + description: + 'The value to send along with the {@link https://api.slack.com/interactivity/handling#payloads interaction payload}.\nMaximum length for this field is 2000 characters.', + }, + url: { + type: 'string', + description: + "A URL to load in the user's browser when the button is clicked. Maximum length for this field is 3000\ncharacters. If you're using `url`, you'll still receive an {@link https://api.slack.com/interactivity/handling#payloads interaction payload}\nand will need to send an {@link https://api.slack.com/interactivity/handling#acknowledgment_response acknowledgement response}.", + }, + style: { + type: 'string', + enum: ['danger', 'primary'], + description: + "Decorates buttons with alternative visual color schemes. Use this option with restraint.\n`primary` gives buttons a green outline and text, ideal for affirmation or confirmation actions. `primary` should\nonly be used for one button within a set.\n`danger` gives buttons a red outline and text, and should be used when the action is destructive. Use `danger` even\nmore sparingly than primary.\nIf you don't include this field, the default button style will be used.", + }, + accessibility_label: { + type: 'string', + description: + 'A label for longer descriptive text about a button element. This label will be read out by screen\nreaders instead of the button `text` object. Maximum length for this field is 75 characters.', + }, + }, + required: ['text', 'type'], + additionalProperties: false, + description: 'Allows users a direct path to performing basic actions.', + }, + Actionable: { + type: 'object', + additionalProperties: false, + properties: { + type: { + type: 'string', + }, + action_id: { + type: 'string', + }, + }, + required: ['type'], + }, + Action: { + type: 'object', + properties: { + type: { + type: 'string', + }, + action_id: { + type: 'string', + }, + }, + required: ['type'], + additionalProperties: false, + }, + Confirmable: { + type: 'object', + properties: { + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + }, + additionalProperties: false, + }, + ConfirmationDialog: { + type: 'object', + additionalProperties: false, + properties: { + title: { + $ref: '#/definitions/PlainTextElement', + description: + "A {@link PlainTextElement } text object that defines the dialog's title.\nMaximum length for this field is 100 characters.", + }, + text: { + anyOf: [ + { + $ref: '#/definitions/PlainTextElement', + }, + { + $ref: '#/definitions/MrkdwnElement', + }, + ], + description: + 'A {@link PlainTextElement } text object that defines the explanatory text that appears in the confirm\ndialog. Maximum length for the `text` in this field is 300 characters.', + }, + confirm: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } text object to define the text of the button that confirms the action.\nMaximum length for the `text` in this field is 30 characters.', + }, + deny: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } text object to define the text of the button that cancels the action.\nMaximum length for the `text` in this field is 30 characters.', + }, + style: { + type: 'string', + enum: ['primary', 'danger'], + description: + 'Defines the color scheme applied to the `confirm` button. A value of `danger` will display the button\nwith a red background on desktop, or red text on mobile. A value of `primary` will display the button with a green\nbackground on desktop, or blue text on mobile. If this field is not provided, the default value will be `primary`.', + }, + }, + required: ['text'], + description: 'Defines a dialog that adds a confirmation step to interactive elements.', + }, + Confirm: { + type: 'object', + properties: { + title: { + $ref: '#/definitions/PlainTextElement', + description: + "A {@link PlainTextElement } text object that defines the dialog's title.\nMaximum length for this field is 100 characters.", + }, + text: { + anyOf: [ + { + $ref: '#/definitions/PlainTextElement', + }, + { + $ref: '#/definitions/MrkdwnElement', + }, + ], + description: + 'A {@link PlainTextElement } text object that defines the explanatory text that appears in the confirm\ndialog. Maximum length for the `text` in this field is 300 characters.', + }, + confirm: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } text object to define the text of the button that confirms the action.\nMaximum length for the `text` in this field is 30 characters.', + }, + deny: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } text object to define the text of the button that cancels the action.\nMaximum length for the `text` in this field is 30 characters.', + }, + style: { + type: 'string', + enum: ['primary', 'danger'], + description: + 'Defines the color scheme applied to the `confirm` button. A value of `danger` will display the button\nwith a red background on desktop, or red text on mobile. A value of `primary` will display the button with a green\nbackground on desktop, or blue text on mobile. If this field is not provided, the default value will be `primary`.', + }, + }, + required: ['text'], + additionalProperties: false, + description: 'Defines a dialog that adds a confirmation step to interactive elements.', + }, + Checkboxes: { + type: 'object', + properties: { + focus_on_load: { + type: 'boolean', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'checkboxes', + description: 'The type of element. In this case `type` is always `checkboxes`.', + }, + action_id: { + type: 'string', + }, + initial_options: { + type: 'array', + items: { + $ref: '#/definitions/Option', + }, + description: + 'An array of {@link Option } objects that exactly matches one or more of the options within `options`.\nThese options will be selected when the checkbox group initially loads.', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/Option', + }, + description: 'An array of {@link Option } objects. A maximum of 10 options are allowed.', + }, + }, + required: ['options', 'type'], + additionalProperties: false, + description: 'Allows users to choose multiple items from a list of options.', + }, + Focusable: { + type: 'object', + properties: { + focus_on_load: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + Option: { + anyOf: [ + { + $ref: '#/definitions/MrkdwnOption', + }, + { + $ref: '#/definitions/PlainTextOption', + }, + ], + description: + 'Defines a single item in a number of item selection elements. An object that represents a single\nselectable item in a select menu, multi-select menu, checkbox group, radio button group, or overflow menu.', + }, + MrkdwnOption: { + type: 'object', + properties: { + value: { + type: 'string', + description: + 'A unique string value that will be passed to your app when this option is chosen.\nMaximum length for this field is 75 characters.', + }, + url: { + type: 'string', + description: + "Only available in overflow menus! A URL to load in the user's browser when the option is clicked.\nMaximum length for this field is 3000 characters.", + }, + description: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } that defines a line of descriptive text shown below the `text` field.\nMaximum length for the `text` within this field is 75 characters.', + }, + text: { + $ref: '#/definitions/MrkdwnElement', + description: + 'A {@link MrkdwnElement } that defines the text shown in the option on the menu. To be used with\nradio buttons and checkboxes. Maximum length for the `text` in this field is 75 characters.', + }, + }, + required: ['text'], + additionalProperties: false, + }, + PlainTextOption: { + type: 'object', + properties: { + value: { + type: 'string', + description: + 'A unique string value that will be passed to your app when this option is chosen.\nMaximum length for this field is 75 characters.', + }, + url: { + type: 'string', + description: + "Only available in overflow menus! A URL to load in the user's browser when the option is clicked.\nMaximum length for this field is 3000 characters.", + }, + description: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } that defines a line of descriptive text shown below the `text` field.\nMaximum length for the `text` within this field is 75 characters.', + }, + text: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } that defines the text shown in the option on the menu. To be used with\noverflow, select and multi-select menus. Maximum length for the `text` in this field is 75 characters.', + }, + }, + required: ['text'], + additionalProperties: false, + }, + Datepicker: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'datepicker', + description: 'The type of element. In this case `type` is always `datepicker`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_date: { + type: 'string', + description: + 'The initial date that is selected when the element is loaded.\nThis should be in the format `YYYY-MM-DD`.', + }, + }, + required: ['type'], + additionalProperties: false, + description: 'Allows users to select a date from a calendar style UI.', + }, + Placeholdable: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + }, + additionalProperties: false, + }, + DateTimepicker: { + type: 'object', + properties: { + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'datetimepicker', + description: 'The type of element. In this case `type` is always `datetimepicker`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_date_time: { + type: 'number', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'Allows users to select both a date and a time of day, formatted as a Unix timestamp. On desktop\nclients, this time picker will take the form of a dropdown list and the date picker will take the form of a dropdown\ncalendar. Both options will have free-text entry for precise choices. On mobile clients, the time picker and date\npicker will use native UIs.', + }, + MultiSelect: { + anyOf: [ + { + $ref: '#/definitions/MultiUsersSelect', + }, + { + $ref: '#/definitions/MultiStaticSelect', + }, + { + $ref: '#/definitions/MultiConversationsSelect', + }, + { + $ref: '#/definitions/MultiChannelsSelect', + }, + { + $ref: '#/definitions/MultiExternalSelect', + }, + ], + description: + 'Allows users to select multiple items from a list of options.\nJust like regular {@link Select }, multi-select menus also include type-ahead functionality, where a user can type a\npart or all of an option string to filter the list.\nThere are different types of multi-select menu that depend on different data sources for their lists of options:\n{@link MultiStaticSelect }, {@link MultiExternalSelect }, {@link MultiUsersSelect }, {@link MultiConversationsSelect },\n{@link MultiChannelsSelect }.', + }, + MultiUsersSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'multi_users_select', + description: 'The type of element. In this case `type` is always `multi_users_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_users: { + type: 'array', + items: { + type: 'string', + }, + description: 'An array of user IDs of any valid users to be pre-selected when the menu loads.', + }, + max_selected_items: { + type: 'number', + description: + 'Specifies the maximum number of items that can be selected in the menu. Minimum number is `1`.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This multi-select menu will populate its options with a list of Slack users visible to the current user\nin the active workspace.', + }, + MultiStaticSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'multi_static_select', + description: 'The type of element. In this case `type` is always `multi_static_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + description: + 'An array of option objects that exactly match one or more of the options within `options` or\n`option_groups`. These options will be selected when the menu initially loads.', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + description: + 'An array of {@link PlainTextOption }. Maximum number of options is 100. If `option_groups` is\nspecified, this field should not be.', + }, + option_groups: { + type: 'array', + items: { + type: 'object', + properties: { + label: { + $ref: '#/definitions/PlainTextElement', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + }, + }, + required: ['label', 'options'], + additionalProperties: false, + }, + description: + 'An array of option group objects. Maximum number of option groups is 100. If `options` is specified,\nthis field should not be.', + }, + max_selected_items: { + type: 'number', + description: + 'Specifies the maximum number of items that can be selected in the menu. Minimum number is 1.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This is the simplest form of select menu, with a static list of options passed in when defining the\nelement.', + }, + MultiConversationsSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'multi_conversations_select', + description: 'The type of element. In this case `type` is always `conversations_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_conversations: { + type: 'array', + items: { + type: 'string', + }, + description: + 'An array of one or more IDs of any valid conversations to be pre-selected when the menu loads. If\n`default_to_current_conversation` is also supplied, `initial_conversation` will be ignored.', + }, + max_selected_items: { + type: 'number', + description: + 'Specifies the maximum number of items that can be selected in the menu. Minimum number is 1.', + }, + default_to_current_conversation: { + type: 'boolean', + description: + 'Pre-populates the select menu with the conversation that the user was viewing when they opened the\nmodal, if available. Default is `false`.', + }, + filter: { + type: 'object', + properties: { + include: { + type: 'array', + items: { + type: 'string', + enum: ['im', 'mpim', 'private', 'public'], + }, + }, + exclude_external_shared_channels: { + type: 'boolean', + }, + exclude_bot_users: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A filter object that reduces the list of available conversations using the specified criteria.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This multi-select menu will populate its options with a list of public and private channels, DMs, and\nMPIMs visible to the current user in the active workspace.', + }, + MultiChannelsSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'multi_channels_select', + description: 'The type of element. In this case `type` is always `multi_channels_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_channels: { + type: 'array', + items: { + type: 'string', + }, + description: + 'An array of one or more IDs of any valid public channel to be pre-selected when the menu loads.', + }, + max_selected_items: { + type: 'number', + description: + 'Specifies the maximum number of items that can be selected in the menu. Minimum number is 1.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This multi-select menu will populate its options with a list of public channels visible to the current\nuser in the active workspace.', + }, + MultiExternalSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'multi_external_select', + description: 'The type of element. In this case `type` is always `multi_external_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + description: 'An array of options to be selected when the menu initially loads.', + }, + min_query_length: { + type: 'number', + description: + 'When the typeahead field is used, a request will be sent on every character change. If you prefer\nfewer requests or more fully ideated queries, use the `min_query_length` attribute to tell Slack the fewest number\nof typed characters required before dispatch. The default value is `3`.', + }, + max_selected_items: { + type: 'number', + description: + 'Specifies the maximum number of items that can be selected in the menu. Minimum number is 1.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This menu will load its options from an external data source, allowing for a dynamic list of options.', + }, + Overflow: { + type: 'object', + properties: { + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'overflow', + description: 'The type of element. In this case `type` is always `number_input`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + description: 'An array of up to 5 {@link PlainTextOption } to display in the menu.', + }, + }, + required: ['options', 'type'], + additionalProperties: false, + description: + 'Allows users to press a button to view a list of options.\nUnlike the select menu, there is no typeahead field, and the button always appears with an ellipsis ("…") rather\nthan customizable text. As such, it is usually used if you want a more compact layout than a select menu, or to\nsupply a list of less visually important actions after a row of buttons. You can also specify simple URL links as\noverflow menu options, instead of actions.', + }, + RadioButtons: { + type: 'object', + properties: { + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'radio_buttons', + description: 'The type of element. In this case `type` is always `radio_buttons`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_option: { + $ref: '#/definitions/Option', + description: + 'An {@link Option } object that exactly matches one of the options within `options`. This option will\nbe selected when the radio button group initially loads.', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/Option', + }, + description: 'An array of {@link Option } objects. A maximum of 10 options are allowed.', + }, + }, + required: ['options', 'type'], + additionalProperties: false, + description: 'Allows users to choose one item from a list of possible options.', + }, + Select: { + anyOf: [ + { + $ref: '#/definitions/UsersSelect', + }, + { + $ref: '#/definitions/StaticSelect', + }, + { + $ref: '#/definitions/ConversationsSelect', + }, + { + $ref: '#/definitions/ChannelsSelect', + }, + { + $ref: '#/definitions/ExternalSelect', + }, + ], + description: + 'Allows users to choose an option from a drop down menu.\nThe select menu also includes type-ahead functionality, where a user can type a part or all of an option string to\nfilter the list. There are different types of select menu elements that depend on different data sources for their\nlists of options: {@link StaticSelect }, {@link ExternalSelect }, {@link UsersSelect }, {@link ConversationsSelect },\n{@link ChannelsSelect }.', + }, + UsersSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'users_select', + description: 'The type of element. In this case `type` is always `users_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_user: { + type: 'string', + description: 'The user ID of any valid user to be pre-selected when the menu loads.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This select menu will populate its options with a list of Slack users visible to the current user in the\nactive workspace.', + }, + StaticSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'static_select', + description: 'The type of element. In this case `type` is always `static_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_option: { + $ref: '#/definitions/PlainTextOption', + description: + 'A single option that exactly matches one of the options within `options` or `option_groups`.\nThis option will be selected when the menu initially loads.', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + description: + 'An array of {@link PlainTextOption }. Maximum number of options is 100. If `option_groups` is\nspecified, this field should not be.', + }, + option_groups: { + type: 'array', + items: { + type: 'object', + properties: { + label: { + $ref: '#/definitions/PlainTextElement', + }, + options: { + type: 'array', + items: { + $ref: '#/definitions/PlainTextOption', + }, + }, + }, + required: ['label', 'options'], + additionalProperties: false, + }, + description: + 'An array of option group objects. Maximum number of option groups is 100. If `options` is specified,\nthis field should not be.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This is the simplest form of select menu, with a static list of options passed in when defining the\nelement.', + }, + ConversationsSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'conversations_select', + description: 'The type of element. In this case `type` is always `conversations_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_conversation: { + type: 'string', + description: + 'The ID of any valid conversation to be pre-selected when the menu loads. If\n`default_to_current_conversation` is also supplied, `initial_conversation` will take precedence.', + }, + response_url_enabled: { + type: 'boolean', + description: + "When set to `true`, the {@link https://api.slack.com/reference/interaction-payloads/views#view_submission `view_submission` payload}\nfrom the menu's parent view will contain a `response_url`. This `response_url` can be used for\n{@link https://api.slack.com/interactivity/handling#message_responses message responses}. The target conversation\nfor the message will be determined by the value of this select menu.", + }, + default_to_current_conversation: { + type: 'boolean', + description: + 'Pre-populates the select menu with the conversation that the user was viewing when they opened the\nmodal, if available. Default is `false`.', + }, + filter: { + type: 'object', + properties: { + include: { + type: 'array', + items: { + type: 'string', + enum: ['im', 'mpim', 'private', 'public'], + }, + }, + exclude_external_shared_channels: { + type: 'boolean', + }, + exclude_bot_users: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A filter object that reduces the list of available conversations using the specified criteria.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This select menu will populate its options with a list of public and private channels, DMs, and MPIMs\nvisible to the current user in the active workspace.', + }, + ChannelsSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'channels_select', + description: 'The type of element. In this case `type` is always `channels_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_channel: { + type: 'string', + description: 'The ID of any valid public channel to be pre-selected when the menu loads.', + }, + response_url_enabled: { + type: 'boolean', + description: + "When set to `true`, the {@link https://api.slack.com/reference/interaction-payloads/views#view_submission `view_submission` payload}\nfrom the menu's parent view will contain a `response_url`. This `response_url` can be used for\n{@link https://api.slack.com/interactivity/handling#message_responses message responses}. The target channel\nfor the message will be determined by the value of this select menu.", + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This select menu will populate its options with a list of public channels visible to the current user\nin the active workspace.', + }, + ExternalSelect: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'external_select', + description: 'The type of element. In this case `type` is always `external_select`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_option: { + $ref: '#/definitions/PlainTextOption', + description: 'A single option to be selected when the menu initially loads.', + }, + min_query_length: { + type: 'number', + description: + 'When the typeahead field is used, a request will be sent on every character change. If you prefer\nfewer requests or more fully ideated queries, use the `min_query_length` attribute to tell Slack the fewest number\nof typed characters required before dispatch. The default value is `3`.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'This select menu will load its options from an external data source, allowing for a dynamic list of\noptions.', + }, + Timepicker: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'timepicker', + description: 'The type of element. In this case `type` is always `timepicker`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_time: { + type: 'string', + description: + 'The initial time that is selected when the element is loaded. This should be in the format `HH:mm`,\nwhere `HH` is the 24-hour format of an hour (00 to 23) and `mm` is minutes with leading zeros (00 to 59),\nfor example 22:25 for 10:25pm.', + }, + timezone: { + type: 'string', + description: + 'A string in the IANA format, e.g. "America/Chicago". The timezone is displayed to end users as hint\ntext underneath the time picker. It is also passed to the app upon certain interactions, such as view_submission.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'Allows users to choose a time from a rich dropdown UI. On desktop clients, this time picker will take\nthe form of a dropdown list with free-text entry for precise choices. On mobile clients, the time picker will use\nnative time picker UIs.', + }, + WorkflowButton: { + type: 'object', + properties: { + confirm: { + $ref: '#/definitions/ConfirmationDialog', + description: + 'A {@link Confirm } object that defines an optional confirmation dialog after the element is interacted\nwith.', + }, + type: { + type: 'string', + const: 'workflow_button', + description: 'The type of element. In this case `type` is always `workflow_button`.', + }, + text: { + $ref: '#/definitions/PlainTextElement', + description: + "A {@link PlainTextElement } that defines the button's text. `text` may truncate with ~30 characters.\nMaximum length for the `text` in this field is 75 characters.", + }, + workflow: { + type: 'object', + properties: { + trigger: { + type: 'object', + properties: { + url: { + type: 'string', + description: + 'The trigger URL of the {@link https://api.slack.com/automation/triggers/link#workflow_buttons link trigger}', + }, + customizable_input_parameters: { + type: 'array', + items: { + type: 'object', + properties: { + name: { + type: 'string', + description: + 'Name of the customizable input, which should be the name of a workflow input parameter for the\nmatching workflow of the link trigger.', + }, + value: { + type: 'string', + description: + 'The value of the customizable input parameter. The type of the value is expected to match the\nspecified type for the matching workflow input parameter.', + }, + }, + required: ['name', 'value'], + additionalProperties: false, + }, + description: + 'List of customizable input parameters and their values. Should match input parameters specified on\nthe provided trigger.', + }, + }, + required: ['url'], + additionalProperties: false, + description: + 'Properties of the {@link https://api.slack.com/automation/triggers/link#workflow_buttons link trigger}that will be invoked via this button.', + }, + }, + required: ['trigger'], + additionalProperties: false, + description: + 'A workflow object that contains details about the workflow that will run when the button is clicked.', + }, + style: { + type: 'string', + enum: ['danger', 'primary'], + description: + "Decorates buttons with alternative visual color schemes. Use this option with restraint.\n`primary` gives buttons a green outline and text, ideal for affirmation or confirmation actions. `primary` should\nonly be used for one button within a set.\n`danger` gives buttons a red outline and text, and should be used when the action is destructive. Use `danger` even\nmore sparingly than primary.\nIf you don't include this field, the default button style will be used.", + }, + accessibility_label: { + type: 'string', + description: + 'A label for longer descriptive text about a button element. This label will be read out by screen\nreaders instead of the button `text` object. Maximum length for this field is 75 characters.', + }, + }, + required: ['type', 'text', 'workflow'], + additionalProperties: false, + description: + 'Allows users to run a {@link https://api.slack.com/automation/triggers/link#workflow_buttons link trigger} with customizable inputs.', + }, + RichTextInput: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + dispatch_action_config: { + $ref: '#/definitions/DispatchActionConfig', + }, + type: { + type: 'string', + const: 'rich_text_input', + description: 'The type of element. In this case `type` is always `rich_text_input`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_value: { + $ref: '#/definitions/RichTextBlock', + description: 'Initial contents of the input when it is loaded.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'A rich text input creates a composer/WYSIWYG editor for entering formatted text, offering nearly the\nsame experience you have writing messages in Slack.', + }, + Dispatchable: { + type: 'object', + properties: { + dispatch_action_config: { + $ref: '#/definitions/DispatchActionConfig', + }, + }, + additionalProperties: false, + }, + DispatchActionConfig: { + type: 'object', + properties: { + trigger_actions_on: { + type: 'array', + items: { + type: 'string', + enum: ['on_enter_pressed', 'on_character_entered'], + }, + description: + 'An array of interaction types that you would like to receive a\n{@link https://api.slack.com/reference/interaction-payloads/block-actions `block_actions` payload} for. Should be\none or both of:\n`on_enter_pressed` — payload is dispatched when user presses the enter key while the input is in focus. Hint\ntext will appear underneath the input explaining to the user to press enter to submit.\n`on_character_entered` — payload is dispatched when a character is entered (or removed) in the input.', + }, + }, + additionalProperties: false, + description: + 'Defines when a {@link PlainTextElement } will return a {@link https://api.slack.com/reference/interaction-payloads/block-actions `block_actions` interaction payload}.', + }, + RichTextBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'rich_text', + description: 'The type of block. For a rich text block, `type` is always `rich_text`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + elements: { + type: 'array', + items: { + anyOf: [ + { + $ref: '#/definitions/RichTextSection', + }, + { + $ref: '#/definitions/RichTextList', + }, + { + $ref: '#/definitions/RichTextQuote', + }, + { + $ref: '#/definitions/RichTextPreformatted', + }, + ], + }, + }, + }, + required: ['elements', 'type'], + additionalProperties: false, + }, + RichTextSection: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'rich_text_section', + description: 'The type of element. In this case `type` is always `rich_text_section`.', + }, + elements: { + type: 'array', + items: { + $ref: '#/definitions/RichTextElement', + }, + }, + }, + required: ['type', 'elements'], + additionalProperties: false, + description: 'A section block within a rich text field.', + }, + RichTextElement: { + anyOf: [ + { + $ref: '#/definitions/RichTextBroadcastMention', + }, + { + $ref: '#/definitions/RichTextColor', + }, + { + $ref: '#/definitions/RichTextChannelMention', + }, + { + $ref: '#/definitions/RichTextDate', + }, + { + $ref: '#/definitions/RichTextEmoji', + }, + { + $ref: '#/definitions/RichTextLink', + }, + { + $ref: '#/definitions/RichTextTeamMention', + }, + { + $ref: '#/definitions/RichTextText', + }, + { + $ref: '#/definitions/RichTextUserMention', + }, + { + $ref: '#/definitions/RichTextUsergroupMention', + }, + ], + description: 'Union of rich text sub-elements for use within rich text blocks.', + }, + RichTextBroadcastMention: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + type: { + type: 'string', + const: 'broadcast', + description: 'The type of element. In this case `type` is always `broadcast`.', + }, + range: { + type: 'string', + enum: ['here', 'channel', 'everyone'], + description: 'The range of the broadcast; can be one of `here`, `channel` and `everyone`.', + }, + }, + required: ['type', 'range'], + additionalProperties: false, + description: 'A broadcast mention element for use in a rich text message.', + }, + RichTextStyleable: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + }, + additionalProperties: false, + description: 'For use styling Rich Text message sub-elements.', + }, + RichTextColor: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + type: { + type: 'string', + const: 'color', + description: 'The type of element. In this case `type` is always `color`.', + }, + value: { + type: 'string', + description: 'The hex value for the color.', + }, + }, + required: ['type', 'value'], + additionalProperties: false, + description: 'A hex color element for use in a rich text message.', + }, + RichTextChannelMention: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + type: { + type: 'string', + const: 'channel', + description: 'The type of element. In this case `type` is always `channel`.', + }, + channel_id: { + type: 'string', + description: 'The encoded channel ID, e.g. C1234ABCD.', + }, + }, + required: ['type', 'channel_id'], + additionalProperties: false, + description: 'A channel mention element for use in a rich text message.', + }, + RichTextDate: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + type: { + type: 'string', + const: 'date', + description: 'The type of element. In this case `type` is always `date`.', + }, + timestamp: { + type: 'number', + description: 'A UNIX timestamp for the date to be displayed in seconds.', + }, + format: { + type: 'string', + description: + 'A template string containing curly-brace-enclosed tokens to substitute your provided `timestamp`\nin a particularly-formatted way. For example: `Posted at {date_long}`. The available date formatting tokens are:\n- `{day_divider_pretty}`: Shows `today`, `yesterday` or `tomorrow` if applicable. Otherwise, if the date is in\ncurrent year, uses the `{date_long}` format without the year. Otherwise, falls back to using the `{date_long}`\nformat.\n- `{date_num}`: Shows date as YYYY-MM-DD.\n- `{date_slash}`: Shows date as DD/MM/YYYY (subject to locale preferences).\n- `{date_long}`: Shows date as a long-form sentence including day-of-week, e.g. `Monday, December 23rd, 2013`.\n- `{date_long_full}`: Shows date as a long-form sentence without day-of-week, e.g. `August 9, 2020`.\n- `{date_long_pretty}`: Shows `yesterday`, `today` or `tomorrow`, otherwise uses the `{date_long}` format.\n- `{date}`: Same as `{date_long_full}` but without the year.\n- `{date_pretty}`: Shows `today`, `yesterday` or `tomorrow` if applicable, otherwise uses the `{date}` format.\n- `{date_short}`: Shows date using short month names without day-of-week, e.g. `Aug 9, 2020`.\n- `{date_short_pretty}`: Shows `today`, `yesterday` or `tomorrow` if applicable, otherwise uses the `{date_short}`\nformat.\n- `{time}`: Depending on user preferences, shows just the time-of-day portion of the timestamp using either 12 or\n24 hour clock formats, e.g. `2:34 PM` or `14:34`.\n- `{time_secs}`: Depending on user preferences, shows just the time-of-day portion of the timestamp using either 12\nor 24 hour clock formats, including seconds, e.g. `2:34:56 PM` or `14:34:56`.\n- `{ago}`: A human-readable period of time, e.g. `3 minutes ago`, `4 hours ago`, `2 days ago`.\nTODO: test/document `{member_local_time}`, `{status_expiration}` and `{calendar_header}`', + }, + url: { + type: 'string', + description: 'URL to link the entire `format` string to.', + }, + fallback: { + type: 'string', + description: 'Text to display in place of the date should parsing, formatting or displaying fails.', + }, + }, + required: ['type', 'timestamp', 'format'], + additionalProperties: false, + description: 'A date element for use in a rich text message.', + }, + RichTextEmoji: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + type: { + type: 'string', + const: 'emoji', + description: 'The type of element. In this case `type` is always `emoji`.', + }, + name: { + type: 'string', + description: 'Name of emoji, without colons or skin tones, e.g. `wave`', + }, + unicode: { + type: 'string', + description: + 'Lowercase hexadecimal Unicode representation of a standard emoji (not for use with custom emoji).', + }, + url: { + type: 'string', + description: 'URL of emoji asset. Only used when sharing custom emoji across workspaces.', + }, + }, + required: ['type', 'name'], + additionalProperties: false, + description: 'An emoji element for use in a rich text message.', + }, + RichTextLink: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A limited style object for styling rich text message elements\n(excluding pre-formatted, or code, elements).', + }, + type: { + type: 'string', + const: 'link', + description: 'The type of element. In this case `type` is always `link`.', + }, + text: { + type: 'string', + description: 'The text to link.', + }, + unsafe: { + type: 'boolean', + description: 'TODO: ?', + }, + url: { + type: 'string', + description: 'URL to link to.', + }, + }, + required: ['type', 'url'], + additionalProperties: false, + description: 'A link element for use in a rich text message.', + }, + RichTextTeamMention: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A limited style object for styling rich text message elements\n(excluding pre-formatted, or code, elements).', + }, + type: { + type: 'string', + const: 'team', + description: 'The type of element. In this case `type` is always `team`.', + }, + team_id: { + type: 'string', + description: 'The encoded team ID, e.g. T1234ABCD.', + }, + }, + required: ['type', 'team_id'], + additionalProperties: false, + description: 'A workspace or team mention element for use in a rich text message.', + }, + RichTextText: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A limited style object for styling rich text message elements\n(excluding pre-formatted, or code, elements).', + }, + type: { + type: 'string', + const: 'text', + description: 'The type of element. In this case `type` is always `text`.', + }, + text: { + type: 'string', + description: 'The text to render.', + }, + }, + required: ['type', 'text'], + additionalProperties: false, + description: 'A generic text element for use in a rich text message.', + }, + RichTextUserMention: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A limited style object for styling rich text message elements\n(excluding pre-formatted, or code, elements).', + }, + type: { + type: 'string', + const: 'user', + description: 'The type of element. In this case `type` is always `user`.', + }, + user_id: { + type: 'string', + description: 'The encoded user ID, e.g. U1234ABCD.', + }, + }, + required: ['type', 'user_id'], + additionalProperties: false, + description: 'A user mention element for use in a rich text message.', + }, + RichTextUsergroupMention: { + type: 'object', + properties: { + style: { + type: 'object', + properties: { + bold: { + type: 'boolean', + }, + italic: { + type: 'boolean', + }, + strike: { + type: 'boolean', + }, + highlight: { + type: 'boolean', + }, + }, + additionalProperties: false, + description: + 'A limited style object for styling rich text message elements\n(excluding pre-formatted, or code, elements).', + }, + type: { + type: 'string', + const: 'usergroup', + description: 'The type of element. In this case `type` is always `usergroup`.', + }, + usergroup_id: { + type: 'string', + description: 'The encoded usergroup ID, e.g. S1234ABCD.', + }, + }, + required: ['type', 'usergroup_id'], + additionalProperties: false, + description: 'A usergroup mention element for use in a rich text message.', + }, + RichTextList: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'rich_text_list', + description: 'The type of element. In this case `type` is always `rich_text_list`.', + }, + elements: { + type: 'array', + items: { + $ref: '#/definitions/RichTextSection', + }, + description: 'An array of {@link RichTextSection } elements comprising each list item.', + }, + style: { + type: 'string', + enum: ['bullet', 'ordered'], + description: + 'The type of list. Can be either `bullet` (the list points are all rendered the same way) or `ordered`\n(the list points increase numerically from 1).', + }, + indent: { + type: 'number', + description: + 'The style of the list points. Can be a number from `0` (default) to `8`. Yields a different character\nor characters rendered as the list points. Also affected by the `style` property.', + }, + border: { + type: 'number', + enum: [0, 1], + description: + 'Whether to render a quote-block-like border on the inline side of the list. `0` renders no border\nwhile `1` renders a border.', + }, + }, + required: ['type', 'elements', 'style'], + additionalProperties: false, + description: 'A list block within a rich text field.', + }, + RichTextQuote: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'rich_text_quote', + description: 'The type of element. In this case `type` is always `rich_text_quote`.', + }, + elements: { + type: 'array', + items: { + $ref: '#/definitions/RichTextElement', + }, + description: 'An array of {@link RichTextElement } comprising the quote block.', + }, + }, + required: ['type', 'elements'], + additionalProperties: false, + description: 'A quote block within a rich text field.', + }, + RichTextPreformatted: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'rich_text_preformatted', + description: 'The type of element. In this case `type` is always `rich_text_preformatted`.', + }, + elements: { + type: 'array', + items: { + anyOf: [ + { + $ref: '#/definitions/RichTextText', + }, + { + $ref: '#/definitions/RichTextLink', + }, + ], + }, + description: + 'An array of either {@link RichTextLink } or {@link RichTextText } comprising the preformatted text.', + }, + border: { + type: 'number', + enum: [0, 1], + description: + 'Whether to render a quote-block-like border on the inline side of the preformatted text.\n`0` renders no border, while `1` renders a border. Defaults to `0`.', + }, + }, + required: ['type', 'elements'], + additionalProperties: false, + description: 'A block of preformatted text within a rich text field.', + }, + DividerBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'divider', + description: 'The type of block. For a divider block, `type` is always `divider`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + }, + required: ['type'], + additionalProperties: false, + }, + SectionBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'section', + description: 'The type of block. For a section block, `type` is always `section`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + text: { + anyOf: [ + { + $ref: '#/definitions/PlainTextElement', + }, + { + $ref: '#/definitions/MrkdwnElement', + }, + ], + description: + 'The text for the block, in the form of a text object. Minimum length for the `text` in this field is\n1 and maximum length is 3000 characters. This field is not required if a valid array of `fields` objects is\nprovided instead.', + }, + fields: { + type: 'array', + items: { + anyOf: [ + { + $ref: '#/definitions/PlainTextElement', + }, + { + $ref: '#/definitions/MrkdwnElement', + }, + ], + }, + description: + 'Required if no `text` is provided. An array of text objects. Any text objects included with `fields`\nwill be rendered in a compact format that allows for 2 columns of side-by-side text. Maximum number of items is 10.\nMaximum length for the text in each item is 2000 characters.\n{@link https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22text%22:%22A%20message%20*with%20some%20bold%20text*%20and%20_some%20italicized%20text_.%22,%22type%22:%22mrkdwn%22%7D,%22fields%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Priority*%22%7D,%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Type*%22%7D,%7B%22type%22:%22plain_text%22,%22text%22:%22High%22%7D,%7B%22type%22:%22plain_text%22,%22text%22:%22String%22%7D%5D%7D%5D%7D Click here for an example}.', + }, + accessory: { + anyOf: [ + { + $ref: '#/definitions/Button', + }, + { + $ref: '#/definitions/Overflow', + }, + { + $ref: '#/definitions/Datepicker', + }, + { + $ref: '#/definitions/Timepicker', + }, + { + $ref: '#/definitions/Select', + }, + { + $ref: '#/definitions/MultiSelect', + }, + { + $ref: '#/definitions/Actionable', + }, + { + $ref: '#/definitions/ImageElement', + }, + { + $ref: '#/definitions/RadioButtons', + }, + { + $ref: '#/definitions/Checkboxes', + }, + ], + description: 'One of the compatible element objects.', + }, + }, + required: ['type'], + additionalProperties: false, + description: + 'Displays text, possibly alongside block elements. A section can be used as a simple text block, in\ncombination with text fields, or side-by-side with certain\n{@link https://api.slack.com/reference/messaging/block-elements block elements}.', + }, + InputBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'input', + description: 'The type of block. For an input block, `type` is always `input`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + label: { + $ref: '#/definitions/PlainTextElement', + description: + 'A label that appears above an input element in the form of a {@link PlainTextElement } object.\nMaximum length for the text in this field is 2000 characters.', + }, + hint: { + $ref: '#/definitions/PlainTextElement', + description: + 'An optional hint that appears below an input element in a lighter grey. It must be a\n{@link PlainTextElement object}. Maximum length for the `text` in this field is 2000 characters.', + }, + optional: { + type: 'boolean', + description: + 'A boolean that indicates whether the input element may be empty when a user submits the modal.\nDefaults to `false`.', + }, + element: { + anyOf: [ + { + $ref: '#/definitions/Select', + }, + { + $ref: '#/definitions/MultiSelect', + }, + { + $ref: '#/definitions/Datepicker', + }, + { + $ref: '#/definitions/Timepicker', + }, + { + $ref: '#/definitions/DateTimepicker', + }, + { + $ref: '#/definitions/PlainTextInput', + }, + { + $ref: '#/definitions/URLInput', + }, + { + $ref: '#/definitions/EmailInput', + }, + { + $ref: '#/definitions/NumberInput', + }, + { + $ref: '#/definitions/RadioButtons', + }, + { + $ref: '#/definitions/Checkboxes', + }, + { + $ref: '#/definitions/RichTextInput', + }, + ], + description: 'A block element.', + }, + dispatch_action: { + type: 'boolean', + description: + 'A boolean that indicates whether or not the use of elements in this block should dispatch a\n{@link https://api.slack.com/reference/interaction-payloads/block-actions block_actions payload}. Defaults to `false`.', + }, + }, + required: ['element', 'label', 'type'], + additionalProperties: false, + description: 'Collects information from users via block elements.', + }, + PlainTextInput: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + dispatch_action_config: { + $ref: '#/definitions/DispatchActionConfig', + }, + type: { + type: 'string', + const: 'plain_text_input', + description: 'The type of element. In this case `type` is always `plain_text_input`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_value: { + type: 'string', + description: 'The initial value in the plain-text input when it is loaded.', + }, + multiline: { + type: 'boolean', + description: + 'Indicates whether the input will be a single line (`false`) or a larger textarea (`true`).\nDefaults to `false`.', + }, + min_length: { + type: 'number', + description: + 'The minimum length of input that the user must provide. If the user provides less, they will receive\nan error. Maximum value is 3000.', + }, + max_length: { + type: 'number', + description: + 'The maximum length of input that the user can provide. If the user provides more,\nthey will receive an error.', + }, + }, + required: ['type'], + additionalProperties: false, + description: 'Allows users to enter freeform text data into a single-line or multi-line field.', + }, + URLInput: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + dispatch_action_config: { + $ref: '#/definitions/DispatchActionConfig', + }, + type: { + type: 'string', + const: 'url_text_input', + description: 'The type of element. In this case `type` is always `url_text_input`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_value: { + type: 'string', + description: 'The initial value in the URL input when it is loaded.', + }, + }, + required: ['type'], + additionalProperties: false, + description: 'Allows user to enter a URL into a single-line field.', + }, + EmailInput: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + dispatch_action_config: { + $ref: '#/definitions/DispatchActionConfig', + description: + 'A {@link DispatchActionConfig } object that determines when during text input the element returns a\n{@link https://api.slack.com/reference/interaction-payloads/block-actions `block_actions` payload}.', + }, + type: { + type: 'string', + const: 'email_text_input', + description: 'The type of element. In this case `type` is always `email_text_input`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + initial_value: { + type: 'string', + description: 'The initial value in the email input when it is loaded.', + }, + }, + required: ['type'], + additionalProperties: false, + description: 'Allows user to enter an email into a single-line field.', + }, + NumberInput: { + type: 'object', + properties: { + placeholder: { + $ref: '#/definitions/PlainTextElement', + description: + 'A {@link PlainTextElement } object that defines the placeholder text shown on the element. Maximum\nlength for the `text` field in this object is 150 characters.', + }, + focus_on_load: { + type: 'boolean', + description: + 'Indicates whether the element will be set to auto focus within the\n{@link https://api.slack.com/reference/surfaces/views `view` object}. Only one element can be set to `true`.\nDefaults to `false`.', + }, + dispatch_action_config: { + $ref: '#/definitions/DispatchActionConfig', + description: + 'A {@link DispatchActionConfig } object that determines when during text input the element returns a\n{@link https://api.slack.com/reference/interaction-payloads/block-actions `block_actions` payload}.', + }, + type: { + type: 'string', + const: 'number_input', + description: 'The type of element. In this case `type` is always `number_input`.', + }, + action_id: { + type: 'string', + description: + ': An identifier for this action. You can use this when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}. Should be unique\namong all other `action_id`s in the containing block. Maximum length for this field is 255 characters.', + }, + is_decimal_allowed: { + type: 'boolean', + description: + 'Decimal numbers are allowed if this property is `true`, set the value to `false` otherwise.', + }, + initial_value: { + type: 'string', + description: 'The initial value in the input when it is loaded.', + }, + min_value: { + type: 'string', + description: 'The minimum value, cannot be greater than `max_value`.', + }, + max_value: { + type: 'string', + description: 'The maximum value, cannot be less than `min_value`.', + }, + }, + required: ['is_decimal_allowed', 'type'], + additionalProperties: false, + description: + 'Allows user to enter a number into a single-line field. The number input element accepts both whole and\ndecimal numbers. For example, 0.25, 5.5, and -10 are all valid input values. Decimal numbers are only allowed when\n`is_decimal_allowed` is equal to `true`.', + }, + FileBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'file', + description: 'The type of block. For a file block, `type` is always `file`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + source: { + type: 'string', + description: 'At the moment, source will always be `remote` for a remote file.', + }, + external_id: { + type: 'string', + description: 'The external unique ID for this file.', + }, + }, + required: ['external_id', 'source', 'type'], + additionalProperties: false, + description: + "Displays a {@link https://api.slack.com/messaging/files/remote remote file}. You can't add this block to\napp surfaces directly, but it will show up when {@link https://api.slack.com/messaging/retrieving retrieving messages}\nthat contain remote files. If you want to add remote files to messages,\n{@link https://api.slack.com/messaging/files/remote follow our guide}.", + }, + HeaderBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'header', + description: 'The type of block. For a header block, `type` is always `header`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + text: { + $ref: '#/definitions/PlainTextElement', + description: + 'The text for the block, in the form of a {@link PlainTextElement }.\nMaximum length for the text in this field is 150 characters.', + }, + }, + required: ['text', 'type'], + additionalProperties: false, + description: + "Displays a larger-sized text block. A `header` is a plain-text block that displays in a larger, bold\nfont. Use it to delineate between different groups of content in your app's surfaces.", + }, + VideoBlock: { + type: 'object', + properties: { + type: { + type: 'string', + const: 'video', + description: 'The type of block. For a video block, `type` is always `video`.', + }, + block_id: { + type: 'string', + description: + 'A string acting as a unique identifier for a block. If not specified, a `block_id` will be generated.\nYou can use this `block_id` when you receive an interaction payload to\n{@link https://api.slack.com/interactivity/handling#payloads identify the source of the action}.\nMaximum length for this field is 255 characters. `block_id` should be unique for each message and each iteration of\na message. If a message is updated, use a new `block_id`.', + }, + video_url: { + type: 'string', + description: + 'The URL to be embedded. Must match any existing\n{@link https://api.slack.com/reference/messaging/link-unfurling#configuring_domains unfurl domains} within the app\nand point to a HTTPS URL.', + }, + thumbnail_url: { + type: 'string', + description: 'The thumbnail image URL.', + }, + alt_text: { + type: 'string', + description: 'A tooltip for the video. Required for accessibility.', + }, + title: { + $ref: '#/definitions/PlainTextElement', + description: + 'Video title as a {@link PlainTextElement } object. `text` within must be less than 200 characters.', + }, + title_url: { + type: 'string', + description: + 'Hyperlink for the title text. Must correspond to the non-embeddable URL for the video.\nMust go to an HTTPS URL.', + }, + author_name: { + type: 'string', + description: 'Author name to be displayed. Must be less than 50 characters.', + }, + provider_name: { + type: 'string', + description: 'The originating application or domain of the video, e.g. YouTube.', + }, + provider_icon_url: { + type: 'string', + description: 'Icon for the video provider, e.g. YouTube icon.', + }, + description: { + $ref: '#/definitions/PlainTextElement', + description: 'Description for video using a {@link PlainTextElement } object.', + }, + }, + required: ['alt_text', 'thumbnail_url', 'title', 'type', 'video_url'], + additionalProperties: false, + description: + 'Displays an embedded video player. A video block is designed to embed videos in all app surfaces (e.g.\nlink unfurls, messages, modals, App Home) — anywhere you can put blocks! To use the video block within your app, you\nmust have the {@link https://api.slack.com/scopes/links.embed:write `links.embed:write` scope}.', + }, + }, + }, + }, + additionalProperties: false, +} as const satisfies Schema; + +export const slackProviderSchemas = { + output: slackOutputSchema, +}; diff --git a/packages/sdk/src/schemas/providers/email/index.ts b/packages/sdk/src/schemas/providers/email/index.ts new file mode 100644 index 00000000000..937eae9f90d --- /dev/null +++ b/packages/sdk/src/schemas/providers/email/index.ts @@ -0,0 +1,5 @@ +import { sendgridProviderSchemas } from './sendgrid'; + +export const emailProviderSchemas = { + sendgrid: sendgridProviderSchemas, +}; diff --git a/packages/sdk/src/schemas/providers/email/sendgrid.ts b/packages/sdk/src/schemas/providers/email/sendgrid.ts new file mode 100644 index 00000000000..0dc3f7795a6 --- /dev/null +++ b/packages/sdk/src/schemas/providers/email/sendgrid.ts @@ -0,0 +1,19 @@ +import { Schema } from '../../../types/schema.types'; + +/** + * Sendgrid payload schema + * + * @see https://api.slack.com/reference/messaging/payload + */ +export const sendgridOutputSchema = { + type: 'object', + properties: { + ipPoolName: { type: 'string' }, + }, + required: ['ipPoolName'], + additionalProperties: false, +} as const satisfies Schema; + +export const sendgridProviderSchemas = { + output: sendgridOutputSchema, +}; diff --git a/packages/sdk/src/schemas/providers/inApp/index.ts b/packages/sdk/src/schemas/providers/inApp/index.ts new file mode 100644 index 00000000000..64e7cbbe2ff --- /dev/null +++ b/packages/sdk/src/schemas/providers/inApp/index.ts @@ -0,0 +1 @@ +export const inAppProviderSchemas = {}; diff --git a/packages/sdk/src/schemas/providers/index.ts b/packages/sdk/src/schemas/providers/index.ts new file mode 100644 index 00000000000..028c8afb172 --- /dev/null +++ b/packages/sdk/src/schemas/providers/index.ts @@ -0,0 +1,14 @@ +import { ChannelStepEnum } from '../../constants'; +import { chatProviderSchemas } from './chat'; +import { emailProviderSchemas } from './email'; +import { inAppProviderSchemas } from './inApp'; +import { pushProviderSchemas } from './push'; +import { smsProviderSchemas } from './sms'; + +export const providerSchemas = { + chat: chatProviderSchemas, + sms: smsProviderSchemas, + email: emailProviderSchemas, + push: pushProviderSchemas, + in_app: inAppProviderSchemas, +} satisfies Record; diff --git a/packages/sdk/src/schemas/providers/push/index.ts b/packages/sdk/src/schemas/providers/push/index.ts new file mode 100644 index 00000000000..90c9b66ef3f --- /dev/null +++ b/packages/sdk/src/schemas/providers/push/index.ts @@ -0,0 +1 @@ +export const pushProviderSchemas = {}; diff --git a/packages/sdk/src/schemas/providers/sms/index.ts b/packages/sdk/src/schemas/providers/sms/index.ts new file mode 100644 index 00000000000..c4e72d1c810 --- /dev/null +++ b/packages/sdk/src/schemas/providers/sms/index.ts @@ -0,0 +1 @@ +export const smsProviderSchemas = {}; diff --git a/packages/sdk/src/schemas/steps/actions/delay.schema.ts b/packages/sdk/src/schemas/steps/actions/delay.schema.ts new file mode 100644 index 00000000000..878f1f959f7 --- /dev/null +++ b/packages/sdk/src/schemas/steps/actions/delay.schema.ts @@ -0,0 +1,23 @@ +import { Schema } from '../../../types/schema.types'; + +export const delayOutputSchema = { + type: 'object', + properties: { + amount: { type: 'number' }, + unit: { + type: 'string', + enum: ['seconds', 'minutes', 'hours', 'days', 'weeks', 'months'], + }, + }, + required: ['amount', 'unit'], + additionalProperties: false, +} as const satisfies Schema; + +export const delayResultSchema = { + type: 'object', + properties: { + duration: { type: 'number' }, + }, + required: ['duration'], + additionalProperties: false, +} as const satisfies Schema; diff --git a/packages/sdk/src/schemas/steps/actions/digest.schema.ts b/packages/sdk/src/schemas/steps/actions/digest.schema.ts new file mode 100644 index 00000000000..ae1c867fcb3 --- /dev/null +++ b/packages/sdk/src/schemas/steps/actions/digest.schema.ts @@ -0,0 +1,35 @@ +import { Schema } from '../../../types/schema.types'; + +export const digestOutputSchema = { + type: 'object', + properties: { + amount: { type: 'number' }, + unit: { + type: 'string', + enum: ['seconds', 'minutes', 'hours', 'days', 'weeks', 'months'], + }, + }, + required: ['amount', 'unit'], + additionalProperties: false, +} as const satisfies Schema; + +export const digestResultSchema = { + type: 'object', + properties: { + events: { + type: 'array', + items: { + type: 'object', + properties: { + id: { type: 'string' }, + time: { type: 'string' }, + payload: { type: 'object' }, + }, + required: ['id', 'time', 'payload'], + additionalProperties: false, + }, + }, + }, + required: ['events'], + additionalProperties: false, +} as const satisfies Schema; diff --git a/packages/sdk/src/schemas/steps/channels/chat.schema.ts b/packages/sdk/src/schemas/steps/channels/chat.schema.ts new file mode 100644 index 00000000000..57b904f92d8 --- /dev/null +++ b/packages/sdk/src/schemas/steps/channels/chat.schema.ts @@ -0,0 +1,22 @@ +import { Schema } from '../../../types/schema.types'; + +const chatOutputSchema = { + type: 'object', + properties: { + body: { type: 'string' }, + }, + required: ['body'], + additionalProperties: false, +} as const satisfies Schema; + +const chatResultSchema = { + type: 'object', + properties: {}, + required: [], + additionalProperties: false, +} as const satisfies Schema; + +export const chatChannelSchemas = { + output: chatOutputSchema, + result: chatResultSchema, +}; diff --git a/packages/sdk/src/schemas/steps/channels/email.schema.ts b/packages/sdk/src/schemas/steps/channels/email.schema.ts new file mode 100644 index 00000000000..f9f445b8e08 --- /dev/null +++ b/packages/sdk/src/schemas/steps/channels/email.schema.ts @@ -0,0 +1,23 @@ +import { Schema } from '../../../types/schema.types'; + +const emailOutputSchema = { + type: 'object', + properties: { + subject: { type: 'string' }, + body: { type: 'string' }, + }, + required: ['subject', 'body'], + additionalProperties: false, +} as const satisfies Schema; + +const emailResultSchema = { + type: 'object', + properties: {}, + required: [], + additionalProperties: false, +} as const satisfies Schema; + +export const emailChannelSchemas = { + output: emailOutputSchema, + result: emailResultSchema, +}; diff --git a/packages/sdk/src/schemas/steps/channels/in-app.schema.ts b/packages/sdk/src/schemas/steps/channels/in-app.schema.ts new file mode 100644 index 00000000000..ea33369054c --- /dev/null +++ b/packages/sdk/src/schemas/steps/channels/in-app.schema.ts @@ -0,0 +1,27 @@ +import { Schema } from '../../../types/schema.types'; + +const inAppOutputSchema = { + type: 'object', + properties: { + body: { type: 'string' }, + }, + required: ['body'], + additionalProperties: false, +} as const satisfies Schema; + +const inAppResultSchema = { + type: 'object', + properties: { + seen: { type: 'boolean' }, + read: { type: 'boolean' }, + lastSeenDate: { type: 'string', format: 'date-time', nullable: true }, + lastReadDate: { type: 'string', format: 'date-time', nullable: true }, + }, + required: ['seen', 'read', 'lastSeenDate', 'lastReadDate'], + additionalProperties: false, +} as const satisfies Schema; + +export const inAppChannelSchemas = { + output: inAppOutputSchema, + result: inAppResultSchema, +}; diff --git a/packages/sdk/src/schemas/steps/channels/index.ts b/packages/sdk/src/schemas/steps/channels/index.ts new file mode 100644 index 00000000000..1f2beb7f466 --- /dev/null +++ b/packages/sdk/src/schemas/steps/channels/index.ts @@ -0,0 +1,15 @@ +import { ChannelStepEnum } from '../../../constants'; +import { Schema } from '../../../types/schema.types'; +import { chatChannelSchemas } from './chat.schema'; +import { emailChannelSchemas } from './email.schema'; +import { inAppChannelSchemas } from './in-app.schema'; +import { pushChannelSchemas } from './push.schema'; +import { smsChannelSchemas } from './sms.schema'; + +export const channelStepSchemas = { + chat: chatChannelSchemas, + sms: smsChannelSchemas, + push: pushChannelSchemas, + email: emailChannelSchemas, + in_app: inAppChannelSchemas, +} satisfies Record; diff --git a/packages/sdk/src/schemas/steps/channels/push.schema.ts b/packages/sdk/src/schemas/steps/channels/push.schema.ts new file mode 100644 index 00000000000..5c8a3cf5ccb --- /dev/null +++ b/packages/sdk/src/schemas/steps/channels/push.schema.ts @@ -0,0 +1,23 @@ +import { Schema } from '../../../types/schema.types'; + +const pushOutputSchema = { + type: 'object', + properties: { + subject: { type: 'string' }, + body: { type: 'string' }, + }, + required: ['subject', 'body'], + additionalProperties: false, +} as const satisfies Schema; + +const pushResultSchema = { + type: 'object', + properties: {}, + required: [], + additionalProperties: false, +} as const satisfies Schema; + +export const pushChannelSchemas = { + output: pushOutputSchema, + result: pushResultSchema, +}; diff --git a/packages/sdk/src/schemas/steps/channels/sms.schema.ts b/packages/sdk/src/schemas/steps/channels/sms.schema.ts new file mode 100644 index 00000000000..3083189df0a --- /dev/null +++ b/packages/sdk/src/schemas/steps/channels/sms.schema.ts @@ -0,0 +1,22 @@ +import { Schema } from '../../../types/schema.types'; + +const smsOutputSchema = { + type: 'object', + properties: { + body: { type: 'string' }, + }, + required: ['body'], + additionalProperties: false, +} as const satisfies Schema; + +const smsResultSchema = { + type: 'object', + properties: {}, + required: [], + additionalProperties: false, +} as const satisfies Schema; + +export const smsChannelSchemas = { + output: smsOutputSchema, + result: smsResultSchema, +}; diff --git a/packages/sdk/src/schemas/steps/empty.schema.ts b/packages/sdk/src/schemas/steps/empty.schema.ts new file mode 100644 index 00000000000..324ebb09f2b --- /dev/null +++ b/packages/sdk/src/schemas/steps/empty.schema.ts @@ -0,0 +1,8 @@ +import { Schema } from '../../types/schema.types'; + +export const emptySchema = { + type: 'object', + properties: {}, + required: [], + additionalProperties: false, +} as const satisfies Schema; diff --git a/packages/sdk/src/schemas/steps/index.ts b/packages/sdk/src/schemas/steps/index.ts new file mode 100644 index 00000000000..3f301ea0140 --- /dev/null +++ b/packages/sdk/src/schemas/steps/index.ts @@ -0,0 +1,5 @@ +export * from './actions/delay.schema'; +export * from './actions/digest.schema'; +export * from './channels'; +export * from './empty.schema'; +export * from './trigger.schema'; diff --git a/packages/sdk/src/schemas/steps/trigger.schema.ts b/packages/sdk/src/schemas/steps/trigger.schema.ts new file mode 100644 index 00000000000..393583fad4b --- /dev/null +++ b/packages/sdk/src/schemas/steps/trigger.schema.ts @@ -0,0 +1,11 @@ +import { Schema } from '../../types/schema.types'; + +export const triggerSchema: Schema = { + type: 'object', + properties: { + to: { type: 'string', pattern: '/[0-9a-f]+/' }, + body: { type: 'string' }, + }, + required: ['to', 'body'], + additionalProperties: false, +}; diff --git a/packages/sdk/src/types/code.types.ts b/packages/sdk/src/types/code.types.ts new file mode 100644 index 00000000000..d165fb476d9 --- /dev/null +++ b/packages/sdk/src/types/code.types.ts @@ -0,0 +1,3 @@ +export type CodeResult = { + code: string; +}; diff --git a/packages/sdk/src/types/config.types.ts b/packages/sdk/src/types/config.types.ts new file mode 100644 index 00000000000..3190164d5dd --- /dev/null +++ b/packages/sdk/src/types/config.types.ts @@ -0,0 +1,26 @@ +export type ClientConfig = { + /** + * Specify your Novu API key, to secure your Echo API endpoint. + * Novu communicates securely with your endpoint using a signed HMAC header, + * ensuring that only trusted requests from Novu are actioned by your Echo API. + * The API key is used to sign the HMAC header. + */ + apiKey?: string; + /** + * Specify a custom Novu API URL. + * Defaults to 'https://api.novu.co' + */ + backendUrl?: string; + /** + * Explicitly bypass HMAC signature verification in dev mode. + * Setting this to `true` will enable Novu to communicate with your Echo API + * without requiring a valid HMAC signature. + * This is useful for local development and testing. + * + * You are strongly encouraged to specify an `apiKey` and set this to `false` in production, + * to ensure that only trusted requests from Novu are actioned by your Echo API. + * + * Defaults to false. + */ + devModeBypassAuthentication?: boolean; +}; diff --git a/packages/sdk/src/types/discover.types.ts b/packages/sdk/src/types/discover.types.ts new file mode 100644 index 00000000000..33945fe090b --- /dev/null +++ b/packages/sdk/src/types/discover.types.ts @@ -0,0 +1,61 @@ +import { ValidateFunction } from 'ajv'; + +import { ActionStepEnum, ChannelStepEnum } from '../constants'; +import { Schema } from './schema.types'; +import { ActionStepOptions } from './step.types'; +import { Execute, WorkflowOptions } from './workflow.types'; + +export type StepType = `${ChannelStepEnum | ActionStepEnum}`; + +export type Validate = ValidateFunction; + +export type DiscoverProviderOutput = { + type: string; + code: string; + resolve: (stepInputs: unknown) => unknown | Promise; + outputs: { + schema: Schema; + validate: Validate; + }; +}; + +export type DiscoverStepOutput = { + stepId: string; + type: StepType; + inputs: { + schema: Schema; + validate: Validate; + }; + outputs: { + schema: Schema; + validate: Validate; + }; + results: { + schema: Schema; + validate: Validate; + }; + code: string; + resolve: (stepInputs: unknown) => unknown | Promise; + providers: Array; + options: ActionStepOptions; +}; + +export type DiscoverWorkflowOutput = { + workflowId: string; + execute: Execute; + options: WorkflowOptions; + code: string; + steps: Array; + data: { + schema: Schema; + validate: Validate; + }; + inputs: { + schema: Schema; + validate: Validate; + }; +}; + +export type DiscoverOutput = { + workflows: Array; +}; diff --git a/packages/sdk/src/types/error.types.ts b/packages/sdk/src/types/error.types.ts new file mode 100644 index 00000000000..f8534178719 --- /dev/null +++ b/packages/sdk/src/types/error.types.ts @@ -0,0 +1,47 @@ +/** + * The required format for an error code. + */ +export type IErrorCodeKey = `${Uppercase}_ERROR`; +export type IErrorCodeVal = `${Capitalize}Error`; + +/** + * Helper function to test that enum keys and values match correct format. + * + * It is not possible as of Typescript 5.2 to declare a type for an enum key or value in-line. + * Therefore we must test the enum via a helper function that abstracts the enum to an object. + * + * If the test fails, you should review your `enum` to verify that + * * keys match the format specified by the `IErrorCodeKey` template literal type. + * * values match the format specified by the `IErrorCodeVal` template literal type. + * * keys are CONSTANT_CASED versions of the PascalCased values. + * ref: https://stackoverflow.com/a/58181315 + * + * @param testEnum - the Enum to type check + */ +export function testErrorCodeEnumValidity>( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + testEnum: TEnum & + Record< + Exclude, TEnum[keyof TEnum]>>, + ['Key must be CONSTANT_CASED version of the PascalCased value'] + > +): void {} + +/** + * Helper function to convert a PascalCase string to CONSTANT_CASE. + */ +type PascalToConstant = T extends `${infer First}${infer Rest}` + ? `${First extends Capitalize ? '_' : ''}${Uppercase}${PascalToConstant}` + : ''; + +/** + * Convert a PascalCase string to CONSTANT_CASE. + * + * @example + * ```ts + * type Test = PascalToConstant<"FirstName">; // "FIRST_NAME" + * ``` + */ +export type ToConstantCaseForString = PascalToConstant extends `_${infer WithoutUnderscore}` + ? WithoutUnderscore + : PascalToConstant; diff --git a/packages/sdk/src/types/errors.types.test.ts b/packages/sdk/src/types/errors.types.test.ts new file mode 100644 index 00000000000..770d0bf3b32 --- /dev/null +++ b/packages/sdk/src/types/errors.types.test.ts @@ -0,0 +1,66 @@ +import { IErrorCodeKey, IErrorCodeVal, testErrorCodeEnumValidity } from './error.types'; + +describe('Error Codes', () => { + /** + * This describe block resolves the Jest error of a test suite not having any tests. + * It has no other purpose. + */ + it('tests the Typescript compiler errors below', () => { + expect(true).toBe(true); + }); +}); + +/* eslint-disable @typescript-eslint/no-unused-vars */ +/** + * IErrorCodeKey tests + */ +// Valid +const validErrorCodeKey: IErrorCodeKey = 'SOMETHING_ERROR'; + +// @ts-expect-error - Not ending with `_ERROR` +const invalidErrorCodeKeySuffix: IErrorCodeKey = 'SOMETHING_WRONG'; + +// @ts-expect-error - Not uppercase +const invalidErrorCodeKeyCase: IErrorCodeKey = 'Something_ERROR'; + +/** + * IErrorCodeVal tests + */ +// Valid +const validErrorCodeVal: IErrorCodeVal = 'SomethingError'; + +// @ts-expect-error - Not ending with `Error` +const invalidErrorCodeValSuffix: IErrorCodeVal = 'SomethingIssue'; + +// @ts-expect-error - Not PascalCase +const invalidErrorCodeValCase: IErrorCodeVal = 'somethingError'; +/* eslint-enable @typescript-eslint/no-unused-vars */ + +/** + * testErrorCodeEnumValidity Tests + */ +enum ValidErrorCodeEnum { + SOMETHING_ERROR = 'SomethingError', + ANOTHER_THING_ERROR = 'AnotherThingError', +} +testErrorCodeEnumValidity(ValidErrorCodeEnum); + +enum InvalidKeyErrorCodeEnum { + SOMETHING_ERROR = 'SomethingError', + WRONG_FORMAT = 'WrongFormatError', +} +// @ts-expect-error - Invalid key - WRONG_FORMAT +testErrorCodeEnumValidity(InvalidKeyErrorCodeEnum); + +enum InvalidValueErrorCodeEnum { + SOMETHING_ERROR = 'SomethingError', + ANOTHER_THING_ERROR = 'AnotherThingIssue', +} +// @ts-expect-error - Invalid value on ANOTHER_THING_ERROR: 'AnotherThingIssue' +testErrorCodeEnumValidity(InvalidValueErrorCodeEnum); + +enum NonMatchingConstantCaseValueEnum { + SOMETHING_ELSE_ERROR = 'SomethingError', // The CONSTANT_CASE key does not match the PascalCase value +} +// @ts-expect-error - Key must be CONSTANT_CASED version of the PascalCased value +testErrorCodeEnumValidity(NonMatchingConstantCaseValueEnum); diff --git a/packages/sdk/src/types/execution.types.ts b/packages/sdk/src/types/execution.types.ts new file mode 100644 index 00000000000..7e8a5100017 --- /dev/null +++ b/packages/sdk/src/types/execution.types.ts @@ -0,0 +1,32 @@ +import { Subscriber } from './subscriber.types'; + +export interface IEvent { + data: Record; + workflowId: string; + stepId: string; + inputs: Record; + state: IState[]; + action: 'execute' | 'preview'; + subscriber: Subscriber; +} + +interface IState { + stepId: string; + outputs: any; + state: { status: string; error?: string }; +} + +export type ExecuteOutputMetadata = { + status: string; + error: boolean; + /** + * The duration of the step execution in milliseconds + */ + duration: number; +}; + +export type ExecuteOutput = { + outputs: unknown; + providers: unknown; + metadata: ExecuteOutputMetadata; +}; diff --git a/packages/sdk/src/types/framework.types.ts b/packages/sdk/src/types/framework.types.ts new file mode 100644 index 00000000000..b93b193b8a1 --- /dev/null +++ b/packages/sdk/src/types/framework.types.ts @@ -0,0 +1 @@ +export type SupportedFrameworkName = 'nextjs' | 'express' | 'nuxt' | 'h3'; diff --git a/packages/sdk/src/types/health-check.types.ts b/packages/sdk/src/types/health-check.types.ts new file mode 100644 index 00000000000..2c2edce96ad --- /dev/null +++ b/packages/sdk/src/types/health-check.types.ts @@ -0,0 +1,8 @@ +export type HealthCheck = { + status: 'ok' | 'error'; + version: string; + discovered: { + workflows: number; + steps: number; + }; +}; diff --git a/packages/sdk/src/types/index.ts b/packages/sdk/src/types/index.ts new file mode 100644 index 00000000000..74c28e5d963 --- /dev/null +++ b/packages/sdk/src/types/index.ts @@ -0,0 +1,10 @@ +export * from './code.types'; +export * from './config.types'; +export * from './discover.types'; +export * from './execution.types'; +export * from './framework.types'; +export * from './health-check.types'; +export * from './step.types'; +export * from './subscriber.types'; +export * from './util.types'; +export * from './workflow.types'; diff --git a/packages/sdk/src/types/provider.types.ts b/packages/sdk/src/types/provider.types.ts new file mode 100644 index 00000000000..9ebec2f4a03 --- /dev/null +++ b/packages/sdk/src/types/provider.types.ts @@ -0,0 +1,18 @@ +import { FromSchema } from 'json-schema-to-ts'; + +import { providerSchemas } from '../schemas'; + +export type Providers = { + [K in keyof (typeof providerSchemas)[T_StepType]]: (step: { + /** + * The inputs for the step. + */ + inputs: T_Input; + /** + * The outputs of the step. + */ + outputs: T_Output; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - FromSchema (json-schema-to-ts) is incorrectly typed + }) => Promise>; +}; diff --git a/packages/sdk/src/types/schema.types.ts b/packages/sdk/src/types/schema.types.ts new file mode 100644 index 00000000000..556410b56f6 --- /dev/null +++ b/packages/sdk/src/types/schema.types.ts @@ -0,0 +1,3 @@ +import { JSONSchema } from 'json-schema-to-ts'; + +export type Schema = JSONSchema; diff --git a/packages/sdk/src/types/skip.types.ts b/packages/sdk/src/types/skip.types.ts new file mode 100644 index 00000000000..9f338156591 --- /dev/null +++ b/packages/sdk/src/types/skip.types.ts @@ -0,0 +1 @@ +export type Skip = (payload: any) => boolean | Promise; diff --git a/packages/sdk/src/types/step.types.ts b/packages/sdk/src/types/step.types.ts new file mode 100644 index 00000000000..d023b0be63a --- /dev/null +++ b/packages/sdk/src/types/step.types.ts @@ -0,0 +1,200 @@ +import { FromSchema } from 'json-schema-to-ts'; + +import { ChannelStepEnum } from '../constants'; +import { delayOutputSchema, delayResultSchema, digestOutputSchema, digestResultSchema } from '../schemas'; +import { channelStepSchemas } from '../schemas/steps/channels'; +import { Providers } from './provider.types'; +import { Schema } from './schema.types'; +import { Skip } from './skip.types'; +import { MaybePromise } from './util.types'; + +// @TODO: remove the credentials, providers, and preferences from the ActionStepOptions (fix the client typings) +export type ActionStepOptions = { + skip?: Skip; + inputSchema?: Schema; + outputSchema?: Schema; + credentials?: (input: unknown) => Promise>; + providers?: Record unknown | Promise>; + preferences?: (input: unknown) => Promise>; +}; + +export enum JobStatusEnum { + PENDING = 'pending', + QUEUED = 'queued', + RUNNING = 'running', + COMPLETED = 'completed', + FAILED = 'failed', + DELAYED = 'delayed', + CANCELED = 'canceled', + MERGED = 'merged', + SKIPPED = 'skipped', +} + +type StepContext = { + /** The context of the step. */ + _ctx: { + /** The timestamp of the step. */ + timestamp: number; + /** The state of the step. */ + state: { + /** The status of the step. */ + status: `${JobStatusEnum}`; + /** A boolean flag to indicate if the step has errored. */ + error: boolean; + }; + }; +}; + +type StepOutput = Promise; + +export type ActionStep = ( + name: string, + resolve: (inputs: any) => MaybePromise, + options?: ActionStepOptions +) => StepOutput; + +export type CustomStep = < + /** + * The schema for the inputs of the step. + */ + T_InputSchema extends Schema, + /** + * The schema for the outputs of the step. + */ + T_OutputsSchema extends Schema, + /** + * The inputs for the step. + */ + T_Inputs = FromSchema, + /** + * The result for the step. + */ + T_Intermediary = FromSchema, + T_Outputs extends T_Intermediary = T_Intermediary, + T_Result extends T_Intermediary = T_Intermediary +>( + /** + * The name of the step. This is used to identify the step in the workflow. + */ + name: string, + /** + * The function to resolve the step notification content for the step. + * + * @param inputs The inputs for the step. + */ + resolve: (inputs: T_Inputs) => MaybePromise, + /** + * The options for the step. + */ + options?: { + /** + * Skip the step. If the skip function returns true, the step will be skipped. + * + * @param payload The payload for the step. + */ + skip?: (inputs: T_Inputs) => MaybePromise; + /** + * The schema for the inputs of the step. Used to validate the user-provided input from Novu Web. + */ + inputSchema?: T_InputSchema; + outputSchema?: T_OutputsSchema; + /** + * The providers for the step. Used to override the behaviour of the providers for the step. + */ + } +) => Promise; + +export type ChannelStep< + /** + * The type of channel step. + */ + T_StepType extends keyof typeof channelStepSchemas, + /** + * The outputs for the step. + */ + T_Outputs, + /** + * The result for the step. + */ + T_Result +> = < + /** + * The schema for the inputs of the step. + */ + T_InputSchema extends Schema, + /** + * The inputs for the step. + */ + T_Inputs = FromSchema +>( + /** + * The name of the step. This is used to identify the step in the workflow. + */ + name: string, + /** + * The function to resolve the step notification content for the step. + * + * @param inputs The inputs for the step. + */ + resolve: (inputs: T_Inputs) => MaybePromise, + /** + * The options for the step. + */ + options?: { + /** + * Skip the step. If the skip function returns true, the step will be skipped. + * + * @param payload The payload for the step. + */ + skip?: (inputs: T_Inputs) => MaybePromise; + /** + * The schema for the inputs of the step. Used to validate the user-provided input from Novu Web. + */ + inputSchema?: T_InputSchema; + /** + * The providers for the step. Used to override the behaviour of the providers for the step. + */ + providers?: Providers; + /* + * credentials?: (inputs: T_Inputs) => Promise>; + * preferences?: (input: T_Inputs) => Promise>; + */ + } +) => Promise; + +export type EmailOutput = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.EMAIL]['output']>; +export type EmailResult = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.EMAIL]['result']>; + +export type SmsOutput = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.SMS]['output']>; +export type SmsResult = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.SMS]['result']>; + +export type PushOutput = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.PUSH]['output']>; +export type PushResult = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.PUSH]['result']>; + +export type ChatOutput = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.CHAT]['output']>; +export type ChatResult = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.CHAT]['result']>; + +export type InAppOutput = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.IN_APP]['output']>; +export type InAppResult = FromSchema<(typeof channelStepSchemas)[ChannelStepEnum.IN_APP]['result']>; + +/** + * The step type. + */ +export type Step = { + /** Send an email. */ + email: ChannelStep; + /** Send an SMS. */ + sms: ChannelStep; + /** Send a push notification. */ + push: ChannelStep; + /** Send a chat message. */ + chat: ChannelStep; + /** Send an in-app notification. */ + inApp: ChannelStep; + /** Aggregate events for a period of time. */ + digest: ActionStep, FromSchema>; + /** Delay the workflow for a period of time. */ + delay: ActionStep, FromSchema>; + /** Execute custom code */ + custom: CustomStep; +}; diff --git a/packages/sdk/src/types/subscriber.types.ts b/packages/sdk/src/types/subscriber.types.ts new file mode 100644 index 00000000000..6c12f1771f7 --- /dev/null +++ b/packages/sdk/src/types/subscriber.types.ts @@ -0,0 +1,4 @@ +export type Subscriber = { + firstName?: string; + lastName?: string; +}; diff --git a/packages/sdk/src/types/util.types.ts b/packages/sdk/src/types/util.types.ts new file mode 100644 index 00000000000..9e6261a58a9 --- /dev/null +++ b/packages/sdk/src/types/util.types.ts @@ -0,0 +1,10 @@ +/** + * A type that represents either `A` or `B`. Shared properties retain their + * types and unique properties are marked as optional. + */ +export type Either = Partial & Partial & (A | B); + +/** + * A type that represents a value that may be a promise or a regular value. + */ +export type MaybePromise = T | Promise; diff --git a/packages/sdk/src/types/workflow.types.ts b/packages/sdk/src/types/workflow.types.ts new file mode 100644 index 00000000000..3820b859a94 --- /dev/null +++ b/packages/sdk/src/types/workflow.types.ts @@ -0,0 +1,33 @@ +import { Step } from './step.types'; +import { Subscriber } from './subscriber.types'; + +/** + * The input for the workflow function. + */ +export type ExecuteInput = { + /** Define a step in your workflow. */ + step: Step; + /** The payload for the event, provided during trigger. */ + payload: T_Payload; + /** The subscriber for the event, provided during trigger. */ + subscriber: Subscriber; + /** The environment the workflow is running in. */ + environment: Record; + /** The inputs for the event. Provided via the UI. */ + input: T_Input; +}; + +/** + * The function to execute the workflow. + */ +export type Execute = (event: ExecuteInput) => Promise; + +/** + * The options for the workflow. + */ +export type WorkflowOptions = { + /** The schema for the payload. */ + payloadSchema?: T_PayloadSchema; + /** The schema for the inputs. */ + inputSchema?: T_InputSchema; +}; diff --git a/packages/sdk/src/utils/env.utils.ts b/packages/sdk/src/utils/env.utils.ts new file mode 100644 index 00000000000..12324952591 --- /dev/null +++ b/packages/sdk/src/utils/env.utils.ts @@ -0,0 +1,7 @@ +export const getResponse = (): typeof Response => { + if (typeof Response !== 'undefined') { + return Response; + } + + return require('cross-fetch').Response; +}; diff --git a/packages/sdk/src/utils/index.ts b/packages/sdk/src/utils/index.ts new file mode 100644 index 00000000000..326c06a4e6c --- /dev/null +++ b/packages/sdk/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './env.utils'; +export * from './log.utils'; +export * from './string.utils'; diff --git a/packages/sdk/src/utils/log.utils.ts b/packages/sdk/src/utils/log.utils.ts new file mode 100644 index 00000000000..92e41513be7 --- /dev/null +++ b/packages/sdk/src/utils/log.utils.ts @@ -0,0 +1,29 @@ +import chalk from 'chalk'; + +export const log = { + info: (message: string) => chalk.blue(message), + warning: (message: string) => chalk.yellow(message), + error: (message: string) => chalk.red(message), + success: (message: string) => chalk.green(message), + underline: (message: string) => chalk.underline(message), + bold: (message: string) => chalk.bold(message), +}; +export const EMOJI = { + SUCCESS: log.success('✔'), + ERROR: log.error('✗'), + WARNING: log.warning('⚠'), + INFO: log.info('ℹ'), + ARROW: log.bold('→'), + MOCK: log.info('○'), + HYDRATED: log.bold(log.info('→')), + STEP: log.info('σ'), + ACTION: log.info('α'), + DURATION: log.info('Δ'), + PROVIDER: log.info('⚙'), + OUTPUT: log.info('⇢'), + INPUT: log.info('⇠'), + WORKFLOW: log.info('ω'), + STATE: log.info('σ'), + EXECUTE: log.info('ε'), + PREVIEW: log.info('ρ'), +}; diff --git a/packages/sdk/src/utils/string.utils.ts b/packages/sdk/src/utils/string.utils.ts new file mode 100644 index 00000000000..af6ed0cf45f --- /dev/null +++ b/packages/sdk/src/utils/string.utils.ts @@ -0,0 +1,22 @@ +/// + +export const toConstantCase = (str: string): string => + str + .replaceAll(/([a-z])([A-Z])/g, '$1_$2') + .replaceAll(/[\s-]+/g, '_') + .toUpperCase(); + +/** + * Converts an enum to a pretty string, + * wrapping the values in backticks and joining them with a comma + * @param _enum The enum + * @returns A pretty string + */ +// eslint-disable-next-line @typescript-eslint/ban-types +export const enumToPrettyString = (_enum: T): string => + Object.values(_enum) + .map((method) => `\`${method}\``) + .join(', '); + +export const toPascalCase = (str: string): string => + str.replaceAll(/(\w)(\w*)/g, (_, first, rest) => first.toUpperCase() + rest.toLowerCase()).replaceAll(/[\s-]+/g, ''); diff --git a/packages/sdk/src/version.ts b/packages/sdk/src/version.ts new file mode 100644 index 00000000000..751e9f9e19e --- /dev/null +++ b/packages/sdk/src/version.ts @@ -0,0 +1,8 @@ +// import packageJson from '../package.json' + +/** + * @TODO: Replace with the package version + * Need to figure out how to get the package version in the SDK + * export const VERSION = packageJson.version + */ +export const VERSION = '0.0.1'; diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json new file mode 100644 index 00000000000..596938287eb --- /dev/null +++ b/packages/sdk/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2019", + "module": "CommonJS", + "moduleResolution": "node", + "skipLibCheck": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "rootDir": "./src", + "outDir": "./dist", + "strictNullChecks": true + }, + "include": ["./src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/packages/sdk/tsconfig.module.json b/packages/sdk/tsconfig.module.json new file mode 100644 index 00000000000..e0169135102 --- /dev/null +++ b/packages/sdk/tsconfig.module.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "target": "esnext", + "outDir": "dist/module", + "module": "esnext", + "esModuleInterop": true, + "types": ["jest", "node"], + "typeRoots": ["./node_modules/@types", "../../node_modules/@types"] + }, + "exclude": ["node_modules/**"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c348c71fd7d..2774bf0def5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,27 +132,87 @@ importers: eslint: specifier: ^8.33.0 version: 8.38.0 + eslint-config-adjunct: + specifier: ^4.13.0 + version: 4.13.0(typescript@4.9.5) + eslint-config-airbnb-base: + specifier: ^15.0.0 + version: 15.0.0(eslint-plugin-import@2.28.1)(eslint@8.38.0) eslint-config-airbnb-typescript: specifier: ^17.1.0 version: 17.1.0(@typescript-eslint/eslint-plugin@5.58.0)(@typescript-eslint/parser@5.58.0)(eslint-plugin-import@2.28.1)(eslint@8.38.0) + eslint-config-auto: + specifier: ^0.9.0 + version: 0.9.0(typescript@4.9.5) eslint-config-prettier: specifier: ^8.6.0 version: 8.8.0(eslint@8.38.0) eslint-import-resolver-webpack: specifier: ^0.13.7 version: 0.13.7(eslint-plugin-import@2.28.1)(webpack@5.78.0) + eslint-plugin-chai-expect: + specifier: ^3.0.0 + version: 3.0.0(eslint@8.38.0) + eslint-plugin-chai-friendly: + specifier: ^0.7.4 + version: 0.7.4(eslint@8.38.0) + eslint-plugin-const-case: + specifier: ^1.2.2 + version: 1.2.2 eslint-plugin-eslint-comments: specifier: ^3.2.0 version: 3.2.0(eslint@8.38.0) eslint-plugin-functional: specifier: ^3.7.2 version: 3.7.2(eslint@8.38.0)(typescript@4.9.5) + eslint-plugin-html: + specifier: ^8.0.0 + version: 8.1.1 eslint-plugin-import: specifier: ^2.28.1 version: 2.28.1(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-webpack@0.13.7)(eslint@8.38.0) + eslint-plugin-jest: + specifier: ^27.9.0 + version: 27.9.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.38.0)(jest@27.5.1)(typescript@4.9.5) + eslint-plugin-jest-async: + specifier: ^1.0.3 + version: 1.0.3 + eslint-plugin-jest-dom: + specifier: ^5.4.0 + version: 5.4.0(eslint@8.38.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 eslint-plugin-jsx-a11y: specifier: ^6.5.1 version: 6.7.1(eslint@8.38.0) + eslint-plugin-markdown: + specifier: ^3.0.1 + version: 3.0.1(eslint@8.38.0) + eslint-plugin-mocha: + specifier: ^10.4.3 + version: 10.4.3(eslint@8.38.0) + eslint-plugin-mocha-cleanup: + specifier: ^1.11.3 + version: 1.11.3(eslint@8.38.0) + eslint-plugin-no-constructor-bind: + specifier: ^2.0.4 + version: 2.0.4 + eslint-plugin-no-secrets: + specifier: ^0.8.9 + version: 0.8.9(eslint@8.38.0) + eslint-plugin-no-unsanitized: + specifier: ^4.0.2 + version: 4.0.2(eslint@8.38.0) + eslint-plugin-no-use-extend-native: + specifier: ^0.5.0 + version: 0.5.0 + eslint-plugin-optimize-regex: + specifier: ^1.2.1 + version: 1.2.1 + eslint-plugin-pii: + specifier: ^1.0.2 + version: 1.0.2(eslint@8.38.0) eslint-plugin-prettier: specifier: ^4.2.1 version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.38.0)(prettier@2.8.7) @@ -165,9 +225,27 @@ importers: eslint-plugin-react-hooks: specifier: ^4.4.0 version: 4.6.0(eslint@8.38.0) + eslint-plugin-security: + specifier: ^2.1.1 + version: 2.1.1 + eslint-plugin-simple-import-sort: + specifier: ^12.0.0 + version: 12.1.0(eslint@8.38.0) + eslint-plugin-sonarjs: + specifier: ^0.24.0 + version: 0.24.0(eslint@8.38.0) eslint-plugin-spellcheck: specifier: 0.0.20 version: 0.0.20(eslint@8.38.0) + eslint-plugin-switch-case: + specifier: ^1.1.2 + version: 1.1.2 + eslint-plugin-unicorn: + specifier: ^51.0.1 + version: 51.0.1(eslint@8.38.0) + eslint-plugin-xss: + specifier: ^0.1.12 + version: 0.1.12 execa: specifier: ^6.1.0 version: 6.1.0 @@ -2239,7 +2317,7 @@ importers: version: 4.33.0(eslint@7.32.0)(typescript@4.9.5) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@3.2.5) ts-node: specifier: ~10.9.1 version: 10.9.1(@types/node@14.18.42)(typescript@4.9.5) @@ -3400,6 +3478,85 @@ importers: specifier: 4.9.5 version: 4.9.5 + packages/cli-next: + dependencies: + '@novu/shared': + specifier: ^0.23.1 + version: 0.23.1 + '@novu/studio': + specifier: ^0.0.1-alpha.87 + version: 0.0.1-alpha.90(@ant-design/icons@4.6.2)(@babel/core@7.24.4)(@chakra-ui/icons@2.1.1)(@chakra-ui/react@1.8.9)(@chakra-ui/system@2.6.2)(antd@4.24.8)(chakra-react-select@4.7.6)(dayjs@1.11.10)(webpack@5.78.0) + '@segment/analytics-node': + specifier: ^1.1.4 + version: 1.1.4 + axios: + specifier: ^1.6.2 + version: 1.6.7 + chalk: + specifier: 4.1.2 + version: 4.1.2 + commander: + specifier: ^9.0.0 + version: 9.5.0 + configstore: + specifier: ^5.0.0 + version: 5.0.1 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + dotenv: + specifier: ^8.2.0 + version: 8.6.0 + get-port: + specifier: ^5.1.1 + version: 5.1.1 + gradient-string: + specifier: ^2.0.0 + version: 2.0.2 + inquirer: + specifier: ^8.2.0 + version: 8.2.6 + jwt-decode: + specifier: ^3.1.2 + version: 3.1.2 + open: + specifier: ^8.4.2 + version: 8.4.2 + uuid: + specifier: ^9.0.0 + version: 9.0.1 + devDependencies: + '@types/configstore': + specifier: ^5.0.1 + version: 5.0.1 + '@types/inquirer': + specifier: ^8.2.0 + version: 8.2.10 + '@types/mocha': + specifier: 10.0.2 + version: 10.0.2 + eslint-config-adjunct: + specifier: ^4.13.0 + version: 4.13.0(typescript@4.9.5) + ncp: + specifier: ^2.0.0 + version: 2.0.0 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + rimraf: + specifier: ^5.0.5 + version: 5.0.5 + ts-node: + specifier: ~10.9.1 + version: 10.9.2(@types/node@14.18.42)(typescript@4.9.5) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 4.9.5 + version: 4.9.5 + packages/client: dependencies: '@novu/shared': @@ -4155,6 +4312,76 @@ importers: specifier: ^4.9.5 version: 4.9.5 + packages/sdk: + dependencies: + ajv: + specifier: ^8.12.0 + version: 8.12.0 + ajv-formats: + specifier: ^2.1.1 + version: 2.1.1(ajv@8.12.0) + better-ajv-errors: + specifier: ^1.2.0 + version: 1.2.0(ajv@8.12.0) + chalk: + specifier: ^4.1.2 + version: 4.1.2 + cross-fetch: + specifier: ^4.0.0 + version: 4.0.0 + h3: + specifier: ^1.11.1 + version: 1.11.1 + json-schema-faker: + specifier: ^0.5.6 + version: 0.5.6 + json-schema-to-ts: + specifier: ^3.0.0 + version: 3.1.0 + ora: + specifier: ^5.4.1 + version: 5.4.1 + devDependencies: + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/express': + specifier: ^4.17.13 + version: 4.17.17 + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/json-schema': + specifier: ^7.0.15 + version: 7.0.15 + '@types/node': + specifier: ^20.11.20 + version: 20.12.10 + '@vercel/node': + specifier: ^2.15.9 + version: 2.15.10 + express: + specifier: ^4.18.2 + version: 4.18.3 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2) + next: + specifier: ^13.5.4 + version: 13.5.6(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0) + prettier: + specifier: ^3.2.5 + version: 3.2.5 + ts-jest: + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.24.4)(jest@29.7.0)(typescript@5.4.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.12.10)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + packages/stateless: dependencies: handlebars: @@ -4667,6 +4894,22 @@ packages: - react-dom dev: false + /@ant-design/icons@4.6.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.2.1 + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + /@ant-design/icons@4.8.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==} engines: {node: '>=8'} @@ -4683,6 +4926,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@ant-design/icons@4.8.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.2.1 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@ant-design/react-slick@0.29.2(react@17.0.2): resolution: {integrity: sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==} peerDependencies: @@ -4696,6 +4955,19 @@ packages: resize-observer-polyfill: 1.5.1 dev: false + /@ant-design/react-slick@0.29.2(react@18.2.0): + resolution: {integrity: sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==} + peerDependencies: + react: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + json2mq: 0.2.0 + lodash: 4.17.21 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + dev: false + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} @@ -4768,12 +5040,12 @@ packages: parse-github-url: 1.0.2 pretty-ms: 7.0.1 requireg: 0.2.2 - semver: 7.5.4 + semver: 7.6.0 signale: 1.4.0 tapable: 2.2.1 terminal-link: 2.1.1 tinycolor2: 1.6.0 - ts-node: 10.9.1(@types/node@16.11.7)(typescript@4.9.5) + ts-node: 10.9.2(@types/node@16.11.7)(typescript@4.9.5) tslib: 2.1.0 type-fest: 0.21.3 typescript: 4.9.5 @@ -4845,7 +5117,7 @@ packages: '@auto-it/core': 10.44.0(@types/node@16.11.7)(typescript@4.9.5) fp-ts: 2.13.1 io-ts: 2.2.20(fp-ts@2.13.1) - semver: 7.5.4 + semver: 7.6.0 tslib: 1.10.0 transitivePeerDependencies: - '@swc/core' @@ -7112,7 +7384,7 @@ packages: '@azure/core-tracing': 1.0.0-preview.13 '@azure/core-util': 1.3.0 '@azure/logger': 1.0.4 - '@types/node-fetch': 2.6.5 + '@types/node-fetch': 2.6.6 '@types/tunnel': 0.0.3 form-data: 4.0.0 node-fetch: 2.7.0 @@ -7239,7 +7511,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.22.20(@babel/core@7.21.4) @@ -7262,7 +7534,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) @@ -7285,7 +7557,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.9) @@ -7549,7 +7821,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.2 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -7564,7 +7836,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.2 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -11085,7 +11357,7 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 @@ -11093,7 +11365,7 @@ packages: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.24.0 dev: true @@ -11188,6 +11460,24 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true + /@chakra-ui/accordion@1.4.12(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-Hq5Ie1SI4mmtgBmeuir+f7QKgopZEyQOojgufo/A20keMSy5Yk9WZjkXNQgvoIRl1AsoziIPUlubQOtkBZjjbA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/descendant': 2.1.4(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 1.4.8(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/accordion@1.4.12(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-Hq5Ie1SI4mmtgBmeuir+f7QKgopZEyQOojgufo/A20keMSy5Yk9WZjkXNQgvoIRl1AsoziIPUlubQOtkBZjjbA==} peerDependencies: @@ -11219,6 +11509,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/alert@1.3.7(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-fFpJYBpHOIK/BX4BVl/xafYiDBUW+Bq/gUYDOo4iAiO4vHgxo74oa+yOwSRNlNjAgIX7pi2ridsYQALKyWyxxQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/anatomy@1.3.0(@chakra-ui/system@2.6.2): resolution: {integrity: sha512-vj/lcHkCuq/dtbl69DkNsftZTnrGEegB90ODs1B6rxw8iVMdDSYkthPPFAkqzNs4ppv1y2IBjELuVzpeta1OHA==} peerDependencies: @@ -11245,6 +11548,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/avatar@1.3.11(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-/eRRK48Er92/QWAfWhxsJIN0gZBBvk+ew4Hglo+pxt3/NDnfTF2yPE7ZN29Dl6daPNbyTOpoksMwaU2mZIqLgA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/image': 1.1.10(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/breadcrumb@1.3.6(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-iXxienBO6RUnJEcDvyDWyRt+mzPyl7/b6N8i0vrjGKGLpgtayJFvIdo33tFcvx6TCy7V9hiE3HTtZnNomWdR6A==} peerDependencies: @@ -11257,6 +11573,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/breadcrumb@1.3.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-iXxienBO6RUnJEcDvyDWyRt+mzPyl7/b6N8i0vrjGKGLpgtayJFvIdo33tFcvx6TCy7V9hiE3HTtZnNomWdR6A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/breakpoint-utils@2.0.8: resolution: {integrity: sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==} dependencies: @@ -11277,6 +11605,37 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/button@1.5.10(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-IVEOrleI378CckAa3b3CTUHMPZRfpy6LPwn1Mx3sMpHEkDTKu8zJcjgEvCE8HYzNC1KbwBsa1PfTgk40ui6EtA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/spinner': 1.2.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + + /@chakra-ui/checkbox@1.7.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-9Io97yn8OrdaIynCj+3Z/neJV7lTT1MtcdYh3BKMd7WnoJDkRY/GlBM8zsdgC5Wvm+ZQ1M83t0YvRPKLLzusyA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/checkbox@1.7.1(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-9Io97yn8OrdaIynCj+3Z/neJV7lTT1MtcdYh3BKMd7WnoJDkRY/GlBM8zsdgC5Wvm+ZQ1M83t0YvRPKLLzusyA==} peerDependencies: @@ -11304,6 +11663,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/clickable@1.2.6(react@18.2.0): + resolution: {integrity: sha512-89SsrQwwwAadcl/bN8nZqqaaVhVNFdBXqQnxVy1t07DL5ezubmNb5SgFh9LDznkm9YYPQhaGr3W6HFro7iAHMg==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/clickable@2.1.0(react@17.0.2): resolution: {integrity: sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==} peerDependencies: @@ -11314,6 +11683,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/clickable@2.1.0(react@18.2.0): + resolution: {integrity: sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + react: 18.2.0 + dev: false + /@chakra-ui/close-button@1.2.7(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-cYTxfgrIlPU4IZm1sehZXxx/TNQBk9c3LBPvTpywEM8GVRGINh4YLq8WiMaPtO+TDNBnKoWS/jS4IHnR+abADw==} peerDependencies: @@ -11326,6 +11705,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/close-button@1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-cYTxfgrIlPU4IZm1sehZXxx/TNQBk9c3LBPvTpywEM8GVRGINh4YLq8WiMaPtO+TDNBnKoWS/jS4IHnR+abADw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/color-mode@1.4.8(react@17.0.2): resolution: {integrity: sha512-iD4126DVQi06c6ARr3uf3R2rtEu8aBVjW8rhZ+lOsV26Z15iCJA7OAut13Xu06fcZvgjSB/ChDy6Sx9sV9UjHA==} peerDependencies: @@ -11337,6 +11728,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/color-mode@1.4.8(react@18.2.0): + resolution: {integrity: sha512-iD4126DVQi06c6ARr3uf3R2rtEu8aBVjW8rhZ+lOsV26Z15iCJA7OAut13Xu06fcZvgjSB/ChDy6Sx9sV9UjHA==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-env': 1.1.6(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/color-mode@2.2.0(react@17.0.2): resolution: {integrity: sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==} peerDependencies: @@ -11346,6 +11748,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/color-mode@2.2.0(react@18.2.0): + resolution: {integrity: sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/control-box@1.1.6(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-EUcq5f854puG6ZA6wAWl4107OPl8+bj4MMHJCa48BB0qec0U8HCEtxQGnFwJmaYLalIAjMfHuY3OwO2A3Hi9hA==} peerDependencies: @@ -11357,6 +11768,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/control-box@1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-EUcq5f854puG6ZA6wAWl4107OPl8+bj4MMHJCa48BB0qec0U8HCEtxQGnFwJmaYLalIAjMfHuY3OwO2A3Hi9hA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/counter@1.2.10(react@17.0.2): resolution: {integrity: sha512-HQd09IuJ4z8M8vWajH+99jBWWSHDesQZmnN95jUg3HKOuNleLaipf2JFdrqbO1uWQyHobn2PM6u+B+JCAh2nig==} peerDependencies: @@ -11367,6 +11789,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/counter@1.2.10(react@18.2.0): + resolution: {integrity: sha512-HQd09IuJ4z8M8vWajH+99jBWWSHDesQZmnN95jUg3HKOuNleLaipf2JFdrqbO1uWQyHobn2PM6u+B+JCAh2nig==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/css-reset@1.1.3(@emotion/react@11.10.6)(react@17.0.2): resolution: {integrity: sha512-AgfrE7bRTJvNi/4zIfacI/kBHmHmHEIeQtHwCvk/0qM9V2gK1VM3ctYlnibf7BTh17F/UszweOGRb1lHSPfWjw==} peerDependencies: @@ -11377,6 +11809,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/css-reset@1.1.3(@emotion/react@11.10.6)(react@18.2.0): + resolution: {integrity: sha512-AgfrE7bRTJvNi/4zIfacI/kBHmHmHEIeQtHwCvk/0qM9V2gK1VM3ctYlnibf7BTh17F/UszweOGRb1lHSPfWjw==} + peerDependencies: + '@emotion/react': '>=10.0.35' + react: '>=16.8.6' + dependencies: + '@emotion/react': 11.10.6(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/descendant@2.1.4(react@17.0.2): resolution: {integrity: sha512-k1olHM6c0fcI5fQxO9rqg9rxripcfHMEm2LkORgH0CAzFn/U75CxCw5ec0IMedNWCdiv740enVfnfhBAoSg7gw==} peerDependencies: @@ -11386,6 +11828,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/descendant@2.1.4(react@18.2.0): + resolution: {integrity: sha512-k1olHM6c0fcI5fQxO9rqg9rxripcfHMEm2LkORgH0CAzFn/U75CxCw5ec0IMedNWCdiv740enVfnfhBAoSg7gw==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/descendant@3.1.0(react@17.0.2): resolution: {integrity: sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==} peerDependencies: @@ -11396,6 +11847,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/descendant@3.1.0(react@18.2.0): + resolution: {integrity: sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/dom-utils@2.1.0: resolution: {integrity: sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==} dev: false @@ -11413,6 +11874,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/editable@1.4.2(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-a5zKghA/IvG7yNkmFl7Z9c2KSsf0FgyijsNPTg/4S5jxyz13QJtoTg40tdpyaxHHCT25y25iUcV4FYCj6Jd01w==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/focus-lock@1.2.6(@types/react@17.0.62)(react@17.0.2): resolution: {integrity: sha512-ZJNE1oNdUM1aGWuCJ+bxFa/d3EwxzfMWzTKzSvKDK50GWoUQQ10xFTT9nY/yFpkcwhBvx1KavxKf44mIhIbSog==} peerDependencies: @@ -11425,6 +11899,18 @@ packages: - '@types/react' dev: false + /@chakra-ui/focus-lock@1.2.6(react@18.2.0): + resolution: {integrity: sha512-ZJNE1oNdUM1aGWuCJ+bxFa/d3EwxzfMWzTKzSvKDK50GWoUQQ10xFTT9nY/yFpkcwhBvx1KavxKf44mIhIbSog==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + react-focus-lock: 2.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /@chakra-ui/form-control@1.6.0(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-MtUE98aocP2QTgvyyJ/ABuG33mhT3Ox56phKreG3HzbUKByMwrbQSm1QcAgyYdqSZ9eKB2tXx+qgGNh+avAfDA==} peerDependencies: @@ -11439,6 +11925,20 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/form-control@1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-MtUE98aocP2QTgvyyJ/ABuG33mhT3Ox56phKreG3HzbUKByMwrbQSm1QcAgyYdqSZ9eKB2tXx+qgGNh+avAfDA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/form-control@2.2.0(@chakra-ui/system@2.6.2)(react@17.0.2): resolution: {integrity: sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==} peerDependencies: @@ -11454,6 +11954,21 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/form-control@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/hooks@1.9.1(react@17.0.2): resolution: {integrity: sha512-SEeh1alDKzrP9gMLWMnXOUDBQDKF/URL6iTmkumTn6vhawWNla6sPrcMyoCzWdMzwUhZp3QNtCKbUm7dxBXvPw==} peerDependencies: @@ -11466,6 +11981,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/hooks@1.9.1(react@18.2.0): + resolution: {integrity: sha512-SEeh1alDKzrP9gMLWMnXOUDBQDKF/URL6iTmkumTn6vhawWNla6sPrcMyoCzWdMzwUhZp3QNtCKbUm7dxBXvPw==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + compute-scroll-into-view: 1.0.14 + copy-to-clipboard: 3.3.1 + react: 18.2.0 + dev: false + /@chakra-ui/icon@2.0.5(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-ZrqRvCCIxGr4qFd/r1pmtd9tobRmv8KAxV7ygFoc/t4vOSKTcVIjhE12gsI3FzgvXM15ZFVwsxa1zodwgo5neQ==} peerDependencies: @@ -11477,6 +12004,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/icon@2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-ZrqRvCCIxGr4qFd/r1pmtd9tobRmv8KAxV7ygFoc/t4vOSKTcVIjhE12gsI3FzgvXM15ZFVwsxa1zodwgo5neQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/icon@3.2.0(@chakra-ui/system@2.6.2)(react@17.0.2): resolution: {integrity: sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==} peerDependencies: @@ -11488,6 +12026,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/icon@3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/icons@2.1.1(@chakra-ui/system@2.6.2)(react@17.0.2): resolution: {integrity: sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g==} peerDependencies: @@ -11499,6 +12048,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/icons@2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/image@1.1.10(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-PJZmhQ/R1PgdMyCRjALfoyq1FNh/WzMAw70sliHLtLcb9hBXniwQZuckYfUshCkUoFBj/ow9d4byn9Culdpk7Q==} peerDependencies: @@ -11511,6 +12071,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/image@1.1.10(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-PJZmhQ/R1PgdMyCRjALfoyq1FNh/WzMAw70sliHLtLcb9hBXniwQZuckYfUshCkUoFBj/ow9d4byn9Culdpk7Q==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/input@1.4.6(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-Ljy/NbOhh9cNQxKTWQRsT4aQiXs2vVya+Cj5NpMAz08NFFjPZovsTawhI7m6ejT5Vsh76QYjh2rOLLI3fWqQQw==} peerDependencies: @@ -11524,6 +12096,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/input@1.4.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-Ljy/NbOhh9cNQxKTWQRsT4aQiXs2vVya+Cj5NpMAz08NFFjPZovsTawhI7m6ejT5Vsh76QYjh2rOLLI3fWqQQw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/layout@1.8.0(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-GJtEKez5AZu0XQTxI6a6jwA/hMDD36pP0HBxBOGuHP1hWCebDzMjraiMfWiP9w7hKERFE4j19kocHxIXyocfJA==} peerDependencies: @@ -11537,6 +12122,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/layout@1.8.0(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-GJtEKez5AZu0XQTxI6a6jwA/hMDD36pP0HBxBOGuHP1hWCebDzMjraiMfWiP9w7hKERFE4j19kocHxIXyocfJA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/layout@2.3.1(@chakra-ui/system@2.6.2)(react@17.0.2): resolution: {integrity: sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==} peerDependencies: @@ -11553,6 +12151,22 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/layout@2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/breakpoint-utils': 2.0.8 + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/object-utils': 2.1.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/lazy-utils@2.0.5: resolution: {integrity: sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==} dev: false @@ -11566,6 +12180,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/live-region@1.1.6(react@18.2.0): + resolution: {integrity: sha512-9gPQHXf7oW0jXyT5R/JzyDMfJ3hF70TqhN8bRH4fMyfNr2Se+SjztMBqCrv5FS5rPjcCeua+e0eArpoB3ROuWQ==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/media-query@2.0.4(@chakra-ui/system@1.12.1)(@chakra-ui/theme@1.14.1)(react@17.0.2): resolution: {integrity: sha512-kn6g/L0IFFUHz2v4yiCsBnhg9jUeA7525Z+AWl+BPtvryi7i9J+AJ27y/QAge7vUGy4dwDeFyxOZTs2oZ9/BsA==} peerDependencies: @@ -11580,6 +12203,20 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/media-query@2.0.4(@chakra-ui/system@1.12.1)(@chakra-ui/theme@1.14.1)(react@18.2.0): + resolution: {integrity: sha512-kn6g/L0IFFUHz2v4yiCsBnhg9jUeA7525Z+AWl+BPtvryi7i9J+AJ27y/QAge7vUGy4dwDeFyxOZTs2oZ9/BsA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + '@chakra-ui/theme': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-env': 1.1.6(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/theme': 1.14.1(@chakra-ui/system@1.12.1) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.2)(react@17.0.2): resolution: {integrity: sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==} peerDependencies: @@ -11593,6 +12230,38 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/breakpoint-utils': 2.0.8 + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/menu@1.8.12(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-X/s74VpOReQW4fCRCa21f/VOe++cXhPz2Sh7pDjtaT3zmKjrJwgk1Kw75cXfNX1eke6hf/wZ0FGweu/m7+C3OA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/clickable': 1.2.6(react@18.2.0) + '@chakra-ui/descendant': 2.1.4(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/popper': 2.4.3(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 1.4.8(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/menu@1.8.12(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-X/s74VpOReQW4fCRCa21f/VOe++cXhPz2Sh7pDjtaT3zmKjrJwgk1Kw75cXfNX1eke6hf/wZ0FGweu/m7+C3OA==} peerDependencies: @@ -11612,6 +12281,33 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/clickable': 2.1.0(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/lazy-utils': 2.0.5 + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-outside-click': 2.2.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@11.1.9)(react@18.2.0) + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==} peerDependencies: @@ -11664,6 +12360,31 @@ packages: - '@types/react' dev: false + /@chakra-ui/modal@1.11.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B2BBDonHb04vbPLAWgko1JYBwgW8ZNSLyhTJK+rbrCsRSgazuLTcwq4hdyJqrYNWtaQEfSwpAXqJ7joMZdv59A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/close-button': 1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/focus-lock': 1.2.6(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/portal': 1.3.10(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 1.4.8(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + aria-hidden: 1.2.3 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.4.1(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /@chakra-ui/number-input@1.4.7(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-LorGRZFMipom8vCUEbLi2s7bTHF2Fgiu766W0jTbzMje+8Z1ZoRQunH9OZWQnxnWQTUfUM2KBW8KwToYh1ojfQ==} peerDependencies: @@ -11680,6 +12401,22 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/number-input@1.4.7(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-LorGRZFMipom8vCUEbLi2s7bTHF2Fgiu766W0jTbzMje+8Z1ZoRQunH9OZWQnxnWQTUfUM2KBW8KwToYh1ojfQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/counter': 1.2.10(react@18.2.0) + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/object-utils@2.1.0: resolution: {integrity: sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==} dev: false @@ -11698,6 +12435,37 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/pin-input@1.7.11(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-KEVUHHmf22tI4F7gzT9+pHi4E5cCyte6M8rPEwRyuc0kUBo48D8OW0BJwGdESWOKMkQXazDF6Zg4o32t45tbpg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/descendant': 2.1.4(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + + /@chakra-ui/popover@1.11.9(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-hJ1/Lwukox3ryTN7W1wnj+nE44utfLwQYvfUSdatt5dznnh8k0P6Wx7Hmjm1cYffRavBhqzwua/QZDWjJN9N0g==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/close-button': 1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/popper': 2.4.3(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/popover@1.11.9(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-hJ1/Lwukox3ryTN7W1wnj+nE44utfLwQYvfUSdatt5dznnh8k0P6Wx7Hmjm1cYffRavBhqzwua/QZDWjJN9N0g==} peerDependencies: @@ -11725,6 +12493,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/popper@2.4.3(react@18.2.0): + resolution: {integrity: sha512-TGzFnYt3mtIVkIejtYIAu4Ka9DaYLzMR4NgcqI6EtaTvgK7Xep+6RTiY/Nq+ZT3l/eaNUwqHRFoNrDUg1XYasA==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@popperjs/core': 2.11.7 + react: 18.2.0 + dev: false + /@chakra-ui/popper@3.1.0(react@17.0.2): resolution: {integrity: sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==} peerDependencies: @@ -11736,6 +12514,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/popper@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@popperjs/core': 2.11.7 + react: 18.2.0 + dev: false + /@chakra-ui/portal@1.3.10(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-t2KQ6MXbyf1qFYxWw/bs//CnwD+Clq7mbsP1Y7g+THCz2FvlLlMj45BWocLB30NoNyA8WCS2zyMBszW2/qvDiA==} peerDependencies: @@ -11749,6 +12538,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@chakra-ui/portal@1.3.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-t2KQ6MXbyf1qFYxWw/bs//CnwD+Clq7mbsP1Y7g+THCz2FvlLlMj45BWocLB30NoNyA8WCS2zyMBszW2/qvDiA==} + peerDependencies: + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@chakra-ui/progress@1.2.6(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-thaHRIYTVktgV78vJMNwzfCX+ickhSpn2bun6FtGVUphFx4tjV+ggz+IGohm6AH2hapskoR1mQU2iNZb6BK0hQ==} peerDependencies: @@ -11761,6 +12563,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/progress@1.2.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-thaHRIYTVktgV78vJMNwzfCX+ickhSpn2bun6FtGVUphFx4tjV+ggz+IGohm6AH2hapskoR1mQU2iNZb6BK0hQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/theme-tools': 1.3.6(@chakra-ui/system@1.12.1) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/provider@1.7.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-FCA33CZy/jFzExglKMioeri8sr9NtDTcNVPnx95ZJiA7WpfFo0xuZ6/fMC4DwIQPkJKbSIZBXYLZ3U10Ntylrw==} peerDependencies: @@ -11781,6 +12595,26 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@chakra-ui/provider@1.7.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FCA33CZy/jFzExglKMioeri8sr9NtDTcNVPnx95ZJiA7WpfFo0xuZ6/fMC4DwIQPkJKbSIZBXYLZ3U10Ntylrw==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/css-reset': 1.1.3(@emotion/react@11.10.6)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/portal': 1.3.10(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-env': 1.1.6(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@emotion/react': 11.10.6(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@chakra-ui/radio@1.5.1(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-zO5eShz+j68A7935jJ2q5u3brX/bjPEGh9Pj2+bnKbmC9Vva6jEzBSJsAx9n4WbkAzR3xDMGWsbpivFp8X1tJw==} peerDependencies: @@ -11796,6 +12630,21 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/radio@1.5.1(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-zO5eShz+j68A7935jJ2q5u3brX/bjPEGh9Pj2+bnKbmC9Vva6jEzBSJsAx9n4WbkAzR3xDMGWsbpivFp8X1tJw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-children-utils@2.0.6(react@17.0.2): resolution: {integrity: sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==} peerDependencies: @@ -11804,6 +12653,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-children-utils@2.0.6(react@18.2.0): + resolution: {integrity: sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-context@2.1.0(react@17.0.2): resolution: {integrity: sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==} peerDependencies: @@ -11812,6 +12669,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-context@2.1.0(react@18.2.0): + resolution: {integrity: sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-env@1.1.6(react@17.0.2): resolution: {integrity: sha512-L90LNvCfe04FTkN9OPok/o2e60zLJNBH8Im/5dUHvqy7dXLXok8ZDad5vEL46XmGbhe7O8fbxhG6FmAYdcCHrQ==} peerDependencies: @@ -11821,6 +12686,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-env@1.1.6(react@18.2.0): + resolution: {integrity: sha512-L90LNvCfe04FTkN9OPok/o2e60zLJNBH8Im/5dUHvqy7dXLXok8ZDad5vEL46XmGbhe7O8fbxhG6FmAYdcCHrQ==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/react-env@3.1.0(react@17.0.2): resolution: {integrity: sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==} peerDependencies: @@ -11830,6 +12704,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-env@3.1.0(react@18.2.0): + resolution: {integrity: sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-types@2.0.7(react@17.0.2): resolution: {integrity: sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==} peerDependencies: @@ -11838,6 +12721,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-types@2.0.7(react@18.2.0): + resolution: {integrity: sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-use-animation-state@2.1.0(react@17.0.2): resolution: {integrity: sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==} peerDependencies: @@ -11848,6 +12739,16 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-animation-state@2.1.0(react@18.2.0): + resolution: {integrity: sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-use-callback-ref@2.1.0(react@17.0.2): resolution: {integrity: sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==} peerDependencies: @@ -11856,6 +12757,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-callback-ref@2.1.0(react@18.2.0): + resolution: {integrity: sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-use-controllable-state@2.1.0(react@17.0.2): resolution: {integrity: sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==} peerDependencies: @@ -11865,6 +12774,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-controllable-state@2.1.0(react@18.2.0): + resolution: {integrity: sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-use-disclosure@2.1.0(react@17.0.2): resolution: {integrity: sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==} peerDependencies: @@ -11874,6 +12792,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-disclosure@2.1.0(react@18.2.0): + resolution: {integrity: sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-use-event-listener@2.1.0(react@17.0.2): resolution: {integrity: sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==} peerDependencies: @@ -11883,6 +12810,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-event-listener@2.1.0(react@18.2.0): + resolution: {integrity: sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-use-focus-effect@2.1.0(react@17.0.2): resolution: {integrity: sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==} peerDependencies: @@ -11895,6 +12831,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-focus-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-use-merge-refs@2.1.0(react@17.0.2): resolution: {integrity: sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==} peerDependencies: @@ -11903,6 +12851,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-merge-refs@2.1.0(react@18.2.0): + resolution: {integrity: sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-use-outside-click@2.2.0(react@17.0.2): resolution: {integrity: sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==} peerDependencies: @@ -11912,6 +12868,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-outside-click@2.2.0(react@18.2.0): + resolution: {integrity: sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/react-use-safe-layout-effect@2.1.0(react@17.0.2): resolution: {integrity: sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==} peerDependencies: @@ -11920,6 +12885,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-use-update-effect@2.1.0(react@17.0.2): resolution: {integrity: sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==} peerDependencies: @@ -11928,6 +12901,14 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-use-update-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + /@chakra-ui/react-utils@1.2.3(react@17.0.2): resolution: {integrity: sha512-r8pUwCVVB7UPhb0AiRa9ZzSp4xkMz64yIeJ4O4aGy4WMw7TRH4j4QkbkE1YC9tQitrXrliOlvx4WWJR4VyiGpw==} peerDependencies: @@ -11937,6 +12918,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-utils@1.2.3(react@18.2.0): + resolution: {integrity: sha512-r8pUwCVVB7UPhb0AiRa9ZzSp4xkMz64yIeJ4O4aGy4WMw7TRH4j4QkbkE1YC9tQitrXrliOlvx4WWJR4VyiGpw==} + peerDependencies: + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/react-utils@2.0.12(react@17.0.2): resolution: {integrity: sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==} peerDependencies: @@ -11946,6 +12936,15 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/react-utils@2.0.12(react@18.2.0): + resolution: {integrity: sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/utils': 2.0.15 + react: 18.2.0 + dev: false + /@chakra-ui/react@1.8.9(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@17.0.62)(framer-motion@5.6.0)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-NfR5XKVqEWhchFLiWaTWkWeYZJK1SNF2O6sQxFVrX6M+nAgJ3Q9tfMk6/I3II+xc4hXJUcYmUvmw37vT92yMaQ==} peerDependencies: @@ -12011,6 +13010,71 @@ packages: - '@types/react' dev: false + /@chakra-ui/react@1.8.9(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NfR5XKVqEWhchFLiWaTWkWeYZJK1SNF2O6sQxFVrX6M+nAgJ3Q9tfMk6/I3II+xc4hXJUcYmUvmw37vT92yMaQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/accordion': 1.4.12(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/alert': 1.3.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/avatar': 1.3.11(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/breadcrumb': 1.3.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/button': 1.5.10(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/checkbox': 1.7.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/close-button': 1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/control-box': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/counter': 1.2.10(react@18.2.0) + '@chakra-ui/css-reset': 1.1.3(@emotion/react@11.10.6)(react@18.2.0) + '@chakra-ui/editable': 1.4.2(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/image': 1.1.10(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/input': 1.4.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/layout': 1.8.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/live-region': 1.1.6(react@18.2.0) + '@chakra-ui/media-query': 2.0.4(@chakra-ui/system@1.12.1)(@chakra-ui/theme@1.14.1)(react@18.2.0) + '@chakra-ui/menu': 1.8.12(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/modal': 1.11.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/number-input': 1.4.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/pin-input': 1.7.11(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/popover': 1.11.9(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/popper': 2.4.3(react@18.2.0) + '@chakra-ui/portal': 1.3.10(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/progress': 1.2.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/provider': 1.7.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/radio': 1.5.1(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/react-env': 1.1.6(react@18.2.0) + '@chakra-ui/select': 1.2.11(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/skeleton': 1.2.14(@chakra-ui/theme@1.14.1)(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/slider': 1.5.11(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/spinner': 1.2.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/stat': 1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/switch': 1.3.10(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/table': 1.3.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/tabs': 1.6.11(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/tag': 1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/textarea': 1.2.11(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/theme': 1.14.1(@chakra-ui/system@1.12.1) + '@chakra-ui/toast': 1.5.9(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 1.5.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 1.4.8(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + '@emotion/react': 11.10.6(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(react@18.2.0) + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /@chakra-ui/select@1.2.11(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-6Tis1+ZrRjQeWhQfziQn3ZdPphV5ccafpZOhiPdTcM2J1XcXOlII+9rHxvaW+jx7zQ5ly5o8kd7iXzalDgl5wA==} peerDependencies: @@ -12023,6 +13087,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/select@1.2.11(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-6Tis1+ZrRjQeWhQfziQn3ZdPphV5ccafpZOhiPdTcM2J1XcXOlII+9rHxvaW+jx7zQ5ly5o8kd7iXzalDgl5wA==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/shared-utils@2.0.5: resolution: {integrity: sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==} dev: false @@ -12045,6 +13121,24 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/skeleton@1.2.14(@chakra-ui/theme@1.14.1)(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0): + resolution: {integrity: sha512-R0v4DfQ2yjXCJf9SzhTmDb2PLx5//LxsRbjjgRa8qJCR4MZaGswPrekp4dP8YjY8aEYzuZbvHU12T3vqZBk2GA==} + peerDependencies: + '@chakra-ui/theme': '>=1.0.0' + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/media-query': 2.0.4(@chakra-ui/system@1.12.1)(@chakra-ui/theme@1.14.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/theme': 1.14.1(@chakra-ui/system@1.12.1) + '@chakra-ui/utils': 1.10.4 + '@emotion/react': 11.10.6(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/slider@1.5.11(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-THkGU2BsA6XMosXcEVQkWVRftqUIAKCb+y4iEpR3C2ztqL7Fl/CbIGwyr5majhPhKc275rb8dfxwp8R0L0ZIiQ==} peerDependencies: @@ -12058,6 +13152,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/slider@1.5.11(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-THkGU2BsA6XMosXcEVQkWVRftqUIAKCb+y4iEpR3C2ztqL7Fl/CbIGwyr5majhPhKc275rb8dfxwp8R0L0ZIiQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/spinner@1.2.6(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-GoUCccN120fGRVgUtfuwcEjeoaxffB+XsgpxX7jhWloXf8b6lkqm68bsxX4Ybb2vGN1fANI98/45JmrnddZO/A==} peerDependencies: @@ -12070,6 +13177,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/spinner@1.2.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-GoUCccN120fGRVgUtfuwcEjeoaxffB+XsgpxX7jhWloXf8b6lkqm68bsxX4Ybb2vGN1fANI98/45JmrnddZO/A==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.2)(react@17.0.2): resolution: {integrity: sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==} peerDependencies: @@ -12081,6 +13200,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/stat@1.2.7(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-m76jumFW1N+mCG4ytrUz9Mh09nZtS4OQcADEvOslfdI5StwwuzasTA1tueaelPzdhBioMwFUWL05Fr1fXbPJ/Q==} peerDependencies: @@ -12094,6 +13224,19 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/stat@1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-m76jumFW1N+mCG4ytrUz9Mh09nZtS4OQcADEvOslfdI5StwwuzasTA1tueaelPzdhBioMwFUWL05Fr1fXbPJ/Q==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/styled-system@1.19.0: resolution: {integrity: sha512-z+bMfWs6jQGkpgarge1kmk78DuDhJIXRUMyRqZ3+CiIkze88bIIsww6mV2i8tEfUfTAvALeMnlYZ1DYsHsTTJw==} dependencies: @@ -12109,6 +13252,20 @@ packages: lodash.mergewith: 4.6.2 dev: false + /@chakra-ui/switch@1.3.10(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-V6qDLY6oECCbPyu7alWWOAhSBI4+SAuT6XW/zEQbelkwuUOiGO1ax67rTXOmZ59A2AaV1gqQFxDh8AcbvwO5XQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/checkbox': 1.7.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/switch@1.3.10(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-V6qDLY6oECCbPyu7alWWOAhSBI4+SAuT6XW/zEQbelkwuUOiGO1ax67rTXOmZ59A2AaV1gqQFxDh8AcbvwO5XQ==} peerDependencies: @@ -12140,6 +13297,23 @@ packages: react-fast-compare: 3.2.0 dev: false + /@chakra-ui/system@1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0): + resolution: {integrity: sha512-Rp09/rMuPA3hF38OJxeQciGO9N0Ie1GxwHRAw1AFA/TY3fVyK9pNI5oN+J/1cAxq7v9yKdIr1YfnruJTI9xfEg==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=16.8.6' + dependencies: + '@chakra-ui/color-mode': 1.4.8(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/styled-system': 1.19.0 + '@chakra-ui/utils': 1.10.4 + '@emotion/react': 11.10.6(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(react@18.2.0) + react: 18.2.0 + react-fast-compare: 3.2.0 + dev: false + /@chakra-ui/system@2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@17.0.2): resolution: {integrity: sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==} peerDependencies: @@ -12159,6 +13333,25 @@ packages: react-fast-compare: 3.2.2 dev: false + /@chakra-ui/system@2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0): + resolution: {integrity: sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=18' + dependencies: + '@chakra-ui/color-mode': 2.2.0(react@18.2.0) + '@chakra-ui/object-utils': 2.1.0 + '@chakra-ui/react-utils': 2.0.12(react@18.2.0) + '@chakra-ui/styled-system': 2.9.2 + '@chakra-ui/theme-utils': 2.0.21 + '@chakra-ui/utils': 2.0.15 + '@emotion/react': 11.10.6(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(react@18.2.0) + react: 18.2.0 + react-fast-compare: 3.2.2 + dev: false + /@chakra-ui/table@1.3.6(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-7agZAgAeDFKviqStvixqnLAH54+setzhx67EztioZTr5Xu+6hQ4rotfJbu8L4i587pcbNg98kCEXEkidjw0XRQ==} peerDependencies: @@ -12170,6 +13363,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/table@1.3.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-7agZAgAeDFKviqStvixqnLAH54+setzhx67EztioZTr5Xu+6hQ4rotfJbu8L4i587pcbNg98kCEXEkidjw0XRQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/tabs@1.6.11(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-hGs2REEVVWyfgs+qEkPiUsNnqwv3QwXfKYyXaMnGS7CCkGgUiEvIO7n9968/KGnGbM4GuEHX+BxG2suIUf24yg==} peerDependencies: @@ -12185,6 +13389,21 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/tabs@1.6.11(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-hGs2REEVVWyfgs+qEkPiUsNnqwv3QwXfKYyXaMnGS7CCkGgUiEvIO7n9968/KGnGbM4GuEHX+BxG2suIUf24yg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/clickable': 1.2.6(react@18.2.0) + '@chakra-ui/descendant': 2.1.4(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/tag@1.2.7(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-RKrKOol4i/CnpFfo3T9LMm1abaqM+5Bs0soQLbo1iJBbBACY09sWXrQYvveQ2GYzU/OrAUloHqqmKjyVGOlNtg==} peerDependencies: @@ -12197,6 +13416,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/tag@1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-RKrKOol4i/CnpFfo3T9LMm1abaqM+5Bs0soQLbo1iJBbBACY09sWXrQYvveQ2GYzU/OrAUloHqqmKjyVGOlNtg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/icon': 2.0.5(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/textarea@1.2.11(@chakra-ui/system@1.12.1)(react@17.0.2): resolution: {integrity: sha512-RDWbMyC87/AFRX98EnVum5eig/7hhcvS1BrqW5lvmTgrpr7KVr80Dfa8hUj58Iq37Z7AqZijDPkBn/zg7bPdIg==} peerDependencies: @@ -12209,6 +13440,18 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/textarea@1.2.11(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-RDWbMyC87/AFRX98EnVum5eig/7hhcvS1BrqW5lvmTgrpr7KVr80Dfa8hUj58Iq37Z7AqZijDPkBn/zg7bPdIg==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/form-control': 1.6.0(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@chakra-ui/theme-tools@1.3.6(@chakra-ui/system@1.12.1): resolution: {integrity: sha512-Wxz3XSJhPCU6OwCHEyH44EegEDQHwvlsx+KDkUDGevOjUU88YuNqOVkKtgTpgMLNQcsrYZ93oPWZUJqqCVNRew==} peerDependencies: @@ -12282,6 +13525,27 @@ packages: '@chakra-ui/theme-tools': 2.1.2(@chakra-ui/styled-system@2.9.2) dev: false + /@chakra-ui/toast@1.5.9(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rns04bGdMcG7Ijg45L+PfuEW4rCd0Ycraix4EJQhcl9RXI18G9sphmlp9feidhZAkI6Ukafq1YvyvkBfkKnIzQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/alert': 1.3.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/close-button': 1.2.7(@chakra-ui/system@1.12.1)(react@18.2.0) + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/theme': 1.14.1(@chakra-ui/system@1.12.1) + '@chakra-ui/transition': 1.4.8(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@reach/alert': 0.13.2(react-dom@18.2.0)(react@18.2.0) + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@chakra-ui/toast@1.5.9(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-rns04bGdMcG7Ijg45L+PfuEW4rCd0Ycraix4EJQhcl9RXI18G9sphmlp9feidhZAkI6Ukafq1YvyvkBfkKnIzQ==} peerDependencies: @@ -12303,6 +13567,26 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@chakra-ui/tooltip@1.5.1(@chakra-ui/system@1.12.1)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EUAlDdlCBt63VpEVtj/RkFjHQVN/xA9gEAumngQdi1Sp+OXPYCBM9GwSY0NwrM1RfKBnhPSH9wz7FwredJWeaw==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + react-dom: '>=16.8.6' + dependencies: + '@chakra-ui/hooks': 1.9.1(react@18.2.0) + '@chakra-ui/popper': 2.4.3(react@18.2.0) + '@chakra-ui/portal': 1.3.10(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-utils': 1.2.3(react@18.2.0) + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + '@chakra-ui/visually-hidden': 1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0) + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@chakra-ui/tooltip@1.5.1(@chakra-ui/system@1.12.1)(framer-motion@5.6.0)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-EUAlDdlCBt63VpEVtj/RkFjHQVN/xA9gEAumngQdi1Sp+OXPYCBM9GwSY0NwrM1RfKBnhPSH9wz7FwredJWeaw==} peerDependencies: @@ -12323,6 +13607,17 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@chakra-ui/transition@1.4.8(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-5uc8LEuCH7+0h++wqAav/EktTHOjbLDSTXQlU9fzPIlNNgyf2eXrHVN2AGMGKiMR9Z4gS7umQjZ54r0w/mZ/Fw==} + peerDependencies: + framer-motion: 3.x || 4.x || 5.x || 6.x + react: '>=16.8.6' + dependencies: + '@chakra-ui/utils': 1.10.4 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/transition@1.4.8(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-5uc8LEuCH7+0h++wqAav/EktTHOjbLDSTXQlU9fzPIlNNgyf2eXrHVN2AGMGKiMR9Z4gS7umQjZ54r0w/mZ/Fw==} peerDependencies: @@ -12334,6 +13629,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/transition@2.1.0(framer-motion@11.1.9)(react@18.2.0): + resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + /@chakra-ui/transition@2.1.0(framer-motion@5.6.0)(react@17.0.2): resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} peerDependencies: @@ -12374,6 +13680,17 @@ packages: react: 17.0.2 dev: false + /@chakra-ui/visually-hidden@1.1.6(@chakra-ui/system@1.12.1)(react@18.2.0): + resolution: {integrity: sha512-Xzy5bA0UA+IyMgwJizQYSEdgz8cC/tHdmFB3CniXzmpKTSK8mJddeEBl+cGbXHBzxEUhH7xF1eaS41O+0ezWEQ==} + peerDependencies: + '@chakra-ui/system': '>=1.0.0' + react: '>=16.8.6' + dependencies: + '@chakra-ui/system': 1.12.1(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/utils': 1.10.4 + react: 18.2.0 + dev: false + /@clack/core@0.3.4: resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} dependencies: @@ -12551,13 +13868,13 @@ packages: '@types/node': 14.18.42 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.3.0(@types/node@14.18.42)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.5) + cosmiconfig-typescript-loader: 4.3.0(@types/node@14.18.42)(cosmiconfig@8.2.0)(ts-node@10.9.2)(typescript@5.4.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@14.18.42)(typescript@4.9.5) - typescript: 4.9.5 + ts-node: 10.9.2(@types/node@14.18.42)(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -12575,13 +13892,13 @@ packages: '@types/node': 20.5.1 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.3.0(@types/node@20.5.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.5) + cosmiconfig-typescript-loader: 4.3.0(@types/node@20.5.1)(cosmiconfig@8.2.0)(ts-node@10.9.2)(typescript@5.4.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@4.9.5) - typescript: 4.9.5 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -13446,6 +14763,45 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + /@edge-runtime/format@2.1.0: + resolution: {integrity: sha512-gc2qbYEIIJRczBApBPznVI1c5vZgzrZQOsFZnAxxFiYah9qldHiu1YEitzSvXI8X8ZgvAguuIiyIbpWz17nlXA==} + engines: {node: '>=14'} + dev: true + + /@edge-runtime/node-utils@2.0.3: + resolution: {integrity: sha512-JUSbi5xu/A8+D2t9B9wfirCI1J8n8q0660FfmqZgA+n3RqxD3y7SnamL1sKRE5/AbHsKs9zcqCbK2YDklbc9Bg==} + engines: {node: '>=14'} + dev: true + + /@edge-runtime/primitives@2.1.2: + resolution: {integrity: sha512-SR04SMDybALlhIYIi0hiuEUwIl0b7Sn+RKwQkX6hydg4+AKMzBNDFhj2nqHDD1+xkHArV9EhmJIb6iGjShwSzg==} + engines: {node: '>=14'} + dev: true + + /@edge-runtime/primitives@3.0.1: + resolution: {integrity: sha512-l5NNDcPkKW4N6qRmB8zzpCF6uRW1S808V/zm72z7b/aWwZUYbmEPPkzyhGAW0aQxLU1pGdZ8u2gNjamdaU6RXw==} + engines: {node: '>=14'} + dev: true + + /@edge-runtime/primitives@3.0.3: + resolution: {integrity: sha512-YnfMWMRQABAH8IsnFMJWMW+SyB4ZeYBPnR7V0aqdnew7Pq60cbH5DyFjS/FhiLwvHQk9wBREmXD7PP0HooEQ1A==} + engines: {node: '>=14'} + dev: true + + /@edge-runtime/vm@3.0.1: + resolution: {integrity: sha512-69twXLIcqVx0iNlc1vFqnXgka2CZi2c/QBAmMzXBk0M6mPG+ICCBh2dd+cv1K+HW2pfLuSW+EskkFXWGeCf1Vw==} + engines: {node: '>=14'} + dependencies: + '@edge-runtime/primitives': 3.0.1 + dev: true + + /@edge-runtime/vm@3.0.3: + resolution: {integrity: sha512-SPfI1JeIRNs/4EEE2Oc0X6gG3RqjD1TnKu2lwmwFXq0435xgZGKhc3UiKkYAdoMn2dNFD73nlabMKHBRoMRpxg==} + engines: {node: '>=14'} + dependencies: + '@edge-runtime/primitives': 3.0.3 + dev: true + /@editorjs/editorjs@2.26.5: resolution: {integrity: sha512-imwXZi9NmzxKjNosa1xQf286liJYsTe2J2DWCiV5TwKhvYZ1INg5Y+FietcM2v65QmeLqP7wgBUhoI7wiCB+yQ==} dependencies: @@ -13477,6 +14833,22 @@ packages: source-map: 0.5.7 stylis: 4.1.3 + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.2 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + /@emotion/cache@11.10.7: resolution: {integrity: sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==} dependencies: @@ -13487,6 +14859,16 @@ packages: stylis: 4.1.3 dev: false + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + /@emotion/cache@11.7.1: resolution: {integrity: sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==} dependencies: @@ -13507,6 +14889,16 @@ packages: '@emotion/utils': 1.2.0 dev: false + /@emotion/css@11.11.2: + resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} + dependencies: + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + dev: false + /@emotion/hash@0.8.0: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false @@ -13514,6 +14906,10 @@ packages: /@emotion/hash@0.9.0: resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + /@emotion/is-prop-valid@0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true @@ -13541,6 +14937,10 @@ packages: /@emotion/memoize@0.8.0: resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + /@emotion/react@11.10.6(@types/react@17.0.53)(react@17.0.2): resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==} peerDependencies: @@ -13583,6 +14983,26 @@ packages: react: 17.0.2 dev: false + /@emotion/react@11.10.6(react@18.2.0): + resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@emotion/babel-plugin': 11.10.6 + '@emotion/cache': 11.10.7 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + /@emotion/react@11.7.1(@babel/core@7.24.4)(@types/react@17.0.62)(react@17.0.2): resolution: {integrity: sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==} peerDependencies: @@ -13626,10 +15046,24 @@ packages: '@emotion/utils': 1.2.0 csstype: 3.1.2 + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + /@emotion/sheet@1.2.1: resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} dev: false + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + /@emotion/styled@11.10.6(@emotion/react@11.10.6)(@types/react@17.0.53)(react@17.0.2): resolution: {integrity: sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==} peerDependencies: @@ -13672,6 +15106,26 @@ packages: react: 17.0.2 dev: false + /@emotion/styled@11.10.6(@emotion/react@11.10.6)(react@18.2.0): + resolution: {integrity: sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@emotion/babel-plugin': 11.10.6 + '@emotion/is-prop-valid': 1.2.0 + '@emotion/react': 11.10.6(react@18.2.0) + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) + '@emotion/utils': 1.2.0 + react: 18.2.0 + dev: false + /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} dev: false @@ -13679,6 +15133,10 @@ packages: /@emotion/unitless@0.8.0: resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + /@emotion/use-insertion-effect-with-fallbacks@1.0.0(react@17.0.2): resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} peerDependencies: @@ -13686,6 +15144,14 @@ packages: dependencies: react: 17.0.2 + /@emotion/use-insertion-effect-with-fallbacks@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + /@emotion/utils@1.0.0: resolution: {integrity: sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==} dev: false @@ -13693,6 +15159,10 @@ packages: /@emotion/utils@1.2.0: resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + /@emotion/weak-memoize@0.2.5: resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} dev: false @@ -13701,6 +15171,10 @@ packages: resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} dev: false + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.0)(typescript@4.9.5): resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} engines: {node: '>=10.0.0'} @@ -14623,6 +16097,23 @@ packages: transitivePeerDependencies: - supports-color + /@eslint/eslintrc@3.0.2: + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/js@8.38.0: resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -14749,6 +16240,17 @@ packages: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) + /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@floating-ui/react@0.19.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==} peerDependencies: @@ -14762,9 +16264,26 @@ packages: tabbable: 6.1.1 dev: false + /@floating-ui/react@0.26.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/utils': 0.2.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tabbable: 6.1.1 + dev: false + /@floating-ui/utils@0.1.4: resolution: {integrity: sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==} + /@floating-ui/utils@0.2.2: + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + dev: false + /@fortawesome/fontawesome-common-types@6.4.0: resolution: {integrity: sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==} engines: {node: '>=6'} @@ -15364,7 +16883,7 @@ packages: '@jest/reporters': 29.5.0 '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 14.18.42 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -15436,6 +16955,49 @@ packages: - ts-node dev: true + /@jest/core@29.7.0(ts-node@10.9.2): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 14.18.42 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@14.18.42)(ts-node@10.9.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /@jest/environment@27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -15783,7 +17345,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -16004,7 +17566,7 @@ packages: npm-package-arg: 8.1.1 p-map: 4.0.0 pacote: 13.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - supports-color @@ -16035,7 +17597,7 @@ packages: p-map: 4.0.0 p-map-series: 2.1.0 p-waterfall: 2.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - supports-color @@ -16142,7 +17704,7 @@ packages: npm-package-arg: 8.1.1 npmlog: 6.0.2 pify: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/create-symlink@5.6.2: @@ -16169,7 +17731,7 @@ packages: p-reduce: 2.1.0 pacote: 13.6.2 pify: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 validate-npm-package-license: 3.0.4 validate-npm-package-name: 4.0.0 @@ -16278,7 +17840,7 @@ packages: engines: {node: ^14.15.0 || >=16.0.0} dependencies: '@lerna/child-process': 5.6.2 - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/import@5.6.2: @@ -16455,7 +18017,7 @@ packages: '@lerna/validation-error': 5.6.2 npm-package-arg: 8.1.1 npmlog: 6.0.2 - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/package@5.6.2: @@ -16471,7 +18033,7 @@ packages: resolution: {integrity: sha512-7gIm9fecWFVNy2kpj/KbH11bRcpyANAwpsft3X5m6J7y7A6FTUscCbEvl3ZNdpQKHNuvnHgCtkm3A5PMSCEgkA==} engines: {node: ^14.15.0 || >=16.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /@lerna/profiler@5.6.2: @@ -16541,7 +18103,7 @@ packages: p-map: 4.0.0 p-pipe: 3.1.0 pacote: 13.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - encoding @@ -16691,7 +18253,7 @@ packages: p-pipe: 3.1.0 p-reduce: 2.1.0 p-waterfall: 2.1.1 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 write-json-file: 4.3.0 transitivePeerDependencies: @@ -16729,6 +18291,22 @@ packages: - debug dev: false + /@mantine/code-highlight@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5JrCpONCdgrBfASQS5a7ZFrLD9e4uvjJDET10UX6ZS4dMPRqZZCYweJFUwaxhvRoIctpQeN5+Fuh95PVcZ5NXw==} + peerDependencies: + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + clsx: 2.1.0 + highlight.js: 11.9.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@mantine/core@4.2.12(@babel/core@7.24.4)(@mantine/hooks@4.2.12)(@types/react@17.0.62)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-PZcVUvcSZiZmLR1moKBJFdFIh6a4C+TE2ao91kzTAlH5Qb8t/V3ONbfPk3swHoYr7OSLJQM8vZ7UD5sFDiq0/g==} peerDependencies: @@ -16789,6 +18367,26 @@ packages: - '@types/react' dev: false + /@mantine/core@7.6.2(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qmZhmQVc7ZZ8EKKhPkGuZbfBnLXR0xE45ikxfx+1E6/8hLY5Ypr4nWqh5Pk6p3b+K71yYnBqlbNXbtHLQH0h3g==} + peerDependencies: + '@mantine/hooks': 7.6.2 + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + '@floating-ui/react': 0.26.13(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + clsx: 2.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-number-format: 5.3.4(react-dom@18.2.0)(react@18.2.0) + react-remove-scroll: 2.5.9(react@18.2.0) + react-textarea-autosize: 8.5.3(react@18.2.0) + type-fest: 4.18.2 + transitivePeerDependencies: + - '@types/react' + dev: false + /@mantine/dropzone@5.10.5(@mantine/core@5.10.5)(@mantine/hooks@5.10.5)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-tBPBuQvlvesEApECTfmYFQXbS26sAQo8VaYIebTqBy9VIUoVAM9VCKHBLqa3KMKtq+/HjKCJpaa8+Cjn9riqqQ==} peerDependencies: @@ -16831,6 +18429,28 @@ packages: react: 17.0.2 dev: false + /@mantine/hooks@7.6.2(react@18.2.0): + resolution: {integrity: sha512-ZrOgrZHoIGCDKrr2/9njDgK0al+jjusYQFlmR0YyEFyRtgY6eNSI4zuYLcAPx1haHmUm5RsLBrqY6Iy/TLdGXA==} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@mantine/modals@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k+lrq+ZTBobP1oNzKEiBtYeefc3wsQjx/T+29SF+m3pir9bqZZ0/0IbEIUMFyqYKhhMjB8DU9+tq5NAPqri7Vg==} + peerDependencies: + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@mantine/notifications@5.10.5(@mantine/core@5.10.5)(@mantine/hooks@5.10.5)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-IzTAXA7Zb9DcI94Mv5O2OinhLmI7fvs/VutDw9uCpp6OHtLuF/XN1d262jrsGhMZT0c4nuUsotSLFZF3GWZwXg==} peerDependencies: @@ -16847,6 +18467,22 @@ packages: react-transition-group: 4.4.2(react-dom@17.0.2)(react@17.0.2) dev: false + /@mantine/notifications@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vLs6Y5nnxHipGkA5TSsxgjeus0N9uS+0+E9KZ5OG5QEtz7BdOsKPtNmytsQzBN8P8fjttFImhhoSUOLpYv0xtA==} + peerDependencies: + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + '@mantine/store': 7.6.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false + /@mantine/prism@5.10.5(@mantine/core@5.10.5)(@mantine/hooks@5.10.5)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-xwe3RE6wg0/KuCBH/MTTQIOltBLTELSfUzHa5/66q4aPdgRPnbzOVxiH/ytndDuqJd8MKpyo25M+3nPAtq2O4A==} peerDependencies: @@ -16878,6 +18514,29 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@mantine/spotlight@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-66VOzAe5M6jUBGt/Z2eWMdCJP+r9NpuUsoI0I5rjDfMDWyUAZOX6a/FS2CzTfDyAmnMGVwWqJZw+DCftIKOMVQ==} + peerDependencies: + '@mantine/core': 7.6.2 + '@mantine/hooks': 7.6.2 + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + '@mantine/store': 7.6.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@mantine/store@7.6.2(react@18.2.0): + resolution: {integrity: sha512-IEGbyIs7LIXYQtjR87GQPiw12klgsiKiqplGu9LekJb8uW/7XSRNs31ggqKmdF+cMWO/WyQhEXZdpWNib6tVOw==} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + /@mantine/styles@4.2.12(@babel/core@7.24.4)(@types/react@17.0.62)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-9q1DzW0UNW/ORMGLHfN2XABOSEm0ZQebhNlLD757R6OQouoLuUf9elUwgGOXSyogMlsAYoy84XbJ3ZbbTm4YCA==} peerDependencies: @@ -16946,6 +18605,23 @@ packages: '@types/react': 17.0.62 react: 17.0.2 + /@microlink/react-json-view@1.23.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HYJ1nsfO4/qn8afnAMhuk7+5a1vcjEaS8Gm5Vpr1SqdHDY0yLBJGpA+9DvKyxyVKaUkXzKXt3Mif9RcmFSdtYg==} + peerDependencies: + react: '>= 15' + react-dom: '>= 15' + dependencies: + flux: 4.0.4(react@18.2.0) + react: 18.2.0 + react-base16-styling: 0.6.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.3.4(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - encoding + dev: false + /@microsoft/api-extractor-model@7.28.2(@types/node@18.18.5): resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} dependencies: @@ -17525,7 +19201,7 @@ packages: dependencies: https-proxy-agent: 5.0.1 nan: 2.17.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color optional: true @@ -17538,6 +19214,185 @@ packages: dependencies: newrelic: 9.15.0 + /@next/bundle-analyzer@14.2.3: + resolution: {integrity: sha512-Z88hbbngMs7njZKI8kTJIlpdLKYfMSLwnsqYe54AP4aLmgL70/Ynx/J201DQ+q2Lr6FxFw1uCeLGImDrHOl2ZA==} + dependencies: + webpack-bundle-analyzer: 4.10.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@next/env@13.5.6: + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + dev: true + + /@next/env@14.1.0: + resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} + dev: false + + /@next/swc-darwin-arm64@13.5.6: + resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@next/swc-darwin-arm64@14.1.0: + resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@13.5.6: + resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@next/swc-darwin-x64@14.1.0: + resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.5.6: + resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-arm64-gnu@14.1.0: + resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@13.5.6: + resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-arm64-musl@14.1.0: + resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@13.5.6: + resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-x64-gnu@14.1.0: + resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@13.5.6: + resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@next/swc-linux-x64-musl@14.1.0: + resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@13.5.6: + resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@next/swc-win32-arm64-msvc@14.1.0: + resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@13.5.6: + resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@next/swc-win32-ia32-msvc@14.1.0: + resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@13.5.6: + resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@next/swc-win32-x64-msvc@14.1.0: + resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@ngtools/webpack@16.2.8(@angular/compiler-cli@16.2.11)(typescript@4.9.5)(webpack@5.88.2): resolution: {integrity: sha512-GeblhLBwXe3qPYa4YHxbo0xujRl1FKkfIusU1mTIhkQBRtZY4Xgz4iMnPIEMJTU3XXGMkS+SCx34lqbwwMhR5A==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -17624,6 +19479,71 @@ packages: vue-resize: 2.0.0-alpha.1(vue@3.2.47) dev: false + /@novu/shared@0.23.1: + resolution: {integrity: sha512-XGjs+hT0kYMRqBAdIUqw/oijXD/1KCE6CByIMiLDOPeMZpQitWEt0HhdQaVfv2C7My7UWttAO/3zLte11WmyWQ==} + dependencies: + axios: 1.6.7 + class-transformer: 0.5.1 + class-validator: 0.14.0 + transitivePeerDependencies: + - debug + dev: false + + /@novu/studio@0.0.1-alpha.90(@ant-design/icons@4.6.2)(@babel/core@7.24.4)(@chakra-ui/icons@2.1.1)(@chakra-ui/react@1.8.9)(@chakra-ui/system@2.6.2)(antd@4.24.8)(chakra-react-select@4.7.6)(dayjs@1.11.10)(webpack@5.78.0): + resolution: {integrity: sha512-6khD9K9QvsWEPhCk403YTCjeujZPAdqtAwEMCSGtP/6k5UJzVok6Ydl60xNMRS3qLebULQj1ZgEbegN9rX0yog==} + engines: {node: '>=18.17.0'} + hasBin: true + dependencies: + '@mantine/code-highlight': 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.6.2(react@18.2.0) + '@mantine/modals': 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/notifications': 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@mantine/spotlight': 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + '@microlink/react-json-view': 1.23.0(react-dom@18.2.0)(react@18.2.0) + '@next/bundle-analyzer': 14.2.3 + '@rjsf/antd': 5.18.3(@ant-design/icons@4.6.2)(@rjsf/core@5.17.1)(@rjsf/utils@5.17.1)(antd@4.24.8)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + '@rjsf/chakra-ui': 5.17.1(@chakra-ui/icons@2.1.1)(@chakra-ui/react@1.8.9)(@chakra-ui/system@2.6.2)(@rjsf/core@5.17.1)(@rjsf/utils@5.17.1)(chakra-react-select@4.7.6)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0) + '@rjsf/core': 5.17.1(@rjsf/utils@5.17.1)(react@18.2.0) + '@rjsf/utils': 5.17.1(react@18.2.0) + '@rjsf/validator-ajv8': 5.17.1(@rjsf/utils@5.17.1) + '@sentry/nextjs': 7.113.0(next@14.1.0)(react@18.2.0)(webpack@5.78.0) + '@tabler/icons-react': 2.47.0(react@18.2.0) + '@tanstack/react-query': 5.35.1(react@18.2.0) + axios: 1.6.8 + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + logrocket: 8.1.0 + mixpanel: 0.18.0 + mixpanel-browser: 2.50.0 + next: 14.1.0(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-confetti: 6.1.0(react@18.2.0) + react-diff-viewer-continued: 3.4.0(react-dom@18.2.0)(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + reactflow: 11.11.3(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@ant-design/icons' + - '@babel/core' + - '@chakra-ui/icons' + - '@chakra-ui/react' + - '@chakra-ui/system' + - '@emotion/is-prop-valid' + - '@opentelemetry/api' + - '@types/react' + - antd + - babel-plugin-macros + - bufferutil + - chakra-react-select + - dayjs + - debug + - encoding + - immer + - sass + - supports-color + - utf-8-validate + - webpack + dev: false + /@npmcli/arborist@5.3.0: resolution: {integrity: sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -17659,7 +19579,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.0 ssri: 9.0.1 treeverse: 2.0.0 walk-up-path: 1.0.0 @@ -17673,14 +19593,14 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.4 + semver: 7.6.0 dev: true /@npmcli/fs@3.1.0: resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /@npmcli/git@3.0.2: @@ -17694,7 +19614,7 @@ packages: proc-log: 2.0.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.4 + semver: 7.6.0 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -17710,7 +19630,7 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.4 + semver: 7.6.0 which: 3.0.0 transitivePeerDependencies: - bluebird @@ -17751,7 +19671,7 @@ packages: cacache: 16.1.3 json-parse-even-better-errors: 2.3.1 pacote: 13.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - bluebird - supports-color @@ -17857,7 +19777,7 @@ packages: ejs: 3.1.9 ignore: 5.2.4 nx: 15.9.4 - semver: 7.5.4 + semver: 7.6.0 tmp: 0.2.1 tslib: 2.6.2 dev: true @@ -17870,7 +19790,7 @@ packages: ejs: 3.1.9 ignore: 5.2.4 nx: 15.9.4 - semver: 7.5.4 + semver: 7.6.0 tmp: 0.2.1 tslib: 2.6.2 dev: true @@ -18247,7 +20167,6 @@ packages: - '@swc-node/register' - '@swc/core' - debug - dev: true /@nrwl/tao@17.3.2(@swc-node/register@1.8.0)(@swc/core@1.3.107): resolution: {integrity: sha512-5uvpSmij0J9tteFV/0M/024K+H/o3XAlqtSdU8j03Auj1IleclSLF2yCTuIo7pYXhG3cgx1+nR+3nMs1QVAdUA==} @@ -18311,7 +20230,7 @@ packages: ejs: 3.1.9 enquirer: 2.3.6 ignore: 5.2.4 - nx: 16.10.0 + nx: 16.10.0(@swc-node/register@1.8.0)(@swc/core@1.3.107) semver: 7.5.3 tmp: 0.2.1 tslib: 2.6.2 @@ -18326,7 +20245,7 @@ packages: enquirer: 2.3.6 ignore: 5.2.4 nx: 16.10.0(@swc-node/register@1.8.0)(@swc/core@1.3.107) - semver: 7.5.4 + semver: 7.6.0 tmp: 0.2.1 tslib: 2.6.2 yargs-parser: 21.1.1 @@ -18342,7 +20261,7 @@ packages: enquirer: 2.3.6 ignore: 5.2.4 nx: 17.3.2(@swc-node/register@1.8.0)(@swc/core@1.3.107) - semver: 7.5.4 + semver: 7.6.0 tmp: 0.2.1 tslib: 2.6.2 yargs-parser: 21.1.1 @@ -18624,10 +20543,10 @@ packages: npm-package-arg: 11.0.1 npm-run-path: 4.0.1 ora: 5.3.0 - semver: 7.5.4 + semver: 7.6.0 source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.3.107)(@types/node@18.16.9)(typescript@5.3.3) - tsconfig-paths: 4.1.2 + tsconfig-paths: 4.2.0 tslib: 2.6.2 verdaccio: 5.30.3(typanion@3.14.0) transitivePeerDependencies: @@ -19311,7 +21230,7 @@ packages: dependencies: '@opentelemetry/api': 1.7.0 '@opentelemetry/semantic-conventions': 0.25.0 - semver: 7.5.4 + semver: 7.6.0 dev: false /@opentelemetry/core@1.19.0(@opentelemetry/api@1.7.0): @@ -19577,7 +21496,7 @@ packages: '@opentelemetry/api': 1.7.0 '@opentelemetry/instrumentation': 0.46.0(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.22.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: false @@ -19687,7 +21606,7 @@ packages: '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) '@opentelemetry/instrumentation': 0.46.0(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.19.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: false @@ -20825,7 +22744,7 @@ packages: ramda: /@pnpm/ramda@0.28.1 right-pad: 1.0.1 rxjs: 7.8.1 - semver: 7.5.4 + semver: 7.6.0 stacktracey: 2.1.8 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -20965,7 +22884,7 @@ packages: engines: {node: '>=14.6'} dependencies: hosted-git-info: 4.1.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 4.0.0 dev: true @@ -20982,7 +22901,7 @@ packages: detect-libc: 2.0.1 execa: /safe-execa@0.1.2 mem: 8.1.1 - semver: 7.5.4 + semver: 7.6.0 dev: true /@pnpm/pnpmfile@5.0.6(@pnpm/logger@5.0.0): @@ -21039,7 +22958,7 @@ packages: resolution: {integrity: sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg==} engines: {node: '>=16.14'} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /@pnpm/resolver-base@10.0.0: @@ -21098,6 +23017,10 @@ packages: /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + dev: false + /@popperjs/core@2.11.7: resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==} dev: false @@ -22454,6 +24377,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /@rc-component/portal@1.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@reach/alert@0.13.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-LDz83AXCrClyq/MWe+0vaZfHp1Ytqn+kgL5VxG7rirUvmluWaj/snxzfNPWn0Ma4K2YENmXXRC/iHt5X95SqIg==} peerDependencies: @@ -22468,6 +24405,20 @@ packages: tslib: 2.6.2 dev: false + /@reach/alert@0.13.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LDz83AXCrClyq/MWe+0vaZfHp1Ytqn+kgL5VxG7rirUvmluWaj/snxzfNPWn0Ma4K2YENmXXRC/iHt5X95SqIg==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x + dependencies: + '@reach/utils': 0.13.2(react-dom@18.2.0)(react@18.2.0) + '@reach/visually-hidden': 0.13.2(react-dom@18.2.0)(react@18.2.0) + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + /@reach/utils@0.13.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ==} peerDependencies: @@ -22481,6 +24432,19 @@ packages: warning: 4.0.3 dev: false + /@reach/utils@0.13.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x + dependencies: + '@types/warning': 3.0.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + warning: 4.0.3 + dev: false + /@reach/visually-hidden@0.13.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-sPZwNS0/duOuG0mYwE5DmgEAzW9VhgU3aIt1+mrfT/xiT9Cdncqke+kRBQgU708q/Ttm9tWsoHni03nn/SuPTQ==} peerDependencies: @@ -22493,6 +24457,18 @@ packages: tslib: 2.6.2 dev: false + /@reach/visually-hidden@0.13.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sPZwNS0/duOuG0mYwE5DmgEAzW9VhgU3aIt1+mrfT/xiT9Cdncqke+kRBQgU708q/Ttm9tWsoHni03nn/SuPTQ==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + /@react-email/render@0.0.9: resolution: {integrity: sha512-nrim7wiACnaXsGtL7GF6jp3Qmml8J6vAjAH88jkC8lIbfNZaCyuPQHANjyYIXlvQeAbsWADQJFZgOHUqFqjh/A==} engines: {node: '>=18.0.0'} @@ -22503,6 +24479,114 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@reactflow/background@11.3.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hkvpVEhgvfTDyCvdlitw4ioKCYLaaiRXnuEG+1QM3Np+7N1DiWF1XOv5I8AFyNoJL07yXEkbECUTsHvkBvcG5A==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.11.3(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/controls@11.2.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3xgEg6ALIVkAQCS4NiBjb7ad8Cb3D8CtA7Vvl4Hf5Ar2PIVs6FOaeft9s2iDZGtsWP35ECDYId1rIFVhQL8r+A==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.11.3(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/core@11.11.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+adHdUa7fJSEM93fWfjQwyWXeI92a1eLKwWbIstoCakHpL8UjzwhEh6sn+mN2h/59MlVI7Ehr1iGTt3MsfcIFA==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@types/d3': 7.4.0 + '@types/d3-drag': 3.0.2 + '@types/d3-selection': 3.0.5 + '@types/d3-zoom': 3.0.2 + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/minimap@11.7.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-m2MvdiGSyOu44LEcERDEl1Aj6x//UQRWo3HEAejNU4HQTlJnYrSN8tgrYF8TxC1+c/9UdyzQY5VYgrTwW4QWdg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.11.3(react-dom@18.2.0)(react@18.2.0) + '@types/d3-selection': 3.0.5 + '@types/d3-zoom': 3.0.2 + classcat: 5.0.4 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-resizer@2.2.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-X7ceQ2s3jFLgbkg03n2RYr4hm3jTVrzkW2W/8ANv/SZfuVmF8XJxlERuD8Eka5voKqLda0ywIZGAbw9GoHLfUQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.11.3(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-toolbar@1.3.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aknvNICO10uWdthFSpgD6ctY/CTBeJUMV9co8T9Ilugr08Nb89IQ4uD0dPmr031ewMQxixtYIkw+sSDDzd2aaQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.11.3(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.5.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + /@ringcentral/sdk@5.0.1: resolution: {integrity: sha512-7lKXMZIbooC7zTCkqgjn1G36aOXd92uXwkiYBBNYwmIawlviZSeNE0UY9GHZQzRaxZ6bqQ/bvHzl/t/G5fzMMA==} engines: {node: '>=4'} @@ -22527,6 +24611,31 @@ packages: react: 17.0.2 dev: false + /@rjsf/antd@5.18.3(@ant-design/icons@4.6.2)(@rjsf/core@5.17.1)(@rjsf/utils@5.17.1)(antd@4.24.8)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eKuxNGXBTwq5hqdqSpbkEUxzX5224y42EHJgiP0Eu3xDj74ktAjBHvBHfX4Fa76Gjwfv+Dkj/N1wg1+G+iBlZw==} + engines: {node: '>=14'} + peerDependencies: + '@ant-design/icons': ^4.0.0 || ^5.0.0 + '@rjsf/core': ^5.18.x + '@rjsf/utils': ^5.18.x + antd: ^4.24.0 || ^5.8.5 + dayjs: ^1.8.0 + react: ^16.14.0 || >=17 + dependencies: + '@ant-design/icons': 4.6.2(react-dom@18.2.0)(react@18.2.0) + '@rjsf/core': 5.17.1(@rjsf/utils@5.17.1)(react@18.2.0) + '@rjsf/utils': 5.17.1(react@18.2.0) + antd: 4.24.8(react-dom@18.2.0)(react@18.2.0) + classnames: 2.5.1 + dayjs: 1.11.10 + lodash: 4.17.21 + lodash-es: 4.17.21 + rc-picker: 2.7.6(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + /@rjsf/chakra-ui@5.17.1(@chakra-ui/icons@2.1.1)(@chakra-ui/react@1.8.9)(@chakra-ui/system@2.6.2)(@rjsf/core@5.17.1)(@rjsf/utils@5.17.1)(@types/react@17.0.62)(chakra-react-select@4.7.6)(framer-motion@5.6.0)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-OJEdnC62eEo+ib222tAykUC3fV7hcCZIbTsGx7cNlQgZdY+Sy6UraZh+dMjddIOUnoysvuilByOSLy4LOurqGA==} engines: {node: '>=14'} @@ -22554,6 +24663,33 @@ packages: - react-dom dev: false + /@rjsf/chakra-ui@5.17.1(@chakra-ui/icons@2.1.1)(@chakra-ui/react@1.8.9)(@chakra-ui/system@2.6.2)(@rjsf/core@5.17.1)(@rjsf/utils@5.17.1)(chakra-react-select@4.7.6)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OJEdnC62eEo+ib222tAykUC3fV7hcCZIbTsGx7cNlQgZdY+Sy6UraZh+dMjddIOUnoysvuilByOSLy4LOurqGA==} + engines: {node: '>=14'} + peerDependencies: + '@chakra-ui/icons': '>=1.1.1' + '@chakra-ui/react': '>=1.7.3' + '@chakra-ui/system': '>=1.12.1' + '@rjsf/core': ^5.16.x + '@rjsf/utils': ^5.16.x + chakra-react-select: '>=3.3.8' + framer-motion: '>=5.6.0' + react: ^16.14.0 || >=17 + dependencies: + '@chakra-ui/icons': 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react': 1.8.9(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(framer-motion@11.1.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@rjsf/core': 5.17.1(@rjsf/utils@5.17.1)(react@18.2.0) + '@rjsf/utils': 5.17.1(react@18.2.0) + chakra-react-select: 4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.10.6)(react-dom@18.2.0)(react@18.2.0) + framer-motion: 11.1.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-select: 5.8.0(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: false + /@rjsf/core@5.17.1(@rjsf/utils@5.17.1)(react@17.0.2): resolution: {integrity: sha512-COZSuumwHskWN8Pz3RxdxvuQUP6M/qBMXAkIi+TSWLFLaF6SUugpLiceMT1jGemDCr7fOSTiPxjkToSsgpvueQ==} engines: {node: '>=14'} @@ -22570,6 +24706,22 @@ packages: react: 17.0.2 dev: false + /@rjsf/core@5.17.1(@rjsf/utils@5.17.1)(react@18.2.0): + resolution: {integrity: sha512-COZSuumwHskWN8Pz3RxdxvuQUP6M/qBMXAkIi+TSWLFLaF6SUugpLiceMT1jGemDCr7fOSTiPxjkToSsgpvueQ==} + engines: {node: '>=14'} + peerDependencies: + '@rjsf/utils': ^5.16.x + react: ^16.14.0 || >=17 + dependencies: + '@rjsf/utils': 5.17.1(react@18.2.0) + lodash: 4.17.21 + lodash-es: 4.17.21 + markdown-to-jsx: 7.4.1(react@18.2.0) + nanoid: 3.3.7 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /@rjsf/utils@5.17.1(react@17.0.2): resolution: {integrity: sha512-q1Igz/cuM2hi+jiXFkoaXqdRTUFB+a0jfVKNmZlHmvPmfYeeJfcfyOTzO8dQ41fHNHUFb15ryxa/TblDQimwkA==} engines: {node: '>=14'} @@ -22584,6 +24736,20 @@ packages: react-is: 18.2.0 dev: false + /@rjsf/utils@5.17.1(react@18.2.0): + resolution: {integrity: sha512-q1Igz/cuM2hi+jiXFkoaXqdRTUFB+a0jfVKNmZlHmvPmfYeeJfcfyOTzO8dQ41fHNHUFb15ryxa/TblDQimwkA==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.14.0 || >=17 + dependencies: + json-schema-merge-allof: 0.8.1 + jsonpointer: 5.0.1 + lodash: 4.17.21 + lodash-es: 4.17.21 + react: 18.2.0 + react-is: 18.2.0 + dev: false + /@rjsf/validator-ajv8@5.17.1(@rjsf/utils@5.17.1): resolution: {integrity: sha512-KdvHsjDQ60b04fqnoqhfkiCv7E4n4NIHli8QU8dtpuUAVS/TOqDuOtDJVz6bv/rd/QNROGpxlO/OCccE0rmxLQ==} engines: {node: '>=14'} @@ -22630,6 +24796,24 @@ packages: rollup: 2.79.1 dev: true + /@rollup/plugin-commonjs@24.0.0(rollup@2.78.0): + resolution: {integrity: sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.5(rollup@2.78.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + rollup: 2.78.0 + dev: false + /@rollup/plugin-json@6.0.0(rollup@3.28.1): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} @@ -22654,7 +24838,7 @@ packages: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.8 rollup: 2.79.1 dev: true @@ -22776,7 +24960,7 @@ packages: rollup: 3.28.1 dev: true - /@rollup/pluginutils@5.0.5: + /@rollup/pluginutils@5.0.5(rollup@2.78.0): resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} engines: {node: '>=14.0.0'} peerDependencies: @@ -22788,7 +24972,7 @@ packages: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - dev: true + rollup: 2.78.0 /@rollup/rollup-android-arm-eabi@4.9.6: resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} @@ -22894,6 +25078,12 @@ packages: dev: true optional: true + /@rrweb/types@2.0.0-alpha.13: + resolution: {integrity: sha512-ytq+MeVm/vP2ybw+gTAN3Xvt7HN2yS+wlbfnwHpQMftxrwzq0kEZHdw+Jp5WUvvpONWzXriNAUU9dW0qLGkzNg==} + dependencies: + rrweb-snapshot: 2.0.0-alpha.13 + dev: false + /@rushstack/eslint-patch@1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true @@ -23167,7 +25357,7 @@ packages: read-pkg: 5.2.0 registry-auth-token: 5.0.2 semantic-release: 19.0.5 - semver: 7.5.4 + semver: 7.6.0 tempy: 1.0.1 dev: true @@ -23219,6 +25409,34 @@ packages: - debug dev: false + /@sentry-internal/feedback@7.113.0: + resolution: {integrity: sha512-eEmL8QXauUnM3FXGv0GT29RpL0Jo0pkn/uMu3aqjhQo7JKNqUGVYIUxJxiGWbVMbDXqPQ7L66bjjMS3FR1GM2g==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + + /@sentry-internal/replay-canvas@7.113.0: + resolution: {integrity: sha512-K8uA42aobNF/BAXf14el15iSAi9fonLBUrjZi6nPDq7zaA8rPvfcTL797hwCbqkETz2zDf52Jz7I3WFCshDoUw==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.113.0 + '@sentry/replay': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + + /@sentry-internal/tracing@7.113.0: + resolution: {integrity: sha512-8MDnYENRMnEfQjvN4gkFYFaaBSiMFSU/6SQZfY9pLI3V105z6JQ4D0PGMAUVowXilwNZVpKNYohE7XByuhEC7Q==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + /@sentry-internal/tracing@7.47.0: resolution: {integrity: sha512-udpHnCzF8DQsWf0gQwd0XFGp6Y8MOiwnl8vGt2ohqZGS3m1+IxoRLXsSkD8qmvN6KKDnwbaAvYnK0z0L+AW95g==} engines: {node: '>=8'} @@ -23239,6 +25457,20 @@ packages: tslib: 2.6.2 dev: false + /@sentry/browser@7.113.0: + resolution: {integrity: sha512-PdyVHPOprwoxGfKGsP2dXDWO0MBDW1eyP7EZlfZvM1A4hjk6ZRNfCv30g+TrqX4hiZDKzyqN3+AdP7N/J2IX0Q==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/feedback': 7.113.0 + '@sentry-internal/replay-canvas': 7.113.0 + '@sentry-internal/tracing': 7.113.0 + '@sentry/core': 7.113.0 + '@sentry/integrations': 7.113.0 + '@sentry/replay': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + /@sentry/browser@7.47.0: resolution: {integrity: sha512-L0t07kS/G1UGVZ9fpD6HLuaX8vVBqAGWgu+1uweXthYozu/N7ZAsakjU/Ozu6FSXj1mO3NOJZhOn/goIZLSj5A==} engines: {node: '>=8'} @@ -23251,6 +25483,31 @@ packages: tslib: 1.14.1 dev: false + /@sentry/cli@1.77.3: + resolution: {integrity: sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==} + engines: {node: '>= 8'} + hasBin: true + requiresBuild: true + dependencies: + https-proxy-agent: 5.0.1 + mkdirp: 0.5.6 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/core@7.113.0: + resolution: {integrity: sha512-pg75y3C5PG2+ur27A0Re37YTCEnX0liiEU7EOxWDGutH17x3ySwlYqLQmZsFZTSnvzv7t3MGsNZ8nT5O0746YA==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + /@sentry/core@7.47.0: resolution: {integrity: sha512-EFhZhKdMu7wKmWYZwbgTi8FNZ7Fq+HdlXiZWNz51Bqe3pHmfAkdHtAEs0Buo0v623MKA0CA4EjXIazGUM34XTg==} engines: {node: '>=8'} @@ -23279,6 +25536,59 @@ packages: tslib: 1.14.1 dev: false + /@sentry/integrations@7.113.0: + resolution: {integrity: sha512-w0sspGBQ+6+V/9bgCkpuM3CGwTYoQEVeTW6iNebFKbtN7MrM3XsGAM9I2cW1jVxFZROqCBPFtd2cs5n0j14aAg==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + localforage: 1.10.0 + dev: false + + /@sentry/nextjs@7.113.0(next@14.1.0)(react@18.2.0)(webpack@5.78.0): + resolution: {integrity: sha512-lI5iJfbAC3dSakwq5+/JP58mLftxlDPPeY5ttcIuSHmNV/oobETJFTbWRIojUWYYn0E+Eea2OSdY5jPqxI7+iA==} + engines: {node: '>=8'} + peerDependencies: + next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 + react: 16.x || 17.x || 18.x + webpack: '>= 4.0.0' + peerDependenciesMeta: + webpack: + optional: true + dependencies: + '@rollup/plugin-commonjs': 24.0.0(rollup@2.78.0) + '@sentry/core': 7.113.0 + '@sentry/integrations': 7.113.0 + '@sentry/node': 7.113.0 + '@sentry/react': 7.113.0(react@18.2.0) + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + '@sentry/vercel-edge': 7.113.0 + '@sentry/webpack-plugin': 1.21.0 + chalk: 3.0.0 + next: 14.1.0(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + resolve: 1.22.8 + rollup: 2.78.0 + stacktrace-parser: 0.1.10 + webpack: 5.78.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@sentry/node@7.113.0: + resolution: {integrity: sha512-Vam4Ia0I9fhVw8GJOzcLP7MiiHJSKl8L9LzLMMLG3+2/dFnDQOyS7sOfk3GqgpwzqPiusP9vFu7CFSX7EMQbTg==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.113.0 + '@sentry/core': 7.113.0 + '@sentry/integrations': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + /@sentry/node@7.47.0: resolution: {integrity: sha512-LTg2r5EV9yh4GLYDF+ViSltR9LLj/pcvk8YhANJcMO3Fp//xh8njcdU0FC2yNthUREawYDzAsVzLyCYJfV0H1A==} engines: {node: '>=8'} @@ -23311,6 +25621,20 @@ packages: - supports-color dev: false + /@sentry/react@7.113.0(react@18.2.0): + resolution: {integrity: sha512-+zVPz+h5Wydq4ntekw3/dXq5jeHIpZoQ2iqhB96PA9Y94JIq178i/xIP204S1h6rN7cmWAqtR93vnPKdxnlUbQ==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + dependencies: + '@sentry/browser': 7.113.0 + '@sentry/core': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + /@sentry/react@7.47.0(react@17.0.2): resolution: {integrity: sha512-Qy6OnlE8FivKOLo0YE7tkr+G5fLmEOkpPxj179wbY/N8kp/ALkqbVdcOrZW7AL6HCc0lphhj+0SB+tpwoPEsiQ==} engines: {node: '>=8'} @@ -23325,6 +25649,16 @@ packages: tslib: 1.14.1 dev: false + /@sentry/replay@7.113.0: + resolution: {integrity: sha512-UD2IaphOWKFdeGR+ZiaNAQ+wFsnwbJK6PNwcW6cHmWKv9COlKufpFt06lviaqFZ8jmNrM4H+r+R8YVTrqCuxgg==} + engines: {node: '>=12'} + dependencies: + '@sentry-internal/tracing': 7.113.0 + '@sentry/core': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + /@sentry/replay@7.47.0: resolution: {integrity: sha512-BFpVZVmwlezZ83y0L43TCTJY142Fxh+z+qZSwTag5HlhmIpBKw/WKg06ajOhrYJbCBkhHmeOvyKkxX0jnc39ZA==} engines: {node: '>=12'} @@ -23341,6 +25675,11 @@ packages: '@sentry-internal/tracing': 7.47.0 dev: false + /@sentry/types@7.113.0: + resolution: {integrity: sha512-PJbTbvkcPu/LuRwwXB1He8m+GjDDLKBtu3lWg5xOZaF5IRdXQU2xwtdXXsjge4PZR00tF7MO7X8ZynTgWbYaew==} + engines: {node: '>=8'} + dev: false + /@sentry/types@7.47.0: resolution: {integrity: sha512-GxXocplN0j1+uczovHrfkykl9wvkamDtWxlPUQgyGlbLGZn+UH1Y79D4D58COaFWGEZdSNKr62gZAjfEYu9nQA==} engines: {node: '>=8'} @@ -23351,6 +25690,13 @@ packages: engines: {node: '>=8'} dev: false + /@sentry/utils@7.113.0: + resolution: {integrity: sha512-nzKsErwmze1mmEsbW2AwL2oB+I5v6cDEJY4sdfLekA4qZbYZ8pV5iWza6IRl4XfzGTE1qpkZmEjPU9eyo0yvYw==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.113.0 + dev: false + /@sentry/utils@7.47.0: resolution: {integrity: sha512-A89SaOLp6XeZfByeYo2C8Ecye/YAtk/gENuyOUhQEdMulI6mZdjqtHAp7pTMVgkBc/YNARVuoa+kR/IdRrTPkQ==} engines: {node: '>=8'} @@ -23367,6 +25713,28 @@ packages: tslib: 2.6.2 dev: false + /@sentry/vercel-edge@7.113.0: + resolution: {integrity: sha512-cHbo+v7ECRNluVWMJZqsNelf3JrV5Qw/aRH4Dw74IdErCYROAQx1pEuE7BnM3rIEgOQAMR/J/Fu7GFGecSbzTA==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.113.0 + '@sentry/core': 7.113.0 + '@sentry/integrations': 7.113.0 + '@sentry/types': 7.113.0 + '@sentry/utils': 7.113.0 + dev: false + + /@sentry/webpack-plugin@1.21.0: + resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} + engines: {node: '>= 8'} + dependencies: + '@sentry/cli': 1.77.3 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: @@ -26704,7 +29072,7 @@ packages: ejs: 3.1.9 esbuild: 0.18.20 esbuild-plugin-alias: 0.2.1 - express: 4.18.2 + express: 4.18.3 find-cache-dir: 3.3.2 fs-extra: 11.2.0 process: 0.11.10 @@ -26750,7 +29118,7 @@ packages: case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 css-loader: 6.7.3(webpack@5.78.0) - express: 4.18.2 + express: 4.18.3 fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.78.0) fs-extra: 11.2.0 html-webpack-plugin: 5.5.3(webpack@5.78.0) @@ -26758,7 +29126,7 @@ packages: process: 0.11.10 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - semver: 7.5.4 + semver: 7.6.0 style-loader: 3.3.2(webpack@5.78.0) swc-loader: 0.2.3(@swc/core@1.3.107)(webpack@5.78.0) terser-webpack-plugin: 5.3.9(@swc/core@1.3.107)(esbuild@0.18.20)(webpack@5.78.0) @@ -26818,7 +29186,7 @@ packages: case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 css-loader: 6.7.3(webpack@5.78.0) - express: 4.18.2 + express: 4.18.3 fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.78.0) fs-extra: 11.2.0 html-webpack-plugin: 5.5.3(webpack@5.78.0) @@ -26826,7 +29194,7 @@ packages: process: 0.11.10 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - semver: 7.5.4 + semver: 7.6.0 style-loader: 3.3.2(webpack@5.78.0) swc-loader: 0.2.3(@swc/core@1.3.107)(webpack@5.78.0) terser-webpack-plugin: 5.3.9(@swc/core@1.3.107)(esbuild@0.18.20)(webpack@5.78.0) @@ -26907,7 +29275,7 @@ packages: detect-indent: 6.1.0 envinfo: 7.8.1 execa: 5.1.1 - express: 4.18.2 + express: 4.18.3 find-up: 5.0.0 fs-extra: 11.2.0 get-npm-tarball-url: 2.0.3 @@ -26921,7 +29289,7 @@ packages: prompts: 2.4.2 puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 - semver: 7.5.4 + semver: 7.6.0 simple-update-notifier: 2.0.0 strip-json-comments: 3.1.1 tempy: 1.0.1 @@ -27135,7 +29503,7 @@ packages: cli-table3: 0.6.3 compression: 1.7.4 detect-port: 1.5.1 - express: 4.18.2 + express: 4.18.3 fs-extra: 11.2.0 globby: 11.1.0 ip: 2.0.0 @@ -27144,7 +29512,7 @@ packages: pretty-hrtime: 1.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 - semver: 7.5.4 + semver: 7.6.0 serve-favicon: 2.5.0 telejson: 7.2.0 tiny-invariant: 1.3.1 @@ -27262,7 +29630,7 @@ packages: memoizerific: 1.11.3 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - semver: 7.5.4 + semver: 7.6.0 store2: 2.14.2 telejson: 7.2.0 ts-dedent: 2.2.0 @@ -27286,7 +29654,7 @@ packages: memoizerific: 1.11.3 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - semver: 7.5.4 + semver: 7.6.0 store2: 2.14.2 telejson: 7.2.0 ts-dedent: 2.2.0 @@ -27364,7 +29732,7 @@ packages: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-refresh: 0.11.0 - semver: 7.5.4 + semver: 7.6.0 typescript: 4.9.5 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: @@ -27413,7 +29781,7 @@ packages: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-refresh: 0.11.0 - semver: 7.5.4 + semver: 7.6.0 typescript: 4.9.5 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: @@ -27924,7 +30292,6 @@ packages: dependencies: '@swc/core': 1.3.107 '@swc/types': 0.1.6 - dev: true /@swc-node/register@1.8.0(@swc/core@1.3.107)(@swc/types@0.1.6)(typescript@5.4.5): resolution: {integrity: sha512-8K3589HoBSmVmrEVrtr4K5sWEithpGDzcFGic81OW0A9sZY38IV5EGRODQWCk0SBDyLhaF+pid120vJAtsHo1A==} @@ -27943,14 +30310,12 @@ packages: transitivePeerDependencies: - '@swc/types' - supports-color - dev: true /@swc-node/sourcemap-support@0.4.0: resolution: {integrity: sha512-weuRmYTO+4yOtHtPZHXlPdA1dJJJp3QOoZAFZ6uZidu992F2X5v1fQdnb26xs1o3Ex/e2sYhRyY5R6NGNuoATQ==} dependencies: source-map-support: 0.5.21 tslib: 2.6.2 - dev: true /@swc/core-darwin-arm64@1.3.107: resolution: {integrity: sha512-47tD/5vSXWxPd0j/ZllyQUg4bqalbQTsmqSw0J4dDdS82MWqCAwUErUrAZPRjBkjNQ6Kmrf5rpCWaGTtPw+ngw==} @@ -28059,6 +30424,11 @@ packages: /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + dependencies: + tslib: 2.6.2 + /@swc/types@0.1.6: resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} dependencies: @@ -28071,6 +30441,20 @@ packages: defer-to-connect: 2.0.1 dev: false + /@tabler/icons-react@2.47.0(react@18.2.0): + resolution: {integrity: sha512-iqly2FvCF/qUbgmvS8E40rVeYY7laltc5GUjRxQj59DuX0x/6CpKHTXt86YlI2whg4czvd/c8Ce8YR08uEku0g==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + '@tabler/icons': 2.47.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@tabler/icons@2.47.0: + resolution: {integrity: sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA==} + dev: false + /@tanstack/match-sorter-utils@8.8.4: resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} engines: {node: '>=12'} @@ -28082,6 +30466,10 @@ packages: resolution: {integrity: sha512-vkPewLEG8ua0efo3SsVT0BcBtkq5RZX8oPhDAyKL+k/rdOYSQTEocfGEXSaBwIwsXeOGBUpfKqI+UmHvNqdWXg==} dev: false + /@tanstack/query-core@5.35.1: + resolution: {integrity: sha512-0Dnpybqb8+ps6WgqBnqFEC+1F/xLvUosRAq+wiGisTgolOZzqZfkE2995dEXmhuzINiTM7/a6xSGznU0NIvBkw==} + dev: false + /@tanstack/react-query-devtools@4.29.1(@tanstack/react-query@4.29.1)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-lbtNGArplXLVmY8eEh8LFqZz61PJI38sASEcuKoSnEK8UgWvLCwY5vjlT8fzk10yQ4jhR3+PHKLDMXA5ifCTXw==} peerDependencies: @@ -28115,6 +30503,15 @@ packages: use-sync-external-store: 1.2.0(react@17.0.2) dev: false + /@tanstack/react-query@5.35.1(react@18.2.0): + resolution: {integrity: sha512-i2T7m2ffQdNqlX3pO+uMsnQ0H4a59Ens2GxtlMsRiOvdSB4SfYmHb27MnvFV8rGmtWRaa4gPli0/rpDoSS5LbQ==} + peerDependencies: + react: ^18.0.0 + dependencies: + '@tanstack/query-core': 5.35.1 + react: 18.2.0 + dev: false + /@taskforcesh/bullmq-pro@5.1.14: resolution: {integrity: sha512-J/83Q1GTFWbUWn1bpsiX+CcQXktp7ADg/d1oID+wQ8ZwSB2W5l/1FV4yR1BEi3sO+UFEo+rK3qfXQuDml7aBYA==, tarball: https://npm.taskforce.sh/@taskforcesh/bullmq-pro/-/@taskforcesh/bullmq-pro-5.1.14.tgz} requiresBuild: true @@ -28356,6 +30753,15 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@ts-morph/common@0.11.1: + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + dependencies: + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: true + /@ts-morph/common@0.22.0: resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} dependencies: @@ -28551,7 +30957,7 @@ packages: /@types/cookies@0.7.10: resolution: {integrity: sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ==} dependencies: - '@types/connect': 3.4.35 + '@types/connect': 3.4.36 '@types/express': 4.17.17 '@types/keygrip': 1.0.6 '@types/node': 14.18.42 @@ -28568,6 +30974,10 @@ packages: '@types/node': 14.18.42 dev: true + /@types/css-font-loading-module@0.0.7: + resolution: {integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==} + dev: false + /@types/d3-array@3.0.4: resolution: {integrity: sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==} dev: false @@ -28996,6 +31406,13 @@ packages: expect: 29.5.0 pretty-format: 29.5.0 + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + /@types/jest@29.5.2: resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} dependencies: @@ -29189,12 +31606,12 @@ packages: /@types/newrelic@9.14.0: resolution: {integrity: sha512-1jqbAMf6pKjAPJ8NC6VqZoylpBR6kejuw4qL3Mk8dworih+AXADki4WaUIWTzo7ERm6aykPl8xt1/J1invp6Mg==} - /@types/node-fetch@2.6.5: - resolution: {integrity: sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==} + /@types/node-fetch@2.6.3: + resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: '@types/node': 14.18.42 - form-data: 4.0.0 - dev: false + form-data: 3.0.1 + dev: true /@types/node-fetch@2.6.6: resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} @@ -29209,6 +31626,10 @@ packages: /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + /@types/node@14.18.33: + resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} + dev: true + /@types/node@14.18.42: resolution: {integrity: sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==} @@ -29230,6 +31651,12 @@ packages: /@types/node@18.18.5: resolution: {integrity: sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==} + /@types/node@20.12.10: + resolution: {integrity: sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@20.5.1: resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} requiresBuild: true @@ -29739,7 +32166,7 @@ packages: grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -29989,7 +32416,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -30010,7 +32437,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.6.3) typescript: 4.6.3 transitivePeerDependencies: @@ -30031,7 +32458,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -30052,7 +32479,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -30095,7 +32522,7 @@ packages: '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) eslint: 8.38.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -30115,7 +32542,7 @@ packages: '@typescript-eslint/typescript-estree': 5.58.0(typescript@4.9.5) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -30135,7 +32562,7 @@ packages: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 8.38.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -30155,7 +32582,7 @@ packages: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -30230,6 +32657,49 @@ packages: crypto-js: 4.2.0 dev: false + /@vercel/build-utils@6.8.3: + resolution: {integrity: sha512-C86OPuPAvG/pSr27DPKecmptkYYsgyhOKdHTLv9jI3Pv1yvru78k+JjrAyn7N+0ev75KNV0Prv4P3p76168ePw==} + dev: true + + /@vercel/error-utils@1.0.10: + resolution: {integrity: sha512-nsKy2sy+pjUWyKI1V/XXKspVzHMYgSalmj5+EsKWFXZbnNZicqxNtMR94J8Hs7SB4TQxh0s4KhczJtL59AVGMg==} + dev: true + + /@vercel/node@2.15.10: + resolution: {integrity: sha512-IfnqnKAJlL1+0FSDJgxoe9J3kfYAgPGDjz4aO/H5FSjvqP7cKJnns1F9GsQq4pM499+TY8T8mKAdos7/m+WOEw==} + dependencies: + '@edge-runtime/node-utils': 2.0.3 + '@edge-runtime/primitives': 2.1.2 + '@edge-runtime/vm': 3.0.1 + '@types/node': 14.18.33 + '@types/node-fetch': 2.6.3 + '@vercel/build-utils': 6.8.3 + '@vercel/error-utils': 1.0.10 + '@vercel/static-config': 2.0.17 + async-listen: 3.0.0 + content-type: 1.0.5 + edge-runtime: 2.4.4 + esbuild: 0.14.47 + exit-hook: 2.2.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + dev: true + + /@vercel/static-config@2.0.17: + resolution: {integrity: sha512-2f50OTVrN07x7pH+XNW0e7cj7T+Ufg+19+a2N3/XZBjQmV+FaMlmSLiaQ4tBxp2H8lWWHzENua7ZSSQPtRZ3/A==} + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + dev: true + /@verdaccio/commons-api@10.2.0: resolution: {integrity: sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==} engines: {node: '>=8'} @@ -30919,7 +33389,7 @@ packages: '@vue/compiler-dom': 3.3.7 '@vue/shared': 3.3.7 computeds: 0.0.1 - minimatch: 9.0.3 + minimatch: 9.0.4 muggle-string: 0.3.1 typescript: 4.9.5 vue-template-compiler: 2.7.14 @@ -31231,6 +33701,10 @@ packages: tslib: 1.14.1 dev: true + /@xstate/fsm@1.6.5: + resolution: {integrity: sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==} + dev: false + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -31388,7 +33862,6 @@ packages: /acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - dev: true /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} @@ -31551,6 +34024,15 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 + /ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -31712,6 +34194,59 @@ packages: scroll-into-view-if-needed: 2.2.31 dev: false + /antd@4.24.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/react-slick': 0.29.2(react@18.2.0) + '@babel/runtime': 7.21.0 + '@ctrl/tinycolor': 3.6.0 + classnames: 2.3.2 + copy-to-clipboard: 3.3.3 + lodash: 4.17.21 + moment: 2.29.4 + rc-cascader: 3.7.2(react-dom@18.2.0)(react@18.2.0) + rc-checkbox: 2.3.2(react-dom@18.2.0)(react@18.2.0) + rc-collapse: 3.4.2(react-dom@18.2.0)(react@18.2.0) + rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0) + rc-drawer: 6.1.5(react-dom@18.2.0)(react@18.2.0) + rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) + rc-field-form: 1.27.4(react-dom@18.2.0)(react@18.2.0) + rc-image: 5.13.0(react-dom@18.2.0)(react@18.2.0) + rc-input: 0.1.4(react-dom@18.2.0)(react@18.2.0) + rc-input-number: 7.3.11(react-dom@18.2.0)(react@18.2.0) + rc-mentions: 1.13.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-notification: 4.6.1(react-dom@18.2.0)(react@18.2.0) + rc-pagination: 3.2.0(react-dom@18.2.0)(react@18.2.0) + rc-picker: 2.7.0(react-dom@18.2.0)(react@18.2.0) + rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0) + rc-rate: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-segmented: 2.1.2(react-dom@18.2.0)(react@18.2.0) + rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0) + rc-slider: 10.0.1(react-dom@18.2.0)(react@18.2.0) + rc-steps: 5.0.0(react-dom@18.2.0)(react@18.2.0) + rc-switch: 3.2.2(react-dom@18.2.0)(react@18.2.0) + rc-table: 7.26.0(react-dom@18.2.0)(react@18.2.0) + rc-tabs: 12.5.10(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0) + rc-tooltip: 5.2.2(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.3(react-dom@18.2.0)(react@18.2.0) + rc-tree-select: 5.5.5(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scroll-into-view-if-needed: 2.2.31 + dev: false + /any-observable@0.3.0(rxjs@6.6.7): resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} engines: {node: '>=6'} @@ -32267,6 +34802,11 @@ packages: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true + /async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + dev: true + /async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} dependencies: @@ -32354,7 +34894,7 @@ packages: postcss: ^8.4.31 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001525 + caniuse-lite: 1.0.30001589 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -32488,6 +35028,16 @@ packages: transitivePeerDependencies: - debug + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: @@ -32998,6 +35548,15 @@ packages: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} dev: false + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + dev: false + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -33305,7 +35864,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001525 + caniuse-lite: 1.0.30001589 electron-to-chromium: 1.4.508 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) @@ -33315,7 +35874,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001525 + caniuse-lite: 1.0.30001589 electron-to-chromium: 1.4.508 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.5) @@ -33410,7 +35969,7 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /bull@4.10.4: @@ -33735,9 +36294,6 @@ packages: resolution: {integrity: sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ==} dev: false - /caniuse-lite@1.0.30001525: - resolution: {integrity: sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==} - /caniuse-lite@1.0.30001589: resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==} @@ -33825,6 +36381,35 @@ packages: - '@types/react' dev: false + /chakra-react-select@4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.10.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ZL43hyXPnWf1g/HjsZDecbeJ4F2Q6tTPYJozlKWkrQ7lIX7ORP0aZYwmc5/Wly4UNzMimj2Vuosl6MmIXH+G2g==} + peerDependencies: + '@chakra-ui/form-control': ^2.0.0 + '@chakra-ui/icon': ^3.0.0 + '@chakra-ui/layout': ^2.0.0 + '@chakra-ui/media-query': ^3.0.0 + '@chakra-ui/menu': ^2.0.0 + '@chakra-ui/spinner': ^2.0.0 + '@chakra-ui/system': ^2.0.0 + '@emotion/react': ^11.8.1 + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@11.1.9)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@emotion/react': 11.10.6(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-select: 5.7.7(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /chalk-animation@1.6.0: resolution: {integrity: sha512-Q8vVq6eD5IOhWI0s9WdUawDzMRjNrR4rOCiu409eZRTIHID5OjoTTEkpGZngL/BPQnL7yYmBhlXXpPJ9SYuARw==} engines: {node: '>=4'} @@ -33908,11 +36493,9 @@ packages: /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: false /character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: false /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -33920,7 +36503,6 @@ packages: /character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: false /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -34065,6 +36647,11 @@ packages: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: true + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} @@ -34096,6 +36683,10 @@ packages: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: false + /clean-css@4.2.4: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} @@ -34109,6 +36700,13 @@ packages: dependencies: source-map: 0.6.1 + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -34181,6 +36779,9 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + /clipanion@3.2.1(typanion@3.14.0): resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} peerDependencies: @@ -34253,6 +36854,11 @@ packages: engines: {node: '>=6'} dev: false + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -34278,6 +36884,10 @@ packages: q: 1.5.1 dev: true + /code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + dev: true + /code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} dev: true @@ -34371,7 +36981,6 @@ packages: /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true /colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} @@ -34832,6 +37441,11 @@ packages: q: 1.5.1 dev: true + /convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + dev: true + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -34913,6 +37527,12 @@ packages: dependencies: browserslist: 4.21.10 + /core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + dependencies: + browserslist: 4.23.0 + dev: true + /core-js-pure@3.30.0: resolution: {integrity: sha512-+2KbMFGeBU0ln/csoPqTe0i/yfHbrd2EUhNMObsGtXMKS/RTtlkYyi+/3twLcevbgNR0yM/r0Psa3TEoQRpFMQ==} requiresBuild: true @@ -34951,7 +37571,7 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /cosmiconfig-typescript-loader@4.3.0(@types/node@14.18.42)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.5): + /cosmiconfig-typescript-loader@4.3.0(@types/node@14.18.42)(cosmiconfig@8.2.0)(ts-node@10.9.2)(typescript@5.4.5): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -34962,11 +37582,11 @@ packages: dependencies: '@types/node': 14.18.42 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@14.18.42)(typescript@4.9.5) - typescript: 4.9.5 + ts-node: 10.9.2(@types/node@14.18.42)(typescript@5.4.5) + typescript: 5.4.5 dev: true - /cosmiconfig-typescript-loader@4.3.0(@types/node@20.5.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@4.9.5): + /cosmiconfig-typescript-loader@4.3.0(@types/node@20.5.1)(cosmiconfig@8.2.0)(ts-node@10.9.2)(typescript@5.4.5): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -34977,8 +37597,8 @@ packages: dependencies: '@types/node': 20.5.1 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@4.9.5) - typescript: 4.9.5 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.4.5) + typescript: 5.4.5 dev: true optional: true @@ -35054,6 +37674,22 @@ packages: path-type: 4.0.0 dev: true + /cosmiconfig@9.0.0(typescript@4.9.5): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 4.9.5 + dev: true + /cpx@1.5.0: resolution: {integrity: sha512-jHTjZhsbg9xWgsP2vuNW2jnnzBX+p4T+vNI9Lbjzs1n4KhOfa22bQppiFYLsWQKd8TzmL5aSP/Me3yfsCwXbDA==} hasBin: true @@ -35125,6 +37761,25 @@ packages: - ts-node dev: true + /create-jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -35552,7 +38207,7 @@ packages: postcss-modules-scope: 3.0.0(postcss@8.4.35) postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true @@ -35569,7 +38224,7 @@ packages: postcss-modules-scope: 3.0.0(postcss@8.4.35) postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.88.2(esbuild@0.18.17) dev: true @@ -36113,7 +38768,6 @@ packages: /dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: true /dayjs@1.11.9: resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} @@ -36385,13 +39039,8 @@ packages: isobject: 3.0.1 dev: true - /defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} - dev: true - /defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - dev: false /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} @@ -36575,7 +39224,6 @@ packages: /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} - dev: true /dir-glob@2.2.2: resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} @@ -36736,6 +39384,14 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + /dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} dependencies: @@ -36834,6 +39490,22 @@ packages: dependencies: safe-buffer: 5.2.1 + /edge-runtime@2.4.4: + resolution: {integrity: sha512-uq1YdIxkMDsBYLdSSp/w62PciCL46ic4m1Z/2G6N8RcAPI8p35O8u6hJQT83j28Dnt4U5iyvmwFMYouHMK51uA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@edge-runtime/format': 2.1.0 + '@edge-runtime/vm': 3.0.3 + async-listen: 3.0.0 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-bytes: 5.6.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + dev: true + /editorconfig@0.15.3: resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} hasBin: true @@ -37203,6 +39875,150 @@ packages: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} dev: true + /esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} dev: true @@ -37217,6 +40033,15 @@ packages: transitivePeerDependencies: - supports-color + /esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /esbuild-wasm@0.18.17: resolution: {integrity: sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==} engines: {node: '>=12'} @@ -37229,6 +40054,61 @@ packages: hasBin: true dev: true + /esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + dev: true + /esbuild@0.18.17: resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} engines: {node: '>=12'} @@ -37399,6 +40279,25 @@ packages: optionalDependencies: source-map: 0.6.1 + /eslint-config-adjunct@4.13.0(typescript@4.9.5): + resolution: {integrity: sha512-UHVbgnrSlJZ27ZCDnP2KNz54aIJk2t3mrnneGCD51kOg1jxxHz4Av6SxhLIGKRugqchaglvy6gMzpGTtzmkWNg==} + engines: {node: '>= 6.5'} + dependencies: + '@eslint/eslintrc': 3.0.2 + arrify: 2.0.1 + cosmiconfig: 9.0.0(typescript@4.9.5) + lodash: 4.17.21 + mkdirp: 3.0.1 + path: 0.12.7 + ramda: 0.29.1 + read-pkg-up: 7.0.1 + rimraf: 5.0.5 + url: 0.11.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.28.1)(eslint@8.38.0): resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} @@ -37429,6 +40328,24 @@ packages: eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-webpack@0.13.7)(eslint@8.38.0) dev: true + /eslint-config-auto@0.9.0(typescript@4.9.5): + resolution: {integrity: sha512-01brVJWU2THr9ReGT7nJL9Jye0IosAFVZjJMGM0DXENOrZ9iNug5X+Ak1382FCsXN4NTC61C0VTq471bT8Wo4Q==} + engines: {node: '>= 8.3'} + dependencies: + arrify: 2.0.1 + cosmiconfig: 9.0.0(typescript@4.9.5) + eslint-config-adjunct: 4.13.0(typescript@4.9.5) + lodash: 4.17.21 + mkdir: 0.0.2 + mkdirp: 3.0.1 + ramda: 0.29.1 + read-pkg-up: 7.0.1 + rimraf: 5.0.5 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-config-prettier@8.8.0(eslint@8.38.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true @@ -37576,6 +40493,31 @@ packages: - supports-color dev: true + /eslint-plugin-chai-expect@3.0.0(eslint@8.38.0): + resolution: {integrity: sha512-NS0YBcToJl+BRKBSMCwRs/oHJIX67fG5Gvb4tGked+9Wnd1/PzKijd82B2QVKcSSOwRe+pp4RAJ2AULeck4eQw==} + engines: {node: 10.* || 12.* || >= 14.*} + peerDependencies: + eslint: '>=2.0.0 <= 8.x' + dependencies: + eslint: 8.38.0 + dev: true + + /eslint-plugin-chai-friendly@0.7.4(eslint@8.38.0): + resolution: {integrity: sha512-PGPjJ8diYgX1mjLxGJqRop2rrGwZRKImoEOwUOgoIhg0p80MkTaqvmFLe5TF7/iagZHggasvIfQlUyHIhK/PYg==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=3.0.0' + dependencies: + eslint: 8.38.0 + dev: true + + /eslint-plugin-const-case@1.2.2: + resolution: {integrity: sha512-ON8VLOfGqXRW9Zck+lhgT5k6+jAW+lH7RRjH0YvA42trYhSq6Ayq8m3frqCJhlArDwfPKnjHVVyZhQurTDL3OQ==} + engines: {node: '>=10'} + dependencies: + requireindex: 1.2.0 + dev: true + /eslint-plugin-cypress@2.15.1(eslint@8.57.0): resolution: {integrity: sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==} peerDependencies: @@ -37645,6 +40587,13 @@ packages: - supports-color dev: true + /eslint-plugin-html@8.1.1: + resolution: {integrity: sha512-6qmlJsc40D2m3Dn9oEH+0PAOkJhxVu0f5sVItqpCE0YWgYnyP4xCjBc3UWTHaJcY9ARkWOLIIuXLq0ndRnQOHw==} + engines: {node: '>=16.0.0'} + dependencies: + htmlparser2: 9.1.0 + dev: true + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-webpack@0.13.7)(eslint@8.38.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} @@ -37715,6 +40664,28 @@ packages: - supports-color dev: true + /eslint-plugin-jest-async@1.0.3: + resolution: {integrity: sha512-NgpO6L9IWWgxxqbqvN+mCbGs4MMBsALpvagOFnWJgsQSkyYVmMzYwVe2b4Wpak3sfl8sPK13vnpqsEBNlpyTlQ==} + engines: {node: '>=0.10.0'} + dependencies: + requireindex: 1.1.0 + dev: true + + /eslint-plugin-jest-dom@5.4.0(eslint@8.38.0): + resolution: {integrity: sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': ^8.0.0 || ^9.0.0 || ^10.0.0 + eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + '@testing-library/dom': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + eslint: 8.38.0 + requireindex: 1.2.0 + dev: true + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.57.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -37737,6 +40708,36 @@ packages: - typescript dev: true + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.38.0)(jest@27.5.1)(typescript@4.9.5): + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.38.0)(typescript@4.9.5) + eslint: 8.38.0 + jest: 27.5.1(ts-node@10.9.1) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.38.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} @@ -37768,7 +40769,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.23.2 aria-query: 5.1.3 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -37787,7 +40788,94 @@ packages: semver: 6.3.1 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.8): + /eslint-plugin-markdown@3.0.1(eslint@8.38.0): + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.38.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-mocha-cleanup@1.11.3(eslint@8.38.0): + resolution: {integrity: sha512-LL4yt52+asxZmeqU6Ypr5XxN6CzJTKxu/YsbHEr0L/pArcS/acn49nNfrJluRSJ8N9MD1mtuI/V1jEfjPzQ1qQ==} + engines: {node: '>=8.0.0'} + peerDependencies: + eslint: '>=0.8.0' + dependencies: + eslint: 8.38.0 + requireindex: 1.2.0 + dev: true + + /eslint-plugin-mocha@10.4.3(eslint@8.38.0): + resolution: {integrity: sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.38.0 + eslint-utils: 3.0.0(eslint@8.38.0) + globals: 13.24.0 + rambda: 7.5.0 + dev: true + + /eslint-plugin-no-constructor-bind@2.0.4: + resolution: {integrity: sha512-r0CGAE5SrRYt1OdACNiZGiOcBbFslKIPnMrFo3kPmX3iKZOm8HRD2eIbqhlc9lSSiBWcPZxXErXnroqgt+dKBg==} + engines: {node: '>=8.0.0'} + dependencies: + requireindex: 1.2.0 + dev: true + + /eslint-plugin-no-secrets@0.8.9(eslint@8.38.0): + resolution: {integrity: sha512-CqaBxXrImABCtxMWspAnm8d5UKkpNylC7zqVveb+fJHEvsSiNGJlSWzdSIvBUnW1XhJXkzifNIZQC08rEII5Ng==} + engines: {node: '>=10.0.0', npm: '>=6.9.0'} + peerDependencies: + eslint: '>=3.0.0' + dependencies: + eslint: 8.38.0 + dev: true + + /eslint-plugin-no-unsanitized@4.0.2(eslint@8.38.0): + resolution: {integrity: sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==} + peerDependencies: + eslint: ^6 || ^7 || ^8 + dependencies: + eslint: 8.38.0 + dev: true + + /eslint-plugin-no-use-extend-native@0.5.0: + resolution: {integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==} + engines: {node: '>=6.0.0'} + dependencies: + is-get-set-prop: 1.0.0 + is-js-type: 2.0.0 + is-obj-prop: 1.0.0 + is-proto-prop: 2.0.0 + dev: true + + /eslint-plugin-optimize-regex@1.2.1: + resolution: {integrity: sha512-fUaU7Tj1G/KSTDTABJw4Wp427Rl7RPl9ViYTu1Jrv36fJw4DFhd4elPdXiuYtdPsNsvzn9GcVlKEssGIVjw0UQ==} + engines: {node: '>=10'} + dependencies: + regexp-tree: 0.1.27 + dev: true + + /eslint-plugin-pii@1.0.2(eslint@8.38.0): + resolution: {integrity: sha512-UKOpjAxd2aGDfykeICHi6yceZOQD4KXTX25A/PLq1HCgkFRudRTvGkRzuDYZoI6oLj8TjHsEiHnDxkoapFKX4Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 4.0.0 + eslint: 8.38.0 + ignore: 5.2.4 + requireindex: 1.1.0 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@3.2.5): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -37800,7 +40888,7 @@ packages: dependencies: eslint: 7.32.0 eslint-config-prettier: 8.8.0(eslint@8.38.0) - prettier: 2.8.8 + prettier: 3.2.5 prettier-linter-helpers: 1.0.0 dev: true @@ -37899,6 +40987,29 @@ packages: string.prototype.matchall: 4.0.8 dev: true + /eslint-plugin-security@2.1.1: + resolution: {integrity: sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==} + dependencies: + safe-regex: 2.1.1 + dev: true + + /eslint-plugin-simple-import-sort@12.1.0(eslint@8.38.0): + resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 8.38.0 + dev: true + + /eslint-plugin-sonarjs@0.24.0(eslint@8.38.0): + resolution: {integrity: sha512-87zp50mbbNrSTuoEOebdRQBPa0mdejA5UEjyuScyIw8hEpEjfWP89Qhkq5xVZfVyVSRQKZc9alVm7yRKQvvUmg==} + engines: {node: '>=16'} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.38.0 + dev: true + /eslint-plugin-spellcheck@0.0.20(eslint@8.38.0): resolution: {integrity: sha512-GJa6vgzWAYqe0elKADAsiBRrhvqBnKyt7tpFSqlCZJsK2W9+K80oMyHhKolA7vJ13H5RCGs5/KCN+mKUyKoAiA==} peerDependencies: @@ -37926,6 +41037,14 @@ packages: - typescript dev: true + /eslint-plugin-switch-case@1.1.2: + resolution: {integrity: sha512-mhDdJ6WX5LKv0PccziefBGPhIryJamgd3vTNqhEZUBeTGUeGdsgttwU/68xOViyScwr8RqCwTGC2Pd1cPYGNRg==} + engines: {node: '>=4'} + dependencies: + lodash.last: 3.0.0 + lodash.zipobject: 4.1.3 + dev: true + /eslint-plugin-testing-library@5.10.2(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-f1DmDWcz5SDM+IpCkEX0lbFqrrTs8HRsEElzDEqN/EBI0hpRj8Cns5+IVANXswE8/LeybIJqPAOQIFu2j5Y5sw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} @@ -37939,6 +41058,33 @@ packages: - typescript dev: true + /eslint-plugin-unicorn@51.0.1(eslint@8.38.0): + resolution: {integrity: sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 + clean-regexp: 1.0.0 + core-js-compat: 3.37.0 + eslint: 8.38.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.0 + strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-vue@9.10.0(eslint@8.38.0): resolution: {integrity: sha512-2MgP31OBf8YilUvtakdVMc8xVbcMp7z7/iQj8LHVpXrSXHPXSJRUIGSPFI6b6pyCx/buKaFJ45ycqfHvQRiW2g==} engines: {node: ^14.17.0 || >=16.0.0} @@ -37957,6 +41103,13 @@ packages: - supports-color dev: true + /eslint-plugin-xss@0.1.12: + resolution: {integrity: sha512-L5oYaD//ZE7fKNtWUfVgYTRW19jrZlvaHe2swyFLxXQ5pwVQLivi5m92rtXd/ww8yqg4Drasqyi0hlBmhf9YQg==} + engines: {node: '>=0.10.0'} + dependencies: + requireindex: 1.1.0 + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -38015,6 +41168,11 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + /eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.78.0): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} @@ -38220,6 +41378,15 @@ packages: transitivePeerDependencies: - supports-color + /espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + dev: true + /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} @@ -38442,6 +41609,11 @@ packages: resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} dev: false + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: true + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -38834,6 +42006,32 @@ packages: dependencies: bser: 2.1.1 + /fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + dependencies: + fbjs: 3.0.5 + transitivePeerDependencies: + - encoding + dev: false + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false + + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + dependencies: + cross-fetch: 3.1.5 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.37 + transitivePeerDependencies: + - encoding + dev: false + /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: @@ -38888,6 +42086,10 @@ packages: resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} dev: true + /fflate@0.4.8: + resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + dev: false + /fflate@0.8.1: resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==} dev: false @@ -39228,6 +42430,18 @@ packages: readable-stream: 3.6.2 dev: true + /flux@4.0.4(react@18.2.0): + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.5 + react: 18.2.0 + transitivePeerDependencies: + - encoding + dev: false + /fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: false @@ -39259,6 +42473,16 @@ packages: dependencies: debug: 4.3.4(supports-color@8.1.1) + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -39320,7 +42544,7 @@ packages: memfs: 3.5.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.5.4 + semver: 7.6.0 tapable: 1.1.3 typescript: 4.9.5 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) @@ -39333,7 +42557,7 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -39343,7 +42567,7 @@ packages: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.5.4 + semver: 7.6.0 tapable: 2.2.1 typescript: 4.9.5 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) @@ -39455,6 +42679,25 @@ packages: map-cache: 0.2.2 dev: true + /framer-motion@11.1.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-flECDIPV4QDNcOrDafVFiIazp8X01HFpzc01eDKJsdNH/wrATcYydJSH9JbPWMS8UD5lZlw+J1sK8LG2kICgqw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + /framer-motion@5.6.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-Y4FtwUU+LUWLKSzoT6Sq538qluvhpe6izdQK8/xZeVjQZ/ORKGfZzyhzcUxNfscqnfEa3dUOA47s+dwrSipdGA==} peerDependencies: @@ -39846,6 +43089,11 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + /get-set-props@0.1.0: + resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} + engines: {node: '>=0.10.0'} + dev: true + /get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} dependencies: @@ -39948,7 +43196,7 @@ packages: hasBin: true dependencies: colorette: 2.0.19 - defu: 6.1.2 + defu: 6.1.4 https-proxy-agent: 5.0.1 mri: 1.2.0 node-fetch-native: 1.4.0 @@ -40226,6 +43474,18 @@ packages: dependencies: type-fest: 0.20.2 + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -40821,6 +44081,11 @@ packages: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false + /highlight.js@11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + dev: false + /history@5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} dependencies: @@ -40939,7 +44204,6 @@ packages: /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true /html-janitor@2.0.4: resolution: {integrity: sha512-92J5h9jNZRk30PMHapjHEJfkrBWKCOy0bq3oW2pBungky6lzYSoboBGPMvxl1XRKB2q+kniQmsLsPbdpY7RM2g==} @@ -41035,6 +44299,15 @@ packages: domutils: 3.0.1 entities: 4.4.0 + /htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -41540,7 +44813,7 @@ packages: promzard: 0.3.0 read: 1.0.7 read-package-json: 5.0.2 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 validate-npm-package-name: 4.0.0 dev: true @@ -41626,7 +44899,6 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} @@ -41741,14 +45013,12 @@ packages: /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: false /is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: false /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} @@ -41837,7 +45107,6 @@ packages: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.4 - dev: true /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} @@ -41861,7 +45130,6 @@ packages: /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: false /is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} @@ -41954,6 +45222,13 @@ packages: dependencies: has-tostringtag: 1.0.0 + /is-get-set-prop@1.0.0: + resolution: {integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==} + dependencies: + get-set-props: 0.1.0 + lowercase-keys: 1.0.1 + dev: true + /is-glob@2.0.1: resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} engines: {node: '>=0.10.0'} @@ -41974,7 +45249,6 @@ packages: /is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: false /is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} @@ -41992,6 +45266,12 @@ packages: engines: {node: '>= 4'} dev: true + /is-js-type@2.0.0: + resolution: {integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==} + dependencies: + js-types: 1.0.0 + dev: true + /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true @@ -42050,6 +45330,13 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-obj-prop@1.0.0: + resolution: {integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==} + dependencies: + lowercase-keys: 1.0.1 + obj-props: 1.4.0 + dev: true + /is-obj@1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} @@ -42122,11 +45409,17 @@ packages: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: true + /is-proto-prop@2.0.0: + resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} + dependencies: + lowercase-keys: 1.0.1 + proto-props: 2.0.0 + dev: true + /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: '@types/estree': 1.0.5 - dev: true /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -42368,7 +45661,7 @@ packages: '@babel/parser': 7.24.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -42625,9 +45918,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 @@ -42639,6 +45932,7 @@ packages: yargs: 17.7.2 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -42653,9 +45947,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 @@ -42667,6 +45961,7 @@ packages: yargs: 17.7.2 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -42727,6 +46022,34 @@ packages: - ts-node dev: true + /jest-cli@29.7.0(@types/node@20.12.10)(ts-node@10.9.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest-config@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -42760,7 +46083,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@16.11.7)(typescript@4.9.5) + ts-node: 10.9.1(@types/node@14.18.42)(typescript@4.9.5) transitivePeerDependencies: - bufferutil - canvas @@ -42833,11 +46156,11 @@ packages: jest-circus: 29.5.0 jest-environment-node: 29.5.0 jest-get-type: 29.6.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 jest-util: 29.7.0 - jest-validate: 29.5.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 pretty-format: 29.7.0 @@ -42873,11 +46196,11 @@ packages: jest-circus: 29.5.0 jest-environment-node: 29.5.0 jest-get-type: 29.6.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 jest-util: 29.7.0 - jest-validate: 29.5.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 pretty-format: 29.7.0 @@ -42929,6 +46252,47 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@14.18.42)(ts-node@10.9.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.24.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 14.18.42 + babel-jest: 29.7.0(@babel/core@7.24.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@20.12.10)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-config@29.7.0(@types/node@18.16.9)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -42970,6 +46334,47 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@20.12.10)(ts-node@10.9.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.24.4 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + babel-jest: 29.7.0(@babel/core@7.24.4) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@20.12.10)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-diff@24.9.0: resolution: {integrity: sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==} engines: {node: '>= 6'} @@ -43187,7 +46592,7 @@ packages: anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 + jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.5.0 micromatch: 4.0.5 @@ -43336,7 +46741,7 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -43435,7 +46840,6 @@ packages: /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true /jest-resolve-dependencies@27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} @@ -43453,7 +46857,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true @@ -43656,7 +47060,7 @@ packages: jest-mock: 29.7.0 jest-regex-util: 29.4.3 jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 + jest-snapshot: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 @@ -43727,7 +47131,7 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -43758,7 +47162,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -43786,7 +47190,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -44030,6 +47434,7 @@ packages: jest-cli: 29.5.0(@types/node@14.18.42)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -44050,6 +47455,7 @@ packages: jest-cli: 29.5.0(@types/node@18.15.11)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: true @@ -44096,6 +47502,27 @@ packages: - ts-node dev: true + /jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jira-prepare-commit-msg@1.7.2: resolution: {integrity: sha512-vPmwqPoi5TfMF1rXh9XN6u7TiSG+FwdcbeL01nMBUbRRxTMXvIqQZoJSRoNoprgY1JUpYXplc3HGRSVsV22rLg==} engines: {node: '>=14'} @@ -44165,6 +47592,11 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-types@1.0.0: + resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} + engines: {node: '>=0.10.0'} + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -44384,6 +47816,12 @@ packages: engines: {node: '>=4'} hasBin: true + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} dependencies: @@ -44443,6 +47881,13 @@ packages: ono: 4.0.11 dev: false + /json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + dev: true + /json-schema-to-ts@3.1.0: resolution: {integrity: sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==} engines: {node: '>=16'} @@ -44494,7 +47939,7 @@ packages: acorn: 8.11.3 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.5.4 + semver: 7.6.0 dev: true /jsonc-parser@2.2.1: @@ -45057,7 +48502,7 @@ packages: normalize-package-data: 4.0.1 npm-package-arg: 9.1.2 npm-registry-fetch: 13.3.1 - semver: 7.5.4 + semver: 7.6.0 ssri: 9.0.1 transitivePeerDependencies: - bluebird @@ -45456,7 +48901,6 @@ packages: /lodash.curry@4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: true /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -45529,6 +48973,10 @@ packages: /lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + /lodash.last@3.0.0: + resolution: {integrity: sha512-14mq7rSkCxG4XMy9lF2FbIOqqgF0aH0NfPuQ3LPR3vIh0kHnUvIYP70dqa1Hf47zyXfQ8FzAg0MYOQeSuE1R7A==} + dev: true + /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true @@ -45592,6 +49040,10 @@ packages: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} dev: true + /lodash.zipobject@4.1.3: + resolution: {integrity: sha512-A9SzX4hMKWS25MyalwcOnNoplyHbkNVsjidhTp8ru0Sj23wY9GWBKS8gAIGDSAqeWjIjvE4KBEl24XXAs+v4wQ==} + dev: true + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -45657,6 +49109,10 @@ packages: safe-stable-stringify: 2.4.3 triple-beam: 1.3.0 + /logrocket@8.1.0: + resolution: {integrity: sha512-0PRv9lnS90KBrL3mfiQzcKEPvNT3N55pRN0PRe/q3DqWFQbIW1p72MmMp9a3Qi9la6o+TXri7r68ZE0AM7vsDA==} + dev: false + /long@2.4.0: resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==} engines: {node: '>=0.6'} @@ -45731,6 +49187,11 @@ packages: dependencies: tslib: 2.6.2 + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: true + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -45826,7 +49287,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /magic-string@0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} @@ -46086,6 +49546,15 @@ packages: dependencies: react: 17.0.2 + /markdown-to-jsx@7.4.1(react@18.2.0): + resolution: {integrity: sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + dependencies: + react: 18.2.0 + dev: false + /markdownlint-cli@0.33.0: resolution: {integrity: sha512-zMK1oHpjYkhjO+94+ngARiBBrRDEUMzooDHBAHtmEIJ9oYddd9l3chCReY2mPlecwH7gflQp1ApilTo+o0zopQ==} engines: {node: '>=14'} @@ -46155,6 +49624,18 @@ packages: unist-util-visit-parents: 5.1.3 dev: true + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: @@ -46253,6 +49734,10 @@ packages: /mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true + /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: @@ -46649,6 +50134,15 @@ packages: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: true + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: @@ -46998,6 +50492,10 @@ packages: through2: 3.0.2 dev: true + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -47006,6 +50504,12 @@ packages: is-extendable: 1.0.1 dev: true + /mixpanel-browser@2.50.0: + resolution: {integrity: sha512-iP4sbSRMemjWbnH+KQZRxZ360bcXtFpoQuUiWjjdw9AsURn0MrR9/2RnPOJ8J8tt1dMm7kTKwOjGV8pkbWbmAA==} + dependencies: + rrweb: 2.0.0-alpha.4 + dev: false + /mixpanel@0.17.0: resolution: {integrity: sha512-DY5WeOy/hmkPrNiiZugJpWR0iMuOwuj1a3u0bgwB2eUFRV6oIew/pIahhpawdbNjb+Bye4a8ID3gefeNPvL81g==} engines: {node: '>=10.0'} @@ -47015,6 +50519,20 @@ packages: - supports-color dev: false + /mixpanel@0.18.0: + resolution: {integrity: sha512-VyUoiLB/S/7abYYHGD5x0LijeuJCUabG8Hb+FvYU3Y99xHf1Qh+s4/pH9lt50fRitAHncWbU1FE01EknUfVVjQ==} + engines: {node: '>=10.0'} + dependencies: + https-proxy-agent: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mkdir@0.0.2: + resolution: {integrity: sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==} + engines: {node: '>=0.4.0'} + dev: true + /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: true @@ -47051,7 +50569,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.3.2 + ufo: 1.5.3 dev: true /mocha@10.2.0: @@ -47262,6 +50780,11 @@ packages: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + dev: false + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -47584,6 +51107,84 @@ packages: transitivePeerDependencies: - supports-color + /next@13.5.6(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} + engines: {node: '>=16.14.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.5.6 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001589 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) + watchpack: 2.4.0 + optionalDependencies: + '@next/swc-darwin-arm64': 13.5.6 + '@next/swc-darwin-x64': 13.5.6 + '@next/swc-linux-arm64-gnu': 13.5.6 + '@next/swc-linux-arm64-musl': 13.5.6 + '@next/swc-linux-x64-gnu': 13.5.6 + '@next/swc-linux-x64-musl': 13.5.6 + '@next/swc-win32-arm64-msvc': 13.5.6 + '@next/swc-win32-ia32-msvc': 13.5.6 + '@next/swc-win32-x64-msvc': 13.5.6 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: true + + /next@14.1.0(@babel/core@7.24.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.1.0 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001589 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.4)(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.1.0 + '@next/swc-darwin-x64': 14.1.0 + '@next/swc-linux-arm64-gnu': 14.1.0 + '@next/swc-linux-arm64-musl': 14.1.0 + '@next/swc-linux-x64-gnu': 14.1.0 + '@next/swc-linux-x64-musl': 14.1.0 + '@next/swc-win32-arm64-msvc': 14.1.0 + '@next/swc-win32-ia32-msvc': 14.1.0 + '@next/swc-win32-x64-msvc': 14.1.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /ng-intercom@8.0.2: resolution: {integrity: sha512-Kgzu6FXvGdUSze5WpjMjwYtYOoxzcSNzAbmBMHQrnE9RVMlZu9bJO4BZo75W5xosaWqJK02nyrZ3iQYIjx7O2g==} engines: {node: '>= 8.0.0', npm: '>= 3'} @@ -47764,7 +51365,6 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 - dev: false /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -47813,7 +51413,7 @@ packages: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.0 tar: 6.1.13 which: 2.0.2 transitivePeerDependencies: @@ -47944,7 +51544,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.12.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -47954,7 +51554,7 @@ packages: dependencies: hosted-git-info: 5.2.1 is-core-module: 2.13.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -47964,7 +51564,7 @@ packages: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.13.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -48019,14 +51619,14 @@ packages: resolution: {integrity: sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-install-checks@6.1.0: resolution: {integrity: sha512-udSGENih/5xKh3Ex+L0PtZcOt0Pa+6ppDLnpG5D49/EhMja3LupaY9E/DtJTxyFBwE09ot7Fc+H4DywnZNWTVA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-normalize-package-bin@1.0.1: @@ -48049,7 +51649,7 @@ packages: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 5.0.0 dev: true @@ -48059,7 +51659,7 @@ packages: dependencies: hosted-git-info: 7.0.1 proc-log: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 5.0.0 dev: true @@ -48068,7 +51668,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 3.0.8 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 3.0.0 dev: true @@ -48078,7 +51678,7 @@ packages: dependencies: hosted-git-info: 5.2.1 proc-log: 2.0.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-name: 4.0.0 dev: true @@ -48107,7 +51707,7 @@ packages: npm-install-checks: 5.0.0 npm-normalize-package-bin: 2.0.0 npm-package-arg: 9.1.2 - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-pick-manifest@8.0.1: @@ -48117,7 +51717,7 @@ packages: npm-install-checks: 6.1.0 npm-normalize-package-bin: 3.0.0 npm-package-arg: 10.1.0 - semver: 7.5.4 + semver: 7.6.0 dev: true /npm-registry-fetch@13.3.1: @@ -48365,12 +51965,12 @@ packages: minimatch: 3.0.5 npm-run-path: 4.0.1 open: 8.4.2 - semver: 7.5.4 + semver: 7.6.0 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 tmp: 0.2.1 - tsconfig-paths: 4.1.2 + tsconfig-paths: 4.2.0 tslib: 2.6.2 v8-compile-cache: 2.3.0 yargs: 17.7.2 @@ -48427,12 +52027,12 @@ packages: minimatch: 3.0.5 npm-run-path: 4.0.1 open: 8.4.2 - semver: 7.5.4 + semver: 7.6.0 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 tmp: 0.2.1 - tsconfig-paths: 4.1.2 + tsconfig-paths: 4.2.0 tslib: 2.6.2 v8-compile-cache: 2.3.0 yargs: 17.7.2 @@ -48578,7 +52178,6 @@ packages: '@nx/nx-win32-x64-msvc': 16.10.0 transitivePeerDependencies: - debug - dev: true /nx@17.3.2(@swc-node/register@1.8.0)(@swc/core@1.3.107): resolution: {integrity: sha512-QjF1gnwKebQISvATrSbW7dsmIcLbA0fcyDyxLo5wVHx/MIlcaIb/lLYaPTld73ZZ6svHEZ6n2gOkhMitmkIPQA==} @@ -48620,12 +52219,12 @@ packages: npm-run-path: 4.0.1 open: 8.4.2 ora: 5.3.0 - semver: 7.5.4 + semver: 7.6.0 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 tmp: 0.2.1 - tsconfig-paths: 4.1.2 + tsconfig-paths: 4.2.0 tslib: 2.6.2 yargs: 17.7.2 yargs-parser: 21.1.1 @@ -48692,6 +52291,11 @@ packages: resolution: {integrity: sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==} dev: false + /obj-props@1.4.0: + resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} + engines: {node: '>=0.10.0'} + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -49353,7 +52957,6 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: false /parse-github-url@1.0.2: resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} @@ -49383,7 +52986,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -49652,6 +53255,10 @@ packages: /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true + /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -49663,6 +53270,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: true + /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} dev: true @@ -49900,7 +53514,6 @@ packages: /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - dev: true /piscina@4.0.0: resolution: {integrity: sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==} @@ -50355,7 +53968,7 @@ packages: postcss: 8.4.31 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.8 dev: true /postcss-initial@4.0.1(postcss@8.4.31): @@ -50415,7 +54028,7 @@ packages: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.31 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true @@ -50429,7 +54042,7 @@ packages: cosmiconfig: 8.2.0 jiti: 1.18.2 postcss: 8.4.31 - semver: 7.5.4 + semver: 7.6.0 webpack: 5.88.2(esbuild@0.18.17) dev: true @@ -51231,7 +54844,6 @@ packages: /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - dev: true /promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -51265,6 +54877,12 @@ packages: err-code: 2.0.3 retry: 0.12.0 + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: @@ -51321,6 +54939,11 @@ packages: /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + /proto-props@2.0.0: + resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} + engines: {node: '>=4'} + dev: true + /proto3-json-serializer@1.1.1: resolution: {integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==} engines: {node: '>=12.0.0'} @@ -51346,7 +54969,7 @@ packages: jsdoc: 4.0.2 minimist: 1.2.8 protobufjs: 7.2.4 - semver: 7.5.4 + semver: 7.6.0 tmp: 0.2.1 uglify-js: 3.17.4 dev: false @@ -51495,6 +55118,10 @@ packages: - utf-8-validate dev: true + /pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + dev: false + /pure-rand@6.0.1: resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} dev: true @@ -51589,9 +55216,17 @@ packages: dependencies: performance-now: 2.1.0 + /rambda@7.5.0: + resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + dev: true + /ramda@0.29.0: resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + /ramda@0.29.1: + resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} + dev: true + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -51634,6 +55269,21 @@ packages: resize-observer-polyfill: 1.5.1 dev: false + /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + dom-align: 1.12.4 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + dev: false + /rc-cascader@3.7.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-5nPEM76eMyikd0NFiy1gjwiB9m+bOzjY6Lnd5bVC6Ar3XLlOpOnlCcV3oBFWLN3f7B18tAGpaAVlT2uyEDCv9w==} peerDependencies: @@ -51650,6 +55300,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-cascader@3.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5nPEM76eMyikd0NFiy1gjwiB9m+bOzjY6Lnd5bVC6Ar3XLlOpOnlCcV3oBFWLN3f7B18tAGpaAVlT2uyEDCv9w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + array-tree-filter: 2.1.0 + classnames: 2.3.2 + rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-checkbox@2.3.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==} peerDependencies: @@ -51662,6 +55328,18 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-checkbox@2.3.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-collapse@3.4.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==} peerDependencies: @@ -51677,6 +55355,21 @@ packages: shallowequal: 1.1.0 dev: false + /rc-collapse@3.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: false + /rc-dialog@9.0.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==} peerDependencies: @@ -51692,6 +55385,21 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-dialog@9.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-drawer@6.1.5(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-MDRomQXFi+tvDuwsRAddJ2Oy2ayLCZ29weMzp3rJFO9UNEVLEVV7nuyx5lEgNJIdM//tE6wWQV95cTUiMVqD6w==} peerDependencies: @@ -51707,6 +55415,21 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-drawer@6.1.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MDRomQXFi+tvDuwsRAddJ2Oy2ayLCZ29weMzp3rJFO9UNEVLEVV7nuyx5lEgNJIdM//tE6wWQV95cTUiMVqD6w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-dropdown@4.0.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} peerDependencies: @@ -51721,6 +55444,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-dropdown@4.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-field-form@1.27.4(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==} engines: {node: '>=8.x'} @@ -51735,6 +55472,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-field-form@1.27.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + async-validator: 4.2.5 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-image@5.13.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==} peerDependencies: @@ -51751,6 +55502,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-image@5.13.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-input-number@7.3.11(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==} peerDependencies: @@ -51764,6 +55531,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-input-number@7.3.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-input@0.1.4(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==} peerDependencies: @@ -51777,6 +55557,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-input@0.1.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-mentions@1.13.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==} peerDependencies: @@ -51793,6 +55586,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-mentions@1.13.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-menu@9.8.4(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==} peerDependencies: @@ -51809,6 +55618,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-menu@9.8.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-motion@2.6.3(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==} peerDependencies: @@ -51822,6 +55647,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-motion@2.6.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-notification@4.6.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==} engines: {node: '>=8.x'} @@ -51837,6 +55675,21 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-notification@4.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-overflow@1.3.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-p2Qt4SWPTHAYl4oAao1THy669Fm5q8pYBDBHRaFOekCvcdcrgIx0ByXQMEkyPm8wUDX4BK6aARWecvCRc/7CTA==} peerDependencies: @@ -51851,6 +55704,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-overflow@1.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p2Qt4SWPTHAYl4oAao1THy669Fm5q8pYBDBHRaFOekCvcdcrgIx0ByXQMEkyPm8wUDX4BK6aARWecvCRc/7CTA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-pagination@3.2.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==} peerDependencies: @@ -51863,6 +55730,18 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-pagination@3.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-picker@2.7.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==} engines: {node: '>=8.x'} @@ -51882,6 +55761,44 @@ packages: shallowequal: 1.1.0 dev: false + /rc-picker@2.7.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + date-fns: 2.29.3 + dayjs: 1.11.9 + moment: 2.29.4 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: false + + /rc-picker@2.7.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.5.1 + date-fns: 2.29.3 + dayjs: 1.11.10 + moment: 2.29.4 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.39.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: false + /rc-progress@3.4.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==} peerDependencies: @@ -51895,6 +55812,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-progress@3.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-rate@2.9.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==} engines: {node: '>=8.x'} @@ -51909,6 +55839,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-rate@2.9.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-resize-observer@1.3.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==} peerDependencies: @@ -51923,6 +55867,20 @@ packages: resize-observer-polyfill: 1.5.1 dev: false + /rc-resize-observer@1.3.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + dev: false + /rc-segmented@2.1.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==} peerDependencies: @@ -51937,6 +55895,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-segmented@2.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-select@14.1.17(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-6qQhMqtoUkkboRqXKKFRR5Nu1mrnw2mC1uxIBIczg7aiJ94qCZBg4Ww8OLT9f4xdyCgbFSGh6r3yB9EBsjoHGA==} engines: {node: '>=8.x'} @@ -51955,6 +55927,24 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-select@14.1.17(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6qQhMqtoUkkboRqXKKFRR5Nu1mrnw2mC1uxIBIczg7aiJ94qCZBg4Ww8OLT9f4xdyCgbFSGh6r3yB9EBsjoHGA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.4.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-slider@10.0.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==} engines: {node: '>=8.x'} @@ -51970,6 +55960,21 @@ packages: shallowequal: 1.1.0 dev: false + /rc-slider@10.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: false + /rc-steps@5.0.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==} engines: {node: '>=8.x'} @@ -51984,6 +55989,20 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-steps@5.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-switch@3.2.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==} peerDependencies: @@ -51997,6 +56016,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-switch@3.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-table@7.26.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==} engines: {node: '>=8.x'} @@ -52013,6 +56045,22 @@ packages: shallowequal: 1.1.0 dev: false + /rc-table@7.26.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: false + /rc-tabs@12.5.10(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==} engines: {node: '>=8.x'} @@ -52031,6 +56079,24 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-tabs@12.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-textarea@0.4.7(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==} peerDependencies: @@ -52046,6 +56112,21 @@ packages: shallowequal: 1.1.0 dev: false + /rc-textarea@0.4.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + dev: false + /rc-tooltip@5.2.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==} peerDependencies: @@ -52059,6 +56140,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-tooltip@5.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-tree-select@5.5.5(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==} peerDependencies: @@ -52074,6 +56168,21 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-tree-select@5.5.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-tree@5.7.3(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==} engines: {node: '>=10.x'} @@ -52090,6 +56199,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-tree@5.7.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Oql2S9+ZmT+mfTp5SNo1XM0QvkENjc0mPRFsHWRFSPuKird0OYMZZKmLznUJ+0aGDeFFWN42wiUZJtMFhrLgLw==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.4.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-trigger@5.3.4(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} engines: {node: '>=8.x'} @@ -52106,6 +56231,22 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-trigger@5.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-upload@4.3.4(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==} peerDependencies: @@ -52119,6 +56260,19 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-upload@4.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-util@5.29.3(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==} peerDependencies: @@ -52131,6 +56285,30 @@ packages: react-is: 16.13.1 dev: false + /rc-util@5.29.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + dev: false + + /rc-util@5.39.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-j9wOELkLQ8gC/NkUg3qg9mHZcJf+5mYYv40JrDHqnaf8VSycji4pCf7kJ5fdTXQPDIF0vr5zpb/T2HdrMs9rWA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + dev: false + /rc-virtual-list@3.4.13(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==} engines: {node: '>=8.x'} @@ -52146,6 +56324,21 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /rc-virtual-list@3.4.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.23.2 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.29.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -52193,6 +56386,15 @@ packages: semver: 5.7.2 dev: true + /react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + dependencies: + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 + dev: false + /react-chartjs-2@4.3.1(chart.js@3.9.1)(react@17.0.2): resolution: {integrity: sha512-5i3mjP6tU7QSn0jvb8I4hudTzHJqS8l00ORJnVwI2sYu0ihpj83Lv2YzfxunfxTZkscKvZu2F2w9LkwNBhj6xA==} peerDependencies: @@ -52212,6 +56414,15 @@ packages: react: 17.0.2 dev: false + /react-clientside-effect@1.2.6(react@18.2.0): + resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + dev: false + /react-color@2.19.3(react@17.0.2): resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} peerDependencies: @@ -52236,6 +56447,16 @@ packages: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) + /react-confetti@6.1.0(react@18.2.0): + resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} + engines: {node: '>=10.18'} + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 + dependencies: + react: 18.2.0 + tween-functions: 1.2.0 + dev: false + /react-css-theme-switcher@0.3.0(react@17.0.2): resolution: {integrity: sha512-RV+fJ6mSbtsLOgIgeL4Q8MEH4Hyl72tQvGpCFBbk3ia6ie3KzXO1gfbKTV2q1ryP3hBpmyy1qrX+6E1f937A1A==} engines: {node: '>=10'} @@ -52268,7 +56489,7 @@ packages: typescript: optional: true dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 address: 1.2.2 browserslist: 4.21.10 chalk: 4.1.2 @@ -52300,6 +56521,22 @@ packages: - vue-template-compiler dev: true + /react-diff-viewer-continued@3.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kMZmUyb3Pv5L9vUtCfIGYsdOHs8mUojblGy1U1Sm0D7FhAOEsH9QhnngEIRo5hXWIPNGupNRJls1TJ6Eqx84eg==} + engines: {node: '>= 8'} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@emotion/css': 11.11.2 + classnames: 2.3.2 + diff: 5.1.0 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-docgen-typescript@2.2.2(typescript@4.9.5): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: @@ -52345,7 +56582,6 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: false /react-dropzone@14.2.3(react@17.0.2): resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} @@ -52460,6 +56696,22 @@ packages: - '@types/react' dev: false + /react-focus-lock@2.5.2(react@18.2.0): + resolution: {integrity: sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.23.2 + focus-lock: 0.9.2 + prop-types: 15.8.1 + react: 18.2.0 + react-clientside-effect: 1.2.6(react@18.2.0) + use-callback-ref: 1.3.0(react@18.2.0) + use-sidecar: 1.1.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /react-frame-component@5.2.6(prop-types@15.8.1)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-CwkEM5VSt6nFwZ1Op8hi3JB5rPseZlmnp5CGiismVTauE6S4Jsc4TNMlT0O7Cts4WgIC3ZBAQ2p1Mm9XgLbj+w==} peerDependencies: @@ -52562,10 +56814,25 @@ packages: tree-changes: 0.9.3 dev: false + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + /react-merge-refs@1.1.0: resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} dev: false + /react-number-format@5.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-password-strength-bar@0.4.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-2NvYz4IUU8k7KDZgsXKoJWreKCZLKGaqF5QhIVhc09OsPBFXFMh0BeghNkBIRkaxLeI7/xjivknDCYfluBCXKA==} peerDependencies: @@ -52634,6 +56901,36 @@ packages: react-style-singleton: 2.2.1(@types/react@17.0.62)(react@17.0.2) tslib: 2.6.2 + /react-remove-scroll-bar@2.3.4(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + 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 + dependencies: + react: 18.2.0 + react-style-singleton: 2.2.1(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll-bar@2.3.6(react@18.2.0): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + 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 + dependencies: + react: 18.2.0 + react-style-singleton: 2.2.1(react@18.2.0) + tslib: 2.6.2 + dev: false + /react-remove-scroll@2.4.1(@types/react@17.0.62)(react@17.0.2): resolution: {integrity: sha512-K7XZySEzOHMTq7dDwcHsZA6Y7/1uX5RsWhRXVYv8rdh+y9Qz2nMwl9RX/Mwnj/j7JstCGmxyfyC0zbVGXYh3mA==} engines: {node: '>=8.5.0'} @@ -52653,6 +56950,24 @@ packages: use-sidecar: 1.1.2(@types/react@17.0.62)(react@17.0.2) dev: false + /react-remove-scroll@2.4.1(react@18.2.0): + resolution: {integrity: sha512-K7XZySEzOHMTq7dDwcHsZA6Y7/1uX5RsWhRXVYv8rdh+y9Qz2nMwl9RX/Mwnj/j7JstCGmxyfyC0zbVGXYh3mA==} + engines: {node: '>=8.5.0'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(react@18.2.0) + react-style-singleton: 2.2.1(react@18.2.0) + tslib: 1.14.1 + use-callback-ref: 1.3.0(react@18.2.0) + use-sidecar: 1.1.2(react@18.2.0) + dev: false + /react-remove-scroll@2.5.5(@types/react@17.0.53)(react@17.0.2): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} @@ -52690,6 +57005,24 @@ packages: use-sidecar: 1.1.2(@types/react@17.0.62)(react@17.0.2) dev: true + /react-remove-scroll@2.5.9(react@18.2.0): + resolution: {integrity: sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA==} + 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 + dependencies: + react: 18.2.0 + react-remove-scroll-bar: 2.3.6(react@18.2.0) + react-style-singleton: 2.2.1(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.0(react@18.2.0) + use-sidecar: 1.1.2(react@18.2.0) + dev: false + /react-router-dom@6.2.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==} peerDependencies: @@ -52942,6 +57275,27 @@ packages: - '@types/react' dev: false + /react-select@5.7.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + '@emotion/cache': 11.10.7 + '@emotion/react': 11.10.6(react@18.2.0) + '@floating-ui/dom': 1.5.3 + '@types/react-transition-group': 4.4.10 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.2(react-dom@18.2.0)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /react-select@5.8.0(@types/react@17.0.62)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} peerDependencies: @@ -52963,6 +57317,27 @@ packages: - '@types/react' dev: false + /react-select@5.8.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + '@emotion/cache': 11.10.7 + '@emotion/react': 11.10.6(react@18.2.0) + '@floating-ui/dom': 1.5.3 + '@types/react-transition-group': 4.4.10 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.2(react-dom@18.2.0)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /react-simple-animate@3.5.2(react-dom@17.0.2): resolution: {integrity: sha512-xLE65euP920QMTOmv5haPlml+hmOPDkbIr5WeF7ADIXWBYt5kW/vwpNfWg8EKMab8aeDxIZ6QjffVh8v2dUyhg==} peerDependencies: @@ -53003,6 +57378,22 @@ packages: react: 17.0.2 tslib: 2.6.2 + /react-style-singleton@2.2.1(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + 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 + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + /react-syntax-highlighter@15.5.0(react@17.0.2): resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} peerDependencies: @@ -53052,6 +57443,20 @@ packages: - '@types/react' dev: false + /react-textarea-autosize@8.3.4(react@18.2.0): + resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /react-textarea-autosize@8.4.1(@types/react@17.0.62)(react@17.0.2): resolution: {integrity: sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==} engines: {node: '>=10'} @@ -53066,6 +57471,20 @@ packages: - '@types/react' dev: false + /react-textarea-autosize@8.5.3(react@18.2.0): + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /react-transition-group@4.4.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} peerDependencies: @@ -53080,6 +57499,34 @@ packages: react-dom: 17.0.2(react@17.0.2) dev: false + /react-transition-group@4.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.23.2 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.23.2 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-use-intercom@2.1.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-M4g2Il31LcI75u1IirN1+6J30IXPIBgqf+78tmTTIyXWgy8rNuVg8wSLi7oaTUb3JnyU/l/RKFDlr3GYNcpiRg==} engines: {node: '>=10'} @@ -53114,7 +57561,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - dev: false /reactcss@1.2.3(react@17.0.2): resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==} @@ -53125,6 +57571,25 @@ packages: react: 17.0.2 dev: false + /reactflow@11.11.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wusd1Xpn1wgsSEv7UIa4NNraCwH9syBtubBy4xVNXg3b+CDKM+sFaF3hnMx0tr0et4km9urIDdNvwm34QiZong==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/background': 11.3.13(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.2.13(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.11.3(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.7.13(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.2.13(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.3.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: @@ -53501,6 +57966,11 @@ packages: resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} dev: true + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: true + /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} @@ -53540,6 +58010,13 @@ packages: rc: 1.2.8 dev: true + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -53709,6 +58186,11 @@ packages: resolve: 1.7.1 dev: true + /requireindex@1.1.0: + resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} + engines: {node: '>=0.10.5'} + dev: true + /requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -53851,7 +58333,6 @@ packages: is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /resolve@1.7.1: resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} @@ -53976,6 +58457,14 @@ packages: glob: 9.3.5 dev: true + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + /rollup-plugin-commonjs@10.1.0(rollup@3.20.2): resolution: {integrity: sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs. @@ -54060,6 +58549,13 @@ packages: estree-walker: 0.6.1 dev: true + /rollup@2.78.0: + resolution: {integrity: sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} @@ -54107,6 +58603,12 @@ packages: fsevents: 2.3.3 dev: true + /rrdom@0.1.7: + resolution: {integrity: sha512-ZLd8f14z9pUy2Hk9y636cNv5Y2BMnNEY99wxzW9tD2BLDfe1xFxtLjB4q/xCBYo6HRe0wofzKzjm4JojmpBfFw==} + dependencies: + rrweb-snapshot: 2.0.0-alpha.4 + dev: false + /rrule@2.7.2: resolution: {integrity: sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==} dependencies: @@ -54117,6 +58619,27 @@ packages: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} dev: true + /rrweb-snapshot@2.0.0-alpha.13: + resolution: {integrity: sha512-slbhNBCYjxLGCeH95a67ECCy5a22nloXp1F5wF7DCzUNw80FN7tF9Lef1sRGLNo32g3mNqTc2sWLATlKejMxYw==} + dev: false + + /rrweb-snapshot@2.0.0-alpha.4: + resolution: {integrity: sha512-KQ2OtPpXO5jLYqg1OnXS/Hf+EzqnZyP5A+XPqBCjYpj3XIje/Od4gdUwjbFo3cVuWq5Cw5Y1d3/xwgIS7/XpQQ==} + dev: false + + /rrweb@2.0.0-alpha.4: + resolution: {integrity: sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==} + dependencies: + '@rrweb/types': 2.0.0-alpha.13 + '@types/css-font-loading-module': 0.0.7 + '@xstate/fsm': 1.6.5 + base64-arraybuffer: 1.0.2 + fflate: 0.4.8 + mitt: 3.0.1 + rrdom: 0.1.7 + rrweb-snapshot: 2.0.0-alpha.4 + dev: false + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -54205,6 +58728,12 @@ packages: ret: 0.1.15 dev: true + /safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.27 + dev: true + /safe-stable-stringify@1.1.1: resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} dev: true @@ -54330,7 +58859,6 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - dev: false /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} @@ -54506,7 +59034,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -54615,6 +59142,10 @@ packages: split-string: 3.1.0 dev: true + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -54711,6 +59242,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: true + /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -54760,7 +59296,7 @@ packages: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /simple-update-notifier@2.0.0: @@ -54788,6 +59324,15 @@ packages: mrmime: 1.0.1 totalist: 1.1.0 + /sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + dev: false + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -55303,6 +59848,13 @@ packages: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} dev: true + /stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + dev: false + /stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} dependencies: @@ -55771,6 +60323,23 @@ packages: tslib: 2.6.2 dev: false + /styled-jsx@5.1.1(@babel/core@7.24.4)(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.24.4 + client-only: 0.0.1 + react: 18.2.0 + /stylehacks@5.1.1(postcss@8.4.35): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} @@ -55789,6 +60358,10 @@ packages: /stylis@4.1.3: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + /subarg@1.0.0: resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} dependencies: @@ -55868,7 +60441,7 @@ packages: mime: 2.6.0 qs: 6.11.2 readable-stream: 3.6.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -55885,7 +60458,7 @@ packages: methods: 1.1.2 mime: 2.6.0 qs: 6.11.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -55903,7 +60476,7 @@ packages: methods: 1.1.2 mime: 2.6.0 qs: 6.11.2 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color @@ -56447,7 +61020,6 @@ packages: serialize-javascript: 6.0.1 terser: 5.22.0 webpack: 5.78.0 - dev: true /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} @@ -56588,6 +61160,13 @@ packages: /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + /time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + dependencies: + convert-hrtime: 3.0.0 + dev: true + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -56740,6 +61319,11 @@ packages: resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} engines: {node: '>=6'} + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: false + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true @@ -57041,11 +61625,11 @@ packages: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@14.18.42)(ts-node@10.9.1) - jest-util: 29.5.0 + jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.4 + semver: 7.6.0 typescript: 4.9.5 yargs-parser: 21.1.1 dev: true @@ -57114,6 +61698,13 @@ packages: webpack: 5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true + /ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + dev: true + /ts-morph@21.0.1: resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} dependencies: @@ -57185,6 +61776,37 @@ packages: yn: 3.1.1 dev: true + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 14.18.33 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /ts-node@10.9.1(@types/node@14.18.42)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -57277,8 +61899,8 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.1(@types/node@20.5.1)(typescript@4.9.5): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + /ts-node@10.9.2(@types/node@14.18.42)(typescript@4.9.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -57296,7 +61918,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.5.1 + '@types/node': 14.18.42 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -57307,6 +61929,130 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true + + /ts-node@10.9.2(@types/node@14.18.42)(typescript@5.4.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 14.18.42 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.2(@types/node@16.11.7)(typescript@4.9.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 16.11.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 20.12.10 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.2(@types/node@20.5.1)(typescript@5.4.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 20.5.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true optional: true /ts-node@9.1.1(typescript@4.9.5): @@ -57341,6 +62087,10 @@ packages: typescript: 4.9.5 dev: true + /ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + dev: true + /ts-xor@1.3.0: resolution: {integrity: sha512-RLXVjliCzc1gfKQFLRpfeD0rrWmjnSTgj7+RFhoq3KRkUYa8LE/TIidYOzM5h+IdFBDSjjSgk9Lto9sdMfDFEA==} dev: false @@ -57364,7 +62114,7 @@ packages: dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 - tsconfig-paths: 4.1.2 + tsconfig-paths: 4.2.0 dev: true /tsconfig-paths@3.14.2: @@ -57469,6 +62219,10 @@ packages: engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} dev: false + /tween-functions@1.2.0: + resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + dev: false + /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -57566,6 +62320,11 @@ packages: engines: {node: '>=8'} dev: true + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + dev: false + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -57580,6 +62339,11 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + /type-fest@4.18.2: + resolution: {integrity: sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==} + engines: {node: '>=16'} + dev: false + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -57684,7 +62448,6 @@ packages: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true - dev: true /typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} @@ -57700,16 +62463,15 @@ packages: resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} dev: true + /ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + dev: false + /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: true - /ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: false /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -57754,6 +62516,10 @@ packages: dev: false optional: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /undici@5.23.0: resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} engines: {node: '>=14.0'} @@ -57884,6 +62650,12 @@ packages: '@types/unist': 2.0.6 dev: true + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: @@ -58097,6 +62869,13 @@ packages: querystring: 0.2.0 dev: true + /url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + dependencies: + punycode: 1.4.1 + qs: 6.11.2 + dev: true + /urlgrey@1.0.0: resolution: {integrity: sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==} dependencies: @@ -58131,6 +62910,20 @@ packages: react: 17.0.2 tslib: 2.6.2 + /use-callback-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + 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 + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + /use-composed-ref@1.3.0(react@17.0.2): resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: @@ -58139,6 +62932,14 @@ packages: react: 17.0.2 dev: false + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /use-deep-compare-effect@1.8.1(react@17.0.2): resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} engines: {node: '>=10', npm: '>=6'} @@ -58176,6 +62977,18 @@ packages: react: 17.0.2 dev: false + /use-isomorphic-layout-effect@1.1.2(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 18.2.0 + dev: false + /use-latest@1.2.1(@types/react@17.0.53)(react@17.0.2): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: @@ -58204,6 +63017,19 @@ packages: use-isomorphic-layout-effect: 1.1.2(@types/react@17.0.62)(react@17.0.2) dev: false + /use-latest@1.2.1(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(react@18.2.0) + dev: false + /use-resize-observer@9.1.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} peerDependencies: @@ -58244,6 +63070,21 @@ packages: react: 17.0.2 tslib: 2.6.2 + /use-sidecar@1.1.2(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + /use-sync-external-store@1.2.0(react@17.0.2): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -58252,6 +63093,14 @@ packages: react: 17.0.2 dev: false + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -58287,6 +63136,12 @@ packages: object.getownpropertydescriptors: 2.1.7 dev: true + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: true + /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: @@ -58593,7 +63448,7 @@ packages: optional: true dependencies: '@microsoft/api-extractor': 7.38.0(@types/node@18.18.5) - '@rollup/pluginutils': 5.0.5 + '@rollup/pluginutils': 5.0.5(rollup@2.78.0) '@vue/language-core': 1.8.22(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) kolorist: 1.8.0 @@ -58820,10 +63675,28 @@ packages: engines: {node: '>=0.10.0'} dev: true + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.7 + dev: true + /vscode-languageserver-textdocument@1.0.8: resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} dev: true + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} dev: true @@ -58849,7 +63722,7 @@ packages: espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true @@ -58888,7 +63761,7 @@ packages: dependencies: '@volar/typescript': 1.10.7 '@vue/language-core': 1.8.22(typescript@4.9.5) - semver: 7.5.4 + semver: 7.6.0 typescript: 4.9.5 dev: true @@ -59009,6 +63882,29 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + /webpack-bundle-analyzer@4.10.1: + resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + is-plain-object: 5.0.0 + opener: 1.5.2 + picocolors: 1.0.0 + sirv: 2.0.4 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /webpack-bundle-analyzer@4.9.0: resolution: {integrity: sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==} engines: {node: '>= 10.13.0'} @@ -59196,7 +64092,7 @@ packages: compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.18.2 + express: 4.18.3 graceful-fs: 4.2.11 html-entities: 2.3.3 http-proxy-middleware: 2.0.6(@types/express@4.17.17) @@ -59333,7 +64229,6 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true /webpack@5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4): resolution: {integrity: sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g==} @@ -60301,7 +65196,7 @@ packages: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 - validator: 13.9.0 + validator: 13.11.0 optionalDependencies: commander: 9.5.0 dev: true @@ -60355,6 +65250,25 @@ packages: react: 17.0.2 dev: false + /zustand@4.5.2(react@18.2.0): + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true