diff --git a/.cursor/rules/demo.mdc b/.cursor/rules/demo.mdc new file mode 100644 index 0000000000..7b5e3a2428 --- /dev/null +++ b/.cursor/rules/demo.mdc @@ -0,0 +1,43 @@ +--- +description: +globs: components/*/demo/** +alwaysApply: false +--- + +# Demo 规范 + +- demo 代码尽可能简洁 +- 避免冗余代码,方便用户复制到项目直接使用 +- 每个 demo 聚焦展示一个功能点 +- 提供中英文两个版本的说明 +- demo 文件命名: + - 英文 demo: index.en-US.md + - 中文 demo: index.zh-CN.md +- 确保 demo 在各种尺寸下都能正常展示 +- 对于复杂交互提供必要的操作说明 + +## 文件组织 + +- 每个组件演示包含 `.md`(说明文档)和 `.ts`(实际代码)两部分 +- 位置:hooks 目录下的 `src` 子目录,如 `packages/hooks/src/useHover` +- 文件名应简洁地描述示例内容 + +## MD 文档规范 + +- 必须包含 `## zh-CN` 和 `## en-US` 两种语言说明 +- 内容简洁明了,突出组件特性和用法 +- 避免冗长段落,必要时使用列表或粗体 +- 标注注意事项和实验性功能 + +## 代码质量 + +- 实用且专注于单一功能 +- 关键处添加简洁注释 +- 使用有意义的数据和变量 +- 优先使用 ahooks 内置 hook 或者公共方法,减少外部依赖 + +## 质量要求 + +- 确保代码运行正常,无控制台错误 +- 适配常见浏览器 +- 避免过时 API,及时更新到新推荐用法 diff --git a/.cursor/rules/docs.mdc b/.cursor/rules/docs.mdc new file mode 100644 index 0000000000..a6d7475c13 --- /dev/null +++ b/.cursor/rules/docs.mdc @@ -0,0 +1,38 @@ +--- +description: 规范项目文档和 Changelog +globs: ["**/CHANGELOG*.md", "components/**/index.*.md"] +alwaysApply: false +--- + +# Changelog Emoji 规范 + +- 🐞 Bug 修复 +- 💄 样式更新或 token 更新 +- 🆕 新增特性,新增属性 +- 🔥 极其值得关注的新增特性 +- 🇺🇸🇨🇳🇬🇧 国际化改动 +- 📖 📝 文档或网站改进 +- ✅ 新增或更新测试用例 +- 🛎 更新警告/提示信息 +- ⌨️ ♿ 可访问性增强 +- 🗑 废弃或移除 +- 🛠 重构或工具链优化 +- ⚡️ 性能提升 + +# 文档规范 + +- 提供中英文两个版本 +- 新属性需声明可用的版本号 +- 属性命名符合 API 命名规则 +- hook 文档包含:使用场景、基础用法、API 说明 +- 文档示例应简洁明了 +- 属性的描述应清晰易懂 +- 对复杂功能提供详细说明 +- 加入 TypeScript 定义 +- 提供常见问题解答 +- 更新文档时同步更新中英文版本 + +## 其他要求 + +- 新增属性时,建议用易于理解的语言描述用户可以感知的变化 +- 存在破坏性改动时,尽量给出原始的 PR 链接,社区提交的 PR 改动加上提交者的链接 diff --git a/.cursor/rules/git.mdc b/.cursor/rules/git.mdc new file mode 100644 index 0000000000..b1df1bea6f --- /dev/null +++ b/.cursor/rules/git.mdc @@ -0,0 +1,109 @@ +--- +description: +globs: +alwaysApply: true +--- +# Git 规范 + +## 开发流程 + +1. 从保护分支(通常是 `master`)创建新的功能分支 +2. 在新分支上进行开发 +3. 提交 Pull Request 到目标分支 +4. 等待 Code Review 和 CI 通过 +5. 合并到目标分支 + +## 分支命名规范 + +- 功能开发:`feat/description-of-feature` + - 例如:`feat/add-dark-mode` + - 例如:`feat/improve-table-performance` +- 问题修复:`fix/issue-number-or-description` + - 例如:`fix/button-style-issue` + - 例如:`fix/issue-1234` +- 文档更新:`docs/what-is-changed` + - 例如:`docs/update-api-reference` + - 例如:`docs/fix-typos` +- 代码重构:`refactor/what-is-changed` + - 例如:`refactor/button-component` + - 例如:`refactor/remove-deprecated-api` +- 样式修改:`style/what-is-changed` + - 例如:`style/update-button-tokens` + - 例如:`style/improve-mobile-layout` +- 测试相关:`test/what-is-changed` + - 例如:`test/add-button-test` + - 例如:`test/improve-coverage` +- 构建相关:`build/what-is-changed` + - 例如:`build/upgrade-webpack` + - 例如:`build/fix-ts-config` +- 持续集成:`ci/what-is-changed` + - 例如:`ci/add-e2e-test` + - 例如:`ci/fix-deploy-script` +- 性能优化:`perf/what-is-changed` + - 例如:`perf/optimize-render` + - 例如:`perf/reduce-bundle-size` +- 依赖升级:`deps/package-name-version` + - 例如:`deps/upgrade-react-19` + - 例如:`deps/update-dependencies` + +## 分支命名注意事项 + +1. 使用小写字母 +2. 使用连字符(-)分隔单词 +3. 简短但具有描述性 +4. 避免使用下划线或其他特殊字符 +5. 如果与 Issue 关联,可以包含 Issue 编号 + +## Pull Request 规范 + +### PR 标题 + +- PR 标题始终使用英文 +- 遵循格式:`类型: 简短描述` +- 例如:`fix: fix button style issues in Safari browser` +- 例如:`feat: add dark mode support` + +### PR 内容 + +- PR 内容默认使用英文 +- 尽量简洁清晰地描述改动内容和目的 +- 可以视需要在英文描述后附上中文说明 + +### PR 提交注意事项 + +1. **审核流程**: + + - PR 需要由至少一名维护者审核通过后才能合并 + - 确保所有 CI 检查都通过 + - 解决所有 Code Review 中提出的问题 + +2. **PR 质量要求**: + + - 确保代码符合项目代码风格 + - 添加必要的测试用例 + - 更新相关文档 + - 大型改动需要更详细的说明和更多的审核者参与 + +3. **工具标注**: + - 如果是用 Cursor 提交的代码,请在 PR body 末尾进行标注:`> Submitted by Cursor` + +## 新增内容 + +- Pull Request 标题格式:[组件名]: 描述 +- 从 master 分支创建新分支 +- 分支命名规范: + - feature/xxx:新特性 + - fix/xxx:Bug 修复 + - docs/xxx:文档更新 +- PR 说明中选择改动类型: + - 🆕 新特性提交 + - 🐞 Bug 修复 + - 📝 文档改进 + - 📽️ 演示代码改进 + - 💄 样式/交互改进 + - 🤖 TypeScript 更新 + - 📦 包体积优化 + - ⚡️ 性能优化 + - 🌐 国际化改进 +- 提供改动背景和解决方案 +- 更新日志同时提供英文和中文版本 diff --git a/.cursor/rules/project.mdc b/.cursor/rules/project.mdc new file mode 100644 index 0000000000..33aeb172eb --- /dev/null +++ b/.cursor/rules/project.mdc @@ -0,0 +1,24 @@ +--- +description: +globs: +alwaysApply: true +--- + # 项目背景 + +这是由蚂蚁团队开发的一个高质量、可靠的 React Hooks 库。 + +- 易学易用 +- 支持 SSR +- 对输入输出函数做了特殊处理,避免闭包问题 +- 包含大量提炼自业务的高级 Hooks +- 包含丰富的基础 Hooks +- 使用 TypeScript 构建,提供完整的类型定义文件 + +# 编码规范 + +- 使用 TypeScript 和 React 书写 +- 避免引入新依赖,严控打包体积 +- 兼容现代浏览器 +- 支持服务端渲染 +- 保持向下兼容,避免 breaking change +- 合理使用 React.memo、useMemo 和 useCallback 优化性能 diff --git a/.cursor/rules/testing.mdc b/.cursor/rules/testing.mdc new file mode 100644 index 0000000000..0fe7d60847 --- /dev/null +++ b/.cursor/rules/testing.mdc @@ -0,0 +1,10 @@ +--- +description: +globs: **/__tests__/**,**/*.test.tsx,**/*.test.ts +alwaysApply: false +--- + # 测试规范 + +- 使用 vitest 和 @testing-library/react 编写单元测试 +- 测试覆盖率要求 100% +- 测试文件放在 __tests__ 目录,命名格式为:index.spec.ts 或 xxx.spec.ts diff --git a/.cursor/rules/typescript.mdc b/.cursor/rules/typescript.mdc new file mode 100644 index 0000000000..1ee44e0d67 --- /dev/null +++ b/.cursor/rules/typescript.mdc @@ -0,0 +1,74 @@ +# TypeScript 规范 + +## 基本原则 + +- 所有组件和函数必须提供准确的类型定义 +- 尽量避免使用 `any` 类型,尽可能精确地定义类型 +- 使用接口而非类型别名定义对象结构 +- 导出所有公共接口类型,方便用户使用 +- 严格遵循 TypeScript 类型设计原则,确保类型安全 +- 确保编译无任何类型错误或警告 + +## hook 类型定义 + +- 复杂的数据结构应拆分为多个接口定义 +- 所有函数类型应明确定义参数和返回值 + +## 泛型使用 + +- 适当使用泛型增强类型灵活性 +- 为泛型参数提供合理的默认类型和约束 +- 避免过度使用泛型导致类型复杂化 +- 在泛型参数上应用限制条件(constraints)确保类型安全 +- 为复杂泛型提供类型别名以提高可读性 + +## 类型合并与扩展 + +- 使用交叉类型(&)合并多个类型 +- 使用 Partial、Pick、Omit 等工具类型修改现有类型 +- 扩展原生 DOM 元素属性时,继承相应的内置类型 +- 使用 type 定义联合类型和交叉类型 +- 优先使用自带的工具类型,避免重复定义 + +## 枚举和常量 + +- 使用字面量联合类型定义有限的选项集合 +- 为复杂的枚举值提供类型守卫函数 +- 避免使用 `enum`,优先使用联合类型和 `as const` +- 对于关键常量,使用 `as const` 断言确保类型严格 +- 为联合类型中的每个值提供适当的注释 + +## 类型推断与断言 + +- 尽可能依赖 TypeScript 的类型推断 +- 只在必要时使用类型断言(as) +- 使用类型守卫函数进行运行时类型检查 +- 尽量避免使用非空断言操作符(!) +- 使用 `instanceof` 和 `typeof` 进行类型守卫 +- 为自定义类型创建类型谓词(type predicates)函数 + +## JSDoc 注释 + +- 为复杂的类型、函数、hook 添加 JSDoc 注释 +- 使用 `@deprecated` 标记已废弃的 API +- 在注释中提供使用示例 +- 说明参数和返回值的含义与约束 +- 在 interface 和重要类型定义上添加文档注释 + +## 类型兼容性 + +- 确保类型定义兼容不同版本的 React +- 避免使用实验性或不稳定的 TypeScript 特性 +- 为第三方库未提供的类型编写声明文件 +- 使用条件类型处理复杂的类型逻辑 +- 验证类型在不同 TypeScript 版本下的兼容性 + +## 严格使用 TypeScript 类型 + +- 导出组件类型和接口 +- 避免使用 any,优先使用 unknown +- 组件 Props 使用 interface 定义 +- 使用明确的命名约定 +- 合理使用泛型提高复用性 +- 导出类型时使用 export type +- 组件属性使用 JSDoc 注释说明用途 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index fe75bf1c08..0000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -const fabric = require('@umijs/fabric'); - -module.exports = { - ...fabric.default, - rules: { - ...fabric.default.rules, - 'no-restricted-syntax': 'off', - 'no-plusplus': 'off', - 'no-console': 'off', - 'no-underscore-dangle': 'off', - 'consistent-return': 'off', - '@typescript-eslint/ban-ts-ignore': 'off', - '@typescript-eslint/no-object-literal-type-assertion': 'off', - '@typescript-eslint/no-parameter-properties': 'off', - 'consistent-return': 'off', - 'import/no-useless-path-segments': 'off', - 'no-unused-expressions': 'off', - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'off', - 'no-await-in-loop': 'off', - 'no-constant-condition': ['warn', { checkLoops: false }], - }, - plugins: [...fabric.default.plugins, 'react-hooks'], - parserOptions: { - ...fabric.default.parserOptions, - project: './packages/**/tsconfig.json', - }, -}; diff --git a/.github/workflows/gitleaks.yml b/.github/workflows/gitleaks.yml index ab51b2dc28..34c9b860f6 100644 --- a/.github/workflows/gitleaks.yml +++ b/.github/workflows/gitleaks.yml @@ -6,7 +6,7 @@ jobs: gitleaks: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: wget uses: wei/wget@v1 with: diff --git a/.github/workflows/issue-close-require.yml b/.github/workflows/issue-close-require.yml index 7e434c6df2..6699d90be2 100644 --- a/.github/workflows/issue-close-require.yml +++ b/.github/workflows/issue-close-require.yml @@ -9,18 +9,18 @@ jobs: runs-on: ubuntu-latest steps: - name: need reproduce - uses: actions-cool/issues-helper@v1.7 + uses: actions-cool/issues-helper@v3 with: actions: 'close-issues' labels: '🤔 Need Reproduce' inactive-day: 3 - name: needs more info - uses: actions-cool/issues-helper@v1.7 + uses: actions-cool/issues-helper@v3 with: actions: 'close-issues' - labels: 'needs-more-info' + labels: 'needs more info' inactive-day: 3 body: | - Since the issue was labeled with `needs-more-info`, but no response in 3 days. This issue will be closed. If you have any questions, you can comment and reply. + Since the issue was labeled with `needs more info`, but no response in 3 days. This issue will be closed. If you have any questions, you can comment and reply. 由于该 issue 被标记为需要更多信息,却 3 天未收到回应。现关闭 issue,若有任何问题,可评论回复。 diff --git a/.github/workflows/issue-reply.yml b/.github/workflows/issue-reply.yml index 396c67c5a8..c5d676ebf6 100644 --- a/.github/workflows/issue-reply.yml +++ b/.github/workflows/issue-reply.yml @@ -10,7 +10,7 @@ jobs: steps: - name: help wanted if: github.event.label.name == 'help wanted' - uses: actions-cool/issues-helper@v1.2 + uses: actions-cool/issues-helper@v3 with: actions: 'create-comment' issue-number: ${{ github.event.issue.number }} @@ -23,7 +23,7 @@ jobs: - name: 🤔 Need Reproduce if: github.event.label.name == '🤔 Need Reproduce' - uses: actions-cool/issues-helper@v1.2 + uses: actions-cool/issues-helper@v3 with: actions: 'create-comment' issue-number: ${{ github.event.issue.number }} diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml deleted file mode 100644 index 7033a94303..0000000000 --- a/.github/workflows/node-ci.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Node CI - -on: [push, pull_request] - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [14.x, 16.x] - - steps: - - uses: actions/checkout@v3 - - - name: Install pnpm - uses: pnpm/action-setup@v2.2.4 - with: - version: 7 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: pnpm run intall, build, and test - run: | - pnpm run init - pnpm run test - env: - CI: true diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml new file mode 100644 index 0000000000..6c35337bbc --- /dev/null +++ b/.github/workflows/pkg.pr.new.yml @@ -0,0 +1,37 @@ +name: Publish Any Commit + +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] + +jobs: + build: + runs-on: ubuntu-latest + if: github.repository == 'alibaba/hooks' + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm build + + # https://github.com/stackblitz-labs/pkg.pr.new#readme + - run: pnpx pkg-pr-new publish './packages/*' --no-template --compact diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 0000000000..52d64842bd --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,70 @@ +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["master"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +permissions: + contents: write + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + env: + NODE_OPTIONS: --openssl-legacy-provider + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Setup pnpm + run: | + npm install --global corepack@latest + corepack enable + corepack prepare pnpm@latest --activate + echo "$(pnpm bin --global)" >> $GITHUB_PATH + + - name: Install dependencies + run: pnpm install + + - name: Cache pnpm dependencies + uses: actions/cache@v4 + with: + path: | + ~/.pnpm-store + node_modules + key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + + - name: Build documentation + run: npm run build:doc + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist # 构建后的静态文件目录 + force_orphan: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..f472001658 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,57 @@ +name: Test CI + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - run: pnpm install + - run: pnpm run tsc + test: + runs-on: ubuntu-latest + + strategy: + matrix: + mode: ['normal', 'strict'] + node-version: [20, 22] + + steps: + - uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "pnpm_cache_dir=$(pnpm store path)" >> "$GITHUB_OUTPUT" + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: pnpm run install, build + run: | + pnpm run init + + - name: test with react normal mode + if: ${{ matrix.mode == 'normal' }} + run: | + pnpm run test + + - name: test with react strict mode + if: ${{ matrix.mode == 'strict' }} + run: | + pnpm run test:strict diff --git a/.gitignore b/.gitignore index 52a57c884d..7b2f232f19 100755 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ packages/hooks/README.md yarn-error.log package-lock.json metadata.json +.eslintcache diff --git a/.husky/pre-commit b/.husky/pre-commit index 47646a694b..7e83bacc99 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -npm run pretty +npm run pretty \ No newline at end of file diff --git a/.npmrc b/.npmrc index 009aa06dd7..c483022c0a 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ -shamefully-hoist=true -auto-install-peers=true +shamefully-hoist=true \ No newline at end of file diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 73157fd376..0000000000 --- a/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -packages/**/*.mdx -package.json -.umi -.umi-production \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index a1c94a1cf1..0000000000 --- a/.prettierrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "printWidth": 100, - "overrides": [ - { - "files": ".prettierrc", - "options": { - "parser": "json" - } - }, - { - "files": ["*.md"], - "options": { - "embeddedLanguageFormatting": "off" - } - } - ] -} diff --git a/LICENSE b/LICENSE index 35d401d35a..aebeda7fec 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 ahooks +Copyright (c) 2019-present ahooks Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 00b6cad08c..0d602a509e 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ A high-quality & reliable React Hooks library. [![npm](https://img.shields.io/github/issues/alibaba/hooks)](https://github.com/alibaba/hooks/issues) [![Coverage Status](https://coveralls.io/repos/github/alibaba/hooks/badge.svg?branch=master)](https://coveralls.io/github/alibaba/hooks?branch=master) ![gzip size](https://img.badgesize.io/https:/unpkg.com/ahooks/dist/ahooks.js?label=gzip%20size&compression=gzip) -[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Percentage of issues still open') -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Average time to resolve an issue') +[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Average time to resolve an issue") ![GitHub](https://img.shields.io/github/license/alibaba/hooks) English | [简体中文](https://github.com/alibaba/hooks/blob/master/README.zh-CN.md) @@ -27,6 +27,12 @@ English | [简体中文](https://github.com/alibaba/hooks/blob/master/README.zh- - [English](https://ahooks.js.org/) - [中文](https://ahooks.js.org/zh-CN/) +> Notice +> +> `use-url-state` is now published as `@ahooks.js/use-url-state`. +> +> If you are installing or upgrading this package, please use the new package name. + ## ✨ Features - Easy to learn and use @@ -44,12 +50,14 @@ $ npm install --save ahooks $ yarn add ahooks # or $ pnpm add ahooks +# or +$ bun add ahooks ``` ## 🔨 Usage ```ts -import { useRequest } from 'ahooks'; +import { useRequest } from "ahooks"; ``` ## 💻 Online Demo @@ -77,7 +85,9 @@ Thanks to all the contributors: ## 👥 Discuss - +ahooks discussion group 1 +ahooks discussion group 2 +ahooks discussion group 3 [1]: https://www.npmjs.com/package/ahooks [2]: https://npmjs.org/package/ahooks diff --git a/README.zh-CN.md b/README.zh-CN.md index 35baf4c71e..288a980a3a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -14,8 +14,8 @@ [![Coverage Status](https://coveralls.io/repos/github/alibaba/hooks/badge.svg?branch=master)](https://coveralls.io/github/alibaba/hooks?branch=master) [![npm](https://img.shields.io/github/issues/alibaba/hooks)](https://github.com/alibaba/hooks/issues) ![gzip size](https://img.badgesize.io/https:/unpkg.com/ahooks/dist/ahooks.js?label=gzip%20size&compression=gzip) -[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Percentage of issues still open') -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Average time to resolve an issue') +[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Average time to resolve an issue") ![GitHub](https://img.shields.io/github/license/alibaba/hooks) [English](https://github.com/alibaba/hooks/blob/master/README.md) | 简体中文 @@ -27,6 +27,12 @@ - [English](https://ahooks.js.org/) - [中文](https://ahooks.js.org/zh-CN/) +> 公告 +> +> `use-url-state` 已改为使用新包名 `@ahooks.js/use-url-state` 发布。 +> +> 如果你正在安装或升级这个包,请使用新的包名。 + ## ✨ 特性 - 易学易用 @@ -44,12 +50,14 @@ $ npm install --save ahooks $ yarn add ahooks # or $ pnpm add ahooks +# or +$ bun add ahooks ``` ## 🔨 使用 ```js -import { useRequest } from 'ahooks'; +import { useRequest } from "ahooks"; ``` ## 💻 在线体验 @@ -77,7 +85,9 @@ $ pnpm start ## 👥 交流讨论 - + + + [1]: https://www.npmjs.com/package/ahooks [2]: https://npmjs.org/package/ahooks diff --git a/biome.json b/biome.json new file mode 100644 index 0000000000..8a065ce3d6 --- /dev/null +++ b/biome.json @@ -0,0 +1,47 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "files": { + "ignoreUnknown": true + }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "linter": { + "rules": { + "style": { + "noNonNullAssertion": "off" + }, + "correctness": { + "useHookAtTopLevel": "error" + }, + "suspicious": { + "noExplicitAny": "off" + } + } + }, + "formatter": { + "lineWidth": 100, + "indentStyle": "space" + }, + "javascript": { + "parser": { + "unsafeParameterDecoratorsEnabled": true + }, + "formatter": { + "quoteStyle": "single" + } + }, + "css": { + "parser": { + "cssModules": true + }, + "formatter": { + "enabled": true + }, + "linter": { + "enabled": true + } + } +} diff --git a/config/config.ts b/config/config.ts index b2cf6c1405..0ded793b50 100644 --- a/config/config.ts +++ b/config/config.ts @@ -9,6 +9,8 @@ export default { type: 'none', exclude: [], }, + // https://github.com/alibaba/hooks/issues/2155 + extraBabelIncludes: ['filter-obj'], extraBabelPlugins: [ [ 'babel-plugin-import', @@ -35,9 +37,10 @@ export default { dynamicImport: {}, manifest: {}, hash: true, + publicPath: '/', alias: { ahooks: process.cwd() + '/packages/hooks/src/index.ts', - '@ahooksjs/use-url-state': process.cwd() + '/packages/use-url-state/src/index.ts', + '@ahooks.js/use-url-state': process.cwd() + '/packages/use-url-state/src/index.ts', }, resolve: { includes: ['docs', 'packages/hooks/src', 'packages/use-url-state'], @@ -67,7 +70,7 @@ export default { ], }, { title: '更新日志', path: 'https://github.com/alibaba/hooks/releases' }, - { title: '国内镜像', path: 'https://ahooks.gitee.io/zh-CN' }, + { title: '备用镜像', path: 'https://alibaba.github.io/hooks/' }, { title: 'GitHub', path: 'https://github.com/alibaba/hooks' }, ], 'en-US': [ @@ -87,7 +90,7 @@ export default { ], }, { title: 'Releases', path: 'https://github.com/alibaba/hooks/releases' }, - { title: '国内镜像', path: 'https://ahooks.gitee.io/zh-CN' }, + { title: '国内镜像', path: 'https://alibaba.github.io/hooks/' }, { title: 'GitHub', path: 'https://github.com/alibaba/hooks' }, ], }, @@ -180,20 +183,27 @@ export default { scripts: [ 'https://s4.cnzz.com/z_stat.php?id=1278992092&web_id=1278992092', ` - const insertVersion = function(){ + const insertVersion = function() { + const logo = document.querySelector('.__dumi-default-navbar-logo'); + if (!logo) return; const dom = document.createElement('span'); dom.id = 'logo-version'; dom.innerHTML = '${packages.version}'; - const logo = document.querySelector('.__dumi-default-navbar-logo'); - if(logo){ - logo.parentNode.insertBefore(dom, logo.nextSibling); - }else{ - setTimeout(()=>{ - insertVersion(); - }, 1000) + logo.parentNode.insertBefore(dom, logo.nextSibling); + }; + const observer = new MutationObserver((mutationsList, observer) => { + for (const mutation of mutationsList) { + if (mutation.type === 'childList') { + const logoVersion = document.querySelector('#logo-version'); + if (logoVersion) { + observer.disconnect(); + } else { + insertVersion(); + } + } } - } - insertVersion(); + }); + observer.observe(document.body, { childList: true, subtree: true }); `, ], }; diff --git a/config/hooks.ts b/config/hooks.ts index fa74274cf2..26ffff428a 100644 --- a/config/hooks.ts +++ b/config/hooks.ts @@ -31,6 +31,7 @@ export const menus = [ 'useCounter', 'useTextSelection', 'useWebSocket', + 'useTheme', ], }, { diff --git a/docs/guide/index.en-US.md b/docs/guide/index.en-US.md index 41f2a45e60..77b03a4dff 100644 --- a/docs/guide/index.en-US.md +++ b/docs/guide/index.en-US.md @@ -19,6 +19,8 @@ $ npm install --save ahooks $ yarn add ahooks # or $ pnpm add ahooks +# or +$ bun add ahooks ``` ## Usage diff --git a/docs/guide/index.zh-CN.md b/docs/guide/index.zh-CN.md index 27ff40b100..520f2f1a55 100644 --- a/docs/guide/index.zh-CN.md +++ b/docs/guide/index.zh-CN.md @@ -19,6 +19,8 @@ $ npm install --save ahooks $ yarn add ahooks # or $ pnpm add ahooks +# or +$ bun add ahooks ``` ## 使用 diff --git a/docs/guide/upgrade.en-US.md b/docs/guide/upgrade.en-US.md index 991704f02b..8a3adaed47 100644 --- a/docs/guide/upgrade.en-US.md +++ b/docs/guide/upgrade.en-US.md @@ -20,6 +20,16 @@ npm install ahooks-v2 --save npm install ahooks --save ``` +## `use-url-state` package rename + +The standalone `use-url-state` package is now published as `@ahooks.js/use-url-state`. + +If you are installing this package for the first time or upgrading from the previous package name, please use the new package name: + +```bash +npm install @ahooks.js/use-url-state --save +``` + ## New useRequest useRequest has been rewritten: @@ -36,7 +46,7 @@ useRequest has been rewritten: - Removed `pagination` related options, it is recommended to use `usePagination` or `useAntdTable` to achieve paging ability. - Removed `loadMore` related options, it is recommended to use `useInfiniteScroll` to achieve unlimited loading ability. - Removed `fetchKey`, that is, deleted concurrent request. -- Removed `formatResult`, `initialData`, and `thrownError`. +- Removed `formatResult`, `initialData`, and `throwOnError`. - The request library is no longer integrated by default, and `service` no longer supports string or object. - Added `runAsync` and `refreshAsync`, the original `run` no longer returns Promise. - Added error retry ability. diff --git a/docs/guide/upgrade.zh-CN.md b/docs/guide/upgrade.zh-CN.md index ab37a65a0f..a468845896 100644 --- a/docs/guide/upgrade.zh-CN.md +++ b/docs/guide/upgrade.zh-CN.md @@ -20,6 +20,16 @@ npm install ahooks-v2 --save npm install ahooks --save ``` +## `use-url-state` 包名变更 + +独立包 `use-url-state` 现已使用新包名 `@ahooks.js/use-url-state` 发布。 + +如果你是首次安装,或者正在从旧包名升级,请改用新的包名: + +```bash +npm install @ahooks.js/use-url-state --save +``` + ## 全新的 useRequest useRequest 完全进行了重写: @@ -36,7 +46,7 @@ useRequest 完全进行了重写: - 删除了 `pagination` 相关属性,建议使用 `usePagination` 或 `useAntdTable` 来实现分页能力。 - 删除了 `loadMore` 相关属性,建议使用 `useInfiniteScroll` 来实现无限加载能力。 - 删除了 `fetchKey`,也就是删除了并行能力。 -- 删除了 `formatResult`、`initialData`、`thrownError`。 +- 删除了 `formatResult`、`initialData`、`throwOnError`。 - 不再默认集成请求库,`service` 不再支持字符或对象。 - 新增了 `runAsync` 和 `refreshAsync`,原来的 `run` 不再返回 Promise。 - 新增了错误重试能力。 diff --git a/docs/index.en-US.md b/docs/index.en-US.md index 858d77b6a5..82b0c7a13b 100644 --- a/docs/index.en-US.md +++ b/docs/index.en-US.md @@ -17,8 +17,8 @@ footer: Open-source MIT Licensed | Copyright © 2019-present
Powered by [du [![npm](https://img.shields.io/github/issues/alibaba/hooks)](https://github.com/alibaba/hooks/issues) [![Coverage Status](https://coveralls.io/repos/github/alibaba/hooks/badge.svg?branch=master)](https://coveralls.io/github/alibaba/hooks?branch=master) ![gzip size](https://img.badgesize.io/https:/unpkg.com/ahooks/dist/ahooks.js?label=gzip%20size&compression=gzip) -[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Percentage of issues still open') -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Average time to resolve an issue') +[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Average time to resolve an issue") ![GitHub](https://img.shields.io/github/license/alibaba/hooks) ## ✨ Features @@ -30,6 +30,7 @@ footer: Open-source MIT Licensed | Copyright © 2019-present
Powered by [du - Contains a comprehensive collection of basic Hooks - Written in TypeScript with predictable static types + ## 📦 Install ```bash @@ -38,12 +39,14 @@ $ npm install --save ahooks $ yarn add ahooks # or $ pnpm add ahooks +# or +$ bun add ahooks ``` ## 🔨 Usage ```ts -import { useRequest } from 'ahooks'; +import { useRequest } from "ahooks"; ``` ## 💻 Online Demo @@ -71,7 +74,9 @@ Thanks to all the contributors: ## 👥 Discuss - +ahooks discussion group 1 +ahooks discussion group 2 +ahooks discussion group 3 [1]: https://www.npmjs.com/package/ahooks [2]: https://npmjs.org/package/ahooks diff --git a/docs/index.zh-CN.md b/docs/index.zh-CN.md index 7460ea9e7c..2abe2d8950 100644 --- a/docs/index.zh-CN.md +++ b/docs/index.zh-CN.md @@ -17,8 +17,8 @@ footer: Open-source MIT Licensed | Copyright © 2019-present
Powered by [du [![npm](https://img.shields.io/github/issues/alibaba/hooks)](https://github.com/alibaba/hooks/issues) [![Coverage Status](https://coveralls.io/repos/github/alibaba/hooks/badge.svg?branch=master)](https://coveralls.io/github/alibaba/hooks?branch=master) ![gzip size](https://img.badgesize.io/https:/unpkg.com/ahooks/dist/ahooks.js?label=gzip%20size&compression=gzip) -[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Percentage of issues still open') -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks 'Average time to resolve an issue') +[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Percentage of issues still open") +[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/hooks.svg)](http://isitmaintained.com/project/alibaba/hooks "Average time to resolve an issue") ![GitHub](https://img.shields.io/github/license/alibaba/hooks) ## ✨ 特性 @@ -36,12 +36,16 @@ footer: Open-source MIT Licensed | Copyright © 2019-present
Powered by [du $ npm install --save ahooks # or $ yarn add ahooks +# or +$ pnpm add ahooks +# or +$ bun add ahooks ``` ## 🔨 使用 ```ts -import { useRequest } from 'ahooks'; +import { useRequest } from "ahooks"; ``` ## 💻 在线体验 @@ -69,7 +73,9 @@ $ pnpm start ## 👥 交流讨论 - +ahooks 交流群1 +ahooks 交流群2 +ahooks 交流群3 [1]: https://www.npmjs.com/package/ahooks [2]: https://npmjs.org/package/ahooks diff --git a/example/.gitkeep b/example/.gitkeep new file mode 100644 index 0000000000..517c2d3237 --- /dev/null +++ b/example/.gitkeep @@ -0,0 +1,15 @@ +import React from 'react'; +import { useBoolean } from 'ahooks'; + +export default function Demo() { + const [state, { toggle, setTrue, setFalse }] = useBoolean(false); + + return ( +
+

Current state: {state ? 'ON' : 'OFF'}

+ + + +
+ ); +} diff --git a/example/basic/.editorconfig b/example/basic/.editorconfig deleted file mode 100755 index 7e3649acc2..0000000000 --- a/example/basic/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false - -[Makefile] -indent_style = tab diff --git a/example/basic/.gitignore b/example/basic/.gitignore deleted file mode 100644 index bee1cf61ce..0000000000 --- a/example/basic/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/npm-debug.log* -/yarn-error.log -/yarn.lock -/package-lock.json - -# production -/dist - -# misc -.DS_Store - -# umi -/src/.umi -/src/.umi-production -/src/.umi-test -/.env.local diff --git a/example/basic/.prettierignore b/example/basic/.prettierignore deleted file mode 100644 index 0d4222f544..0000000000 --- a/example/basic/.prettierignore +++ /dev/null @@ -1,8 +0,0 @@ -**/*.md -**/*.svg -**/*.ejs -**/*.html -package.json -.umi -.umi-production -.umi-test diff --git a/example/basic/.prettierrc b/example/basic/.prettierrc deleted file mode 100644 index 94beb14840..0000000000 --- a/example/basic/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all", - "printWidth": 80, - "overrides": [ - { - "files": ".prettierrc", - "options": { "parser": "json" } - } - ] -} diff --git a/example/basic/.umirc.ts b/example/basic/.umirc.ts deleted file mode 100644 index e21d25ee86..0000000000 --- a/example/basic/.umirc.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'umi'; - -export default defineConfig({ - nodeModulesTransform: { - type: 'none', - }, - routes: [{ path: '/', component: '@/pages/index' }], - fastRefresh: {}, - ssr: {}, -}); diff --git a/example/basic/README.md b/example/basic/README.md deleted file mode 100644 index 07afeb7fd6..0000000000 --- a/example/basic/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# umi project - -## Getting Started - -Install dependencies, - -```bash -$ yarn -``` - -Start the dev server, - -```bash -$ yarn start -``` diff --git a/example/basic/mock/.gitkeep b/example/basic/mock/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/example/basic/package.json b/example/basic/package.json deleted file mode 100644 index 6f69a31d77..0000000000 --- a/example/basic/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "private": true, - "scripts": { - "start": "umi dev", - "build": "umi build", - "postinstall": "umi generate tmp", - "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'", - "test": "umi-test", - "test:coverage": "umi-test --coverage" - }, - "gitHooks": { - "pre-commit": "lint-staged" - }, - "lint-staged": { - "*.{js,jsx,less,md,json}": [ - "prettier --write" - ], - "*.ts?(x)": [ - "prettier --parser=typescript --write" - ] - }, - "dependencies": { - "@ant-design/pro-layout": "^6.5.0", - "@umijs/preset-react": "1.x", - "umi": "^3.4.20" - }, - "devDependencies": { - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@umijs/test": "^3.4.20", - "lint-staged": "^10.0.7", - "prettier": "^2.2.0", - "react": "17.x", - "react-dom": "17.x", - "typescript": "^4.1.2", - "yorkie": "^2.0.0" - } -} diff --git a/example/basic/src/pages/index.less b/example/basic/src/pages/index.less deleted file mode 100644 index 586302bfc8..0000000000 --- a/example/basic/src/pages/index.less +++ /dev/null @@ -1,3 +0,0 @@ -.title { - background: rgb(121, 242, 157); -} diff --git a/example/basic/src/pages/index.tsx b/example/basic/src/pages/index.tsx deleted file mode 100644 index ebdd169f7d..0000000000 --- a/example/basic/src/pages/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import styles from './index.less'; - -export default function IndexPage() { - return ( -
-

Page index

-
- ); -} diff --git a/example/basic/tsconfig.json b/example/basic/tsconfig.json deleted file mode 100644 index bc5250b036..0000000000 --- a/example/basic/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "jsx": "react-jsx", - "esModuleInterop": true, - "sourceMap": true, - "baseUrl": "./", - "strict": true, - "paths": { - "@/*": ["src/*"], - "@@/*": ["src/.umi/*"] - }, - "allowSyntheticDefaultImports": true - }, - "include": [ - "mock/**/*", - "src/**/*", - "config/**/*", - ".umirc.ts", - "typings.d.ts" - ], - "exclude": [ - "node_modules", - "lib", - "es", - "dist", - "typings", - "**/__test__", - "test", - "docs", - "tests" - ] -} diff --git a/example/basic/typings.d.ts b/example/basic/typings.d.ts deleted file mode 100644 index 06c8a5b8ca..0000000000 --- a/example/basic/typings.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module '*.css'; -declare module '*.less'; -declare module '*.png'; -declare module '*.svg' { - export function ReactComponent( - props: React.SVGProps, - ): React.ReactElement; - const url: string; - export default url; -} diff --git a/example/taro/.editorconfig b/example/taro/.editorconfig deleted file mode 100644 index 5760be5836..0000000000 --- a/example/taro/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/example/taro/.eslintrc b/example/taro/.eslintrc deleted file mode 100644 index 7809e66a31..0000000000 --- a/example/taro/.eslintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": ["taro/react"], - "rules": { - "react/jsx-uses-react": "off", - "react/react-in-jsx-scope": "off" - } -} diff --git a/example/taro/.gitignore b/example/taro/.gitignore deleted file mode 100644 index 2cea3efd8c..0000000000 --- a/example/taro/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -dist/ -deploy_versions/ -.temp/ -.rn_temp/ -node_modules/ -.DS_Store diff --git a/example/taro/.npmrc b/example/taro/.npmrc deleted file mode 100644 index 7147182c1c..0000000000 --- a/example/taro/.npmrc +++ /dev/null @@ -1,10 +0,0 @@ -registry=https://registry.npmmirror.com -disturl=https://npmmirror.com/dist -sass_binary_site=https://npmmirror.com/mirrors/node-sass/ -phantomjs_cdnurl=https://npmmirror.com/mirrors/phantomjs/ -electron_mirror=https://npmmirror.com/mirrors/electron/ -chromedriver_cdnurl=https://npmmirror.com/mirrors/chromedriver -operadriver_cdnurl=https://npmmirror.com/mirrors/operadriver -selenium_cdnurl=https://npmmirror.com/mirrors/selenium -node_inspector_cdnurl=https://npmmirror.com/mirrors/node-inspector -fsevents_binary_host_mirror=https://npmmirror.com/mirrors/fsevents/ diff --git a/example/taro/README.md b/example/taro/README.md deleted file mode 100644 index b4d3cad8ed..0000000000 --- a/example/taro/README.md +++ /dev/null @@ -1,23 +0,0 @@ -## CLI 工具安装 - -```bash -$ tnpm install -g @tarojs/cli -``` - -## 运行 - -支付宝环境运行 - -```bash -$ npm run dev:alipay -``` - -### 支付宝小程序 IDE 下载 - -下载并打开[https://render.alipay.com/p/f/fd-jwq8nu2a/pages/home/index.html](支付宝小程序开发者工具),然后选择项目根目录下 dist 目录(根目录 config 中的 outputRoot 设置的目录)进行预览。 - -> 支付宝小程序开发者工具推荐使用 Lite 模式 - -## 编码地址 - -测试文件用 `pages/index/index.tsx` diff --git a/example/taro/babel.config.js b/example/taro/babel.config.js deleted file mode 100644 index 12f3043195..0000000000 --- a/example/taro/babel.config.js +++ /dev/null @@ -1,13 +0,0 @@ -// babel-preset-taro 更多选项和默认值: -// https://github.com/NervJS/taro/blob/next/packages/babel-preset-taro/README.md -module.exports = { - presets: [ - [ - 'taro', - { - framework: 'react', - ts: true, - }, - ], - ], -}; diff --git a/example/taro/config/dev.js b/example/taro/config/dev.js deleted file mode 100644 index ff3c9441e9..0000000000 --- a/example/taro/config/dev.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - env: { - NODE_ENV: '"development"', - }, - defineConstants: {}, - mini: {}, - h5: {}, -}; diff --git a/example/taro/config/index.js b/example/taro/config/index.js deleted file mode 100644 index e2959e44a1..0000000000 --- a/example/taro/config/index.js +++ /dev/null @@ -1,64 +0,0 @@ -const config = { - projectName: 'taro', - date: '2021-6-7', - designWidth: 750, - deviceRatio: { - 640: 2.34 / 2, - 750: 1, - 828: 1.81 / 2, - }, - sourceRoot: 'src', - outputRoot: 'dist', - plugins: [], - defineConstants: {}, - copy: { - patterns: [], - options: {}, - }, - framework: 'react', - mini: { - postcss: { - pxtransform: { - enable: true, - config: {}, - }, - url: { - enable: true, - config: { - limit: 1024, // 设定转换尺寸上限 - }, - }, - cssModules: { - enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true - config: { - namingPattern: 'module', // 转换模式,取值为 global/module - generateScopedName: '[name]__[local]___[hash:base64:5]', - }, - }, - }, - }, - h5: { - publicPath: '/', - staticDirectory: 'static', - postcss: { - autoprefixer: { - enable: true, - config: {}, - }, - cssModules: { - enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true - config: { - namingPattern: 'module', // 转换模式,取值为 global/module - generateScopedName: '[name]__[local]___[hash:base64:5]', - }, - }, - }, - }, -}; - -module.exports = function (merge) { - if (process.env.NODE_ENV === 'development') { - return merge({}, config, require('./dev')); - } - return merge({}, config, require('./prod')); -}; diff --git a/example/taro/config/prod.js b/example/taro/config/prod.js deleted file mode 100644 index 8221c9f5e8..0000000000 --- a/example/taro/config/prod.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - env: { - NODE_ENV: '"production"', - }, - defineConstants: {}, - mini: {}, - h5: { - /** - * 如果h5端编译后体积过大,可以使用webpack-bundle-analyzer插件对打包体积进行分析。 - * 参考代码如下: - * webpackChain (chain) { - * chain.plugin('analyzer') - * .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, []) - * } - */ - }, -}; diff --git a/example/taro/global.d.ts b/example/taro/global.d.ts deleted file mode 100644 index b04f7dca8c..0000000000 --- a/example/taro/global.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// - -declare module '*.png'; -declare module '*.gif'; -declare module '*.jpg'; -declare module '*.jpeg'; -declare module '*.svg'; -declare module '*.css'; -declare module '*.less'; -declare module '*.scss'; -declare module '*.sass'; -declare module '*.styl'; - -declare namespace NodeJS { - interface ProcessEnv { - TARO_ENV: 'weapp' | 'swan' | 'alipay' | 'h5' | 'rn' | 'tt' | 'quickapp' | 'qq' | 'jd'; - } -} diff --git a/example/taro/package.json b/example/taro/package.json deleted file mode 100644 index 2e58f54752..0000000000 --- a/example/taro/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "taro", - "version": "1.0.0", - "private": true, - "description": "ahooks taro 测试环境", - "templateInfo": { - "name": "default", - "typescript": true, - "css": "sass" - }, - "scripts": { - "build:weapp": "taro build --type weapp", - "build:swan": "taro build --type swan", - "build:alipay": "taro build --type alipay", - "build:tt": "taro build --type tt", - "build:h5": "taro build --type h5", - "build:rn": "taro build --type rn", - "build:qq": "taro build --type qq", - "build:jd": "taro build --type jd", - "build:quickapp": "taro build --type quickapp", - "dev:weapp": "npm run build:weapp -- --watch", - "dev:swan": "npm run build:swan -- --watch", - "dev:alipay": "npm run build:alipay -- --watch", - "dev:tt": "npm run build:tt -- --watch", - "dev:h5": "npm run build:h5 -- --watch", - "dev:rn": "npm run build:rn -- --watch", - "dev:qq": "npm run build:qq -- --watch", - "dev:jd": "npm run build:jd -- --watch", - "dev:quickapp": "npm run build:quickapp -- --watch" - }, - "browserslist": [ - "last 3 versions", - "Android >= 4.1", - "ios >= 8" - ], - "author": "", - "dependencies": { - "@babel/runtime": "^7.7.7", - "@tarojs/components": "3.2.9", - "@tarojs/runtime": "3.2.9", - "@tarojs/taro": "3.2.9", - "@tarojs/react": "3.2.9", - "react-dom": "^17.0.0", - "react": "^17.0.0" - }, - "devDependencies": { - "@types/webpack-env": "^1.13.6", - "@types/react": "^17.0.2", - "@tarojs/mini-runner": "3.2.9", - "@babel/core": "^7.8.0", - "@tarojs/webpack-runner": "3.2.9", - "babel-preset-taro": "3.2.9", - "eslint-config-taro": "3.2.9", - "eslint": "^6.8.0", - "eslint-plugin-react": "^7.8.2", - "eslint-plugin-import": "^2.12.0", - "eslint-plugin-react-hooks": "^4.2.0", - "stylelint": "9.3.0", - "@typescript-eslint/parser": "^4.15.1", - "@typescript-eslint/eslint-plugin": "^4.15.1", - "typescript": "^4.1.0" - } -} diff --git a/example/taro/project.config.json b/example/taro/project.config.json deleted file mode 100644 index ec13320b36..0000000000 --- a/example/taro/project.config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "miniprogramRoot": "./dist", - "projectname": "taro", - "description": "ahooks taro 测试环境", - "appid": "touristappid", - "setting": { - "urlCheck": true, - "es6": false, - "postcss": false, - "minified": false - }, - "compileType": "miniprogram" -} diff --git a/example/taro/project.tt.json b/example/taro/project.tt.json deleted file mode 100644 index 2ccd1811f7..0000000000 --- a/example/taro/project.tt.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "miniprogramRoot": "./", - "projectname": "taro", - "appid": "touristappid", - "setting": { - "es6": false, - "minified": false - } -} diff --git a/example/taro/src/app.config.ts b/example/taro/src/app.config.ts deleted file mode 100644 index ab42835af5..0000000000 --- a/example/taro/src/app.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -export default { - pages: ['pages/index/index'], - window: { - backgroundTextStyle: 'light', - navigationBarBackgroundColor: '#fff', - navigationBarTitleText: 'WeChat', - navigationBarTextStyle: 'black', - }, -}; diff --git a/example/taro/src/app.scss b/example/taro/src/app.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/example/taro/src/app.ts b/example/taro/src/app.ts deleted file mode 100644 index 82bb720c04..0000000000 --- a/example/taro/src/app.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component } from 'react'; -import './app.scss'; - -class App extends Component { - componentDidMount() {} - - componentDidShow() {} - - componentDidHide() {} - - componentDidCatchError() {} - - // this.props.children 是将要会渲染的页面 - render() { - return this.props.children; - } -} - -export default App; diff --git a/example/taro/src/index.html b/example/taro/src/index.html deleted file mode 100644 index e857596e2b..0000000000 --- a/example/taro/src/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - -
- - diff --git a/example/taro/src/pages/index/index.config.ts b/example/taro/src/pages/index/index.config.ts deleted file mode 100644 index e9c431b3b6..0000000000 --- a/example/taro/src/pages/index/index.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default { - navigationBarTitleText: '首页', -}; diff --git a/example/taro/src/pages/index/index.scss b/example/taro/src/pages/index/index.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/example/taro/src/pages/index/index.tsx b/example/taro/src/pages/index/index.tsx deleted file mode 100644 index 587c5e4745..0000000000 --- a/example/taro/src/pages/index/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from 'react'; -import { View } from '@tarojs/components'; -import './index.scss'; - -const Index = () => { - return Taro 测试; -}; - -export default Index; diff --git a/example/taro/tsconfig.json b/example/taro/tsconfig.json deleted file mode 100644 index 72c432c7a5..0000000000 --- a/example/taro/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "es2017", - "module": "commonjs", - "removeComments": false, - "preserveConstEnums": true, - "moduleResolution": "node", - "experimentalDecorators": true, - "noImplicitAny": false, - "allowSyntheticDefaultImports": true, - "outDir": "lib", - "noUnusedLocals": true, - "noUnusedParameters": true, - "strictNullChecks": true, - "sourceMap": true, - "baseUrl": ".", - "rootDir": ".", - "jsx": "react-jsx", - "allowJs": true, - "resolveJsonModule": true, - "typeRoots": ["node_modules/@types", "global.d.ts"] - }, - "exclude": ["node_modules", "dist"], - "compileOnSave": false -} diff --git a/gulpfile.js b/gulpfile.js index 740f80cf66..5ddb4d5adb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -3,31 +3,44 @@ const babel = require('gulp-babel'); const ts = require('gulp-typescript'); const del = require('del'); -gulp.task('clean', async function () { +gulp.task('clean', async () => { await del('lib/**'); await del('es/**'); await del('dist/**'); }); -gulp.task('cjs', function () { - return gulp +gulp.task('cjs', () => + gulp .src(['./es/**/*.js']) .pipe( babel({ configFile: '../../.babelrc', }), ) - .pipe(gulp.dest('lib/')); -}); + .pipe(gulp.dest('lib/')), +); -gulp.task('es', function () { - const tsProject = ts.createProject('tsconfig.pro.json', { - module: 'ESNext', - }); - return tsProject.src().pipe(tsProject()).pipe(babel()).pipe(gulp.dest('es/')); +gulp.task('es', async () => { + const { execSync } = require('child_process'); + + // 使用 tsc 直接编译 + console.log('Running TypeScript compilation...'); + execSync('npx tsc --project tsconfig.pro.json --outDir es --module esnext', { stdio: 'inherit' }); + console.log('TypeScript compilation completed'); + + // 然后运行 babel 转换 + console.log('Running Babel transformation...'); + return gulp + .src(['es/**/*.js']) + .pipe( + babel({ + configFile: './.babelrc', + }), + ) + .pipe(gulp.dest('es/')); }); -gulp.task('declaration', function () { +gulp.task('declaration', () => { const tsProject = ts.createProject('tsconfig.pro.json', { declaration: true, emitDeclarationOnly: true, @@ -35,7 +48,7 @@ gulp.task('declaration', function () { return tsProject.src().pipe(tsProject()).pipe(gulp.dest('es/')).pipe(gulp.dest('lib/')); }); -gulp.task('copyReadme', async function () { +gulp.task('copyReadme', async () => { await gulp.src('../../README.md').pipe(gulp.dest('../../packages/hooks')); }); diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index ffa689389f..0000000000 --- a/jest.config.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - preset: 'ts-jest/presets/js-with-ts', - testEnvironment: 'jsdom', - clearMocks: true, - testPathIgnorePatterns: ['/.history/'], - modulePathIgnorePatterns: ['/package.json'], - resetMocks: false, - setupFiles: ['./jest.setup.ts', 'jest-localstorage-mock'], - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.json', - }, - }, - collectCoverageFrom: [ - '/**/src/**/*.{js,jsx,ts,tsx}', - '!**/demo/**', - '!**/example/**', - '!**/es/**', - '!**/lib/**', - '!**/dist/**', - ], - transformIgnorePatterns: ['^.+\\.js$'], -}; diff --git a/jest.setup.ts b/jest.setup.ts deleted file mode 100644 index eb3a7bf649..0000000000 --- a/jest.setup.ts +++ /dev/null @@ -1,14 +0,0 @@ -// mock screen full events -// https://github.com/sindresorhus/screenfull/blob/main/index.js -const screenfullMethods = [ - 'requestFullscreen', - 'exitFullscreen', - 'fullscreenElement', - 'fullscreenEnabled', - 'fullscreenchange', - 'fullscreenerror', -]; -screenfullMethods.forEach((item) => { - document[item] = () => {}; - HTMLElement.prototype[item] = () => {}; -}); diff --git a/package.json b/package.json index b885810bbc..89d394fa73 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,10 @@ { "name": "ahooks", "private": true, + "packageManager": "pnpm@10.12.4", + "engines": { + "pnpm": ">=7 <=10" + }, "repository": { "type": "git", "url": "git+https://github.com/alibaba/hooks.git" @@ -8,49 +12,51 @@ "scripts": { "init": "pnpm install && pnpm run build", "start": "pnpm run dev", - "dev": "dumi dev", + "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider dumi dev", "clean-dist": "rimraf 'packages/*/{lib,es,node_modules,dist}'", "clean": "pnpm run clean-dist && rimraf node_modules", "build": "pnpm -r --filter=./packages/* run build", - "test": "jest", - "coveralls": "jest --coverage --coverageReporters=text-lcov | coveralls", - "lint": "eslint --ignore-pattern **/__tests__/* --ignore-pattern **/demo/* \"packages/*/src/**/*.{ts,tsx}\"", - "pretty": "pretty-quick --staged", - "build:doc": "dumi build", + "test": "pnpm --filter=./packages/* test", + "test:strict": "cross-env REACT_MODE=strict pnpm --filter=./packages/* test:cov", + "coveralls": "vitest run --coverage | coveralls", + "lint": "biome lint --fix", + "pretty": "biome format --fix --no-errors-on-unmatched", + "build:doc": "cross-env NODE_OPTIONS=--openssl-legacy-provider dumi build", + "build:doc-github": "node scripts/build-with-relative-paths.js", "pub:doc-surge": "surge ./dist --domain ahooks.js.org", - "pub:doc-gitee": "cd ./dist && rm -rf .git && touch .spa && touch .nojekyll && git init && git remote add origin git@gitee.com:ahooks/ahooks.git && git add -A && git commit -m \"publish docs\" && git push origin master -f && echo https://gitee.com/ahooks/ahooks/pages", - "pub:doc": "pnpm run build:doc && pnpm run pub:doc-surge && pnpm run pub:doc-gitee", + "pub:doc-gitee": "cd ./dist && rm -rf .git && touch .spa && touch .nojekyll && git init && git remote add origin git@gitee.com:ahooks/ahooks.git && git add -A && git commit -m \"publish docs\" && git push origin main -f && echo https://gitee.com/ahooks/ahooks/pages", + "pub:doc": "pnpm run build:doc && pnpm run pub:doc-surge && pnpm run build:doc-github", "pub": "pnpm run build && pnpm -r --filter=./packages/* publish", "pub:beta": "pnpm run build && pnpm -r --filter=./packages/* publish --tag beta", "preinstall": "npx only-allow pnpm", - "prepare": "husky install" + "prepare": "husky install", + "commit": "git add -A && czg", + "tsc": "pnpm --filter=./packages/* tsc" }, "devDependencies": { - "@ant-design/icons": "^4.6.2", + "@alifd/next": "^1.27.32", + "@ant-design/icons": "^5.6.1", "@babel/cli": "^7.10.1", "@babel/core": "^7.10.2", "@babel/plugin-transform-runtime": "^7.19.6", + "@biomejs/biome": "^2.0.6", "@commitlint/cli": "^17.1.2", "@commitlint/config-conventional": "^17.1.0", - "@testing-library/react": "^10.0.4", - "@testing-library/react-hooks": "^8.0.1", - "@types/jest": "^27.4.1", - "@types/lodash.debounce": "^4.0.6", - "@types/lodash.isequal": "^4.5.5", - "@types/lodash.throttle": "^4.1.6", - "@types/react-router": "^5.1.18", + "@testing-library/react": "^16.3.0", + "@types/lodash": "^4.17.20", + "@types/mockjs": "^1.0.7", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@types/react-router": "^5.1.19", "@umijs/fabric": "^2.1.0", - "@umijs/plugin-sass": "^1.1.1", - "antd": "^4.3.3", - "babel-loader": "^8.1.0", + "@vitest/coverage-istanbul": "^3.2.4", + "antd": "^5.26.3", "babel-plugin-import": "^1.12.0", - "babel-plugin-transform-async-to-promises": "^0.8.15", "coveralls": "^3.1.1", + "cross-env": "^7.0.3", + "czg": "^1.12.0", "del": "^5.1.0", - "dumi": "^1.1.48", - "enzyme": "^3.10.0", - "eslint": "^7.2.0", - "eslint-plugin-react-hooks": "^4.0.8", + "dumi": "^1.1.54", "fast-glob": "^3.2.11", "fs-extra": "^10.0.1", "gray-matter": "^4.0.3", @@ -58,29 +64,26 @@ "gulp-babel": "^8.0.0", "gulp-typescript": "^6.0.0-alpha.1", "husky": "^8.0.0", - "jest": "^27.5.1", - "jest-fetch-mock": "^3.0.3", - "jest-localstorage-mock": "^2.4.18", + "jsdom": "^26.1.0", "mockjs": "^1.1.0", - "prettier": "^2.0.5", - "pretty-quick": "^3.1.3", - "react": "^16.8.6", - "react-dom": "^16.8.6", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-drag-listview": "^0.1.6", - "react-shadow": "^19.0.3", - "react-test-renderer": "^16.13.1", + "react-json-view": "^1.21.3", + "react-router": "^6.4.2", + "react-shadow": "^20.6.0", "rimraf": "^3.0.2", "surge": "^0.21.3", - "ts-jest": "^27.1.5", - "typescript": "^4.8.4", - "umi-request": "^1.2.18", - "webpack": "^4.43.0", - "webpack-cli": "^3.3.10", - "webpack-merge": "^4.2.2" + "typescript": "^5.8.3", + "vitest": "^3.2.4", + "vitest-websocket-mock": "^0.5.0", + "webpack": "^5.99.9", + "webpack-cli": "^6.0.1", + "webpack-merge": "^6.0.1" }, "commitlint": { "extends": [ "@commitlint/config-conventional" ] } -} \ No newline at end of file +} diff --git a/packages/hooks/package.json b/packages/hooks/package.json index cc1d40ca46..5895137a61 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "ahooks", - "version": "3.7.2", + "version": "3.9.7", "description": "react hooks library", "keywords": [ "ahooks", @@ -22,7 +22,10 @@ "repository": "https://github.com/alibaba/hooks", "homepage": "https://github.com/alibaba/hooks", "scripts": { - "build": "gulp && webpack-cli" + "build": "gulp && webpack-cli", + "test": "vitest run --color", + "test:cov": "vitest run --color --coverage", + "tsc": "tsc --noEmit" }, "files": [ "dist", @@ -33,31 +36,20 @@ "README.md" ], "dependencies": { - "@types/js-cookie": "^2.x.x", - "ahooks-v3-count": "^1.0.0", + "@types/js-cookie": "^3.0.6", + "@babel/runtime": "^7.21.0", "dayjs": "^1.9.1", "intersection-observer": "^0.12.0", - "js-cookie": "^2.x.x", + "js-cookie": "^3.0.5", "lodash": "^4.17.21", + "react-fast-compare": "^3.2.2", "resize-observer-polyfill": "^1.5.1", - "screenfull": "^5.0.0" + "screenfull": "^5.0.0", + "tslib": "^2.4.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "devDependencies": { - "@alifd/next": "^1.20.6", - "@ant-design/icons": "^4.6.2", - "@types/enzyme": "^3.10.5", - "antd": "^4.16.9", - "enzyme-adapter-react-16": "^1.15.4", - "jest-websocket-mock": "^2.1.0", - "mock-socket": "^9.0.3", - "mockjs": "^1.1.0", - "react-drag-listview": "^0.1.6" - }, - "engines": { - "node": ">=8.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "license": "MIT", "gitHead": "11f6ad571bd365c95ecb9409ca3050cbbfc9b34a" diff --git a/packages/hooks/src/__tests__/index.test.ts b/packages/hooks/src/__tests__/index.test.ts deleted file mode 100644 index 533c859ee6..0000000000 --- a/packages/hooks/src/__tests__/index.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import * as ahooks from '..'; - -describe('ahooks', () => { - test('exports modules should be defined', () => { - Object.keys(ahooks).forEach((module) => { - expect(ahooks[module]).toBeDefined(); - }); - }); -}); diff --git a/packages/hooks/src/createDeepCompareEffect/__tests__/index.test.ts b/packages/hooks/src/createDeepCompareEffect/__tests__/index.spec.ts similarity index 85% rename from packages/hooks/src/createDeepCompareEffect/__tests__/index.test.ts rename to packages/hooks/src/createDeepCompareEffect/__tests__/index.spec.ts index 59f18152b0..1356e8c452 100644 --- a/packages/hooks/src/createDeepCompareEffect/__tests__/index.test.ts +++ b/packages/hooks/src/createDeepCompareEffect/__tests__/index.spec.ts @@ -1,9 +1,10 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { useEffect, useLayoutEffect, useState } from 'react'; +import { describe, expect, test } from 'vitest'; import { createDeepCompareEffect } from '../index'; describe('createDeepCompareEffect', () => { - it('should work for useEffect', async () => { + test('should work for useEffect', async () => { const useDeepCompareEffect = createDeepCompareEffect(useEffect); const hook = renderHook(() => { @@ -30,7 +31,7 @@ describe('createDeepCompareEffect', () => { expect(hook.result.current.x).toBe(2); }); - it('should work for useLayoutEffect', async () => { + test('should work for useLayoutEffect', async () => { const useDeepCompareLayoutEffect = createDeepCompareEffect(useLayoutEffect); const hook = renderHook(() => { @@ -57,7 +58,7 @@ describe('createDeepCompareEffect', () => { expect(hook.result.current.x).toBe(2); }); - it('deps is undefined should rerender in useEffect', async () => { + test('deps is undefined should rerender in useEffect', async () => { const useDeepCompareLayoutEffect = createDeepCompareEffect(useEffect); let count = 0; const hook = renderHook(() => { @@ -73,7 +74,7 @@ describe('createDeepCompareEffect', () => { expect(count).toBe(3); }); - it('deps is undefined should rerender in useLayoutEffect', async () => { + test('deps is undefined should rerender in useLayoutEffect', async () => { const useDeepCompareLayoutEffect = createDeepCompareEffect(useLayoutEffect); let count = 0; const hook = renderHook(() => { diff --git a/packages/hooks/src/createDeepCompareEffect/index.ts b/packages/hooks/src/createDeepCompareEffect/index.ts index b641b52e52..afccc6d373 100644 --- a/packages/hooks/src/createDeepCompareEffect/index.ts +++ b/packages/hooks/src/createDeepCompareEffect/index.ts @@ -1,22 +1,17 @@ import { useRef } from 'react'; import type { DependencyList, useEffect, useLayoutEffect } from 'react'; -import isEqual from 'lodash/isEqual'; +import { depsEqual } from '../utils/depsEqual'; type EffectHookType = typeof useEffect | typeof useLayoutEffect; -type CreateUpdateEffect = (hook: EffectHookType) => EffectHookType; -const depsEqual = (aDeps: DependencyList = [], bDeps: DependencyList = []) => { - return isEqual(aDeps, bDeps); -}; +type CreateUpdateEffect = (hook: EffectHookType) => EffectHookType; export const createDeepCompareEffect: CreateUpdateEffect = (hook) => (effect, deps) => { - const ref = useRef(); + const ref = useRef(undefined); const signalRef = useRef(0); - if (deps === undefined || !depsEqual(deps, ref.current)) { - ref.current = deps; signalRef.current += 1; } - + ref.current = deps; hook(effect, [signalRef.current]); }; diff --git a/packages/hooks/src/createUpdateEffect/__tests__/index.test.ts b/packages/hooks/src/createUpdateEffect/__tests__/index.spec.ts similarity index 64% rename from packages/hooks/src/createUpdateEffect/__tests__/index.test.ts rename to packages/hooks/src/createUpdateEffect/__tests__/index.spec.ts index 7da736fd42..25bb50ee08 100644 --- a/packages/hooks/src/createUpdateEffect/__tests__/index.test.ts +++ b/packages/hooks/src/createUpdateEffect/__tests__/index.spec.ts @@ -1,9 +1,10 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useEffect, useLayoutEffect } from 'react'; +import { describe, expect, test } from 'vitest'; import { createUpdateEffect } from '../index'; describe('createUpdateEffect', () => { - it('should work for useEffect', () => { + test('should work for useEffect', () => { const useUpdateEffect = createUpdateEffect(useEffect); let mountedState = 1; @@ -12,12 +13,12 @@ describe('createUpdateEffect', () => { mountedState = 2; }), ); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); hook.rerender(); - expect(mountedState).toEqual(2); + expect(mountedState).toBe(2); }); - it('should work for useLayoutEffect', () => { + test('should work for useLayoutEffect', () => { const useUpdateLayoutEffect = createUpdateEffect(useLayoutEffect); let mountedState = 1; @@ -26,8 +27,8 @@ describe('createUpdateEffect', () => { mountedState = 2; }), ); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); hook.rerender(); - expect(mountedState).toEqual(2); + expect(mountedState).toBe(2); }); }); diff --git a/packages/hooks/src/createUseStorageState/__tests__/index.spec.ts b/packages/hooks/src/createUseStorageState/__tests__/index.spec.ts new file mode 100644 index 0000000000..4a5a0f5984 --- /dev/null +++ b/packages/hooks/src/createUseStorageState/__tests__/index.spec.ts @@ -0,0 +1,144 @@ +import { act, renderHook } from '@testing-library/react'; +import { createElement } from 'react'; +import { renderToString } from 'react-dom/server'; +import { describe, expect, test, vi } from 'vitest'; +import type { Options } from '../index'; +import { createUseStorageState } from '../index'; + +class TestStorage implements Storage { + [name: string]: any; + + length = 0; + + _values = new Map(); + + clear(): void { + this._values.clear(); + this.length = 0; + } + + getItem(key: string): string | null { + return this._values.get(key) || null; + } + + key(index: number): string | null { + if (index >= this._values.size) { + return null; + } + + return Array.from(this._values.keys())[index]; + } + + removeItem(key: string): void { + if (this._values.delete(key)) { + this.length -= 1; + } + } + + setItem(key: string, value: string): void { + if (!this._values.has(key)) { + this.length += 1; + } + + this._values.set(key, value); + } +} + +interface StorageStateProps extends Pick, 'defaultValue'> { + key: string; +} + +describe('useStorageState', () => { + const setUp = (props: StorageStateProps) => { + const storage = new TestStorage(); + const useStorageState = createUseStorageState(() => storage); + + return renderHook( + ({ key, defaultValue }: StorageStateProps) => { + const [state, setState] = useStorageState(key, { defaultValue }); + + return { state, setState }; + }, + { + initialProps: props, + }, + ); + }; + + test('should get defaultValue for a given key', () => { + const hook = setUp({ key: 'key1', defaultValue: 'value1' }); + expect(hook.result.current.state).toBe('value1'); + + hook.rerender({ key: 'key2', defaultValue: 'value2' }); + expect(hook.result.current.state).toBe('value2'); + }); + + test('should get default and set value for a given key', () => { + const hook = setUp({ key: 'key', defaultValue: 'defaultValue' }); + expect(hook.result.current.state).toBe('defaultValue'); + act(() => { + hook.result.current.setState('setValue'); + }); + expect(hook.result.current.state).toBe('setValue'); + hook.rerender({ key: 'key' }); + expect(hook.result.current.state).toBe('setValue'); + }); + + test('should remove value for a given key', () => { + const hook = setUp({ key: 'key' }); + act(() => { + hook.result.current.setState('value'); + }); + expect(hook.result.current.state).toBe('value'); + act(() => { + hook.result.current.setState(undefined); + }); + expect(hook.result.current.state).toBeUndefined(); + + act(() => hook.result.current.setState('value')); + expect(hook.result.current.state).toBe('value'); + act(() => hook.result.current.setState(undefined)); + expect(hook.result.current.state).toBeUndefined(); + }); + + test('should not read storage in SSR when getInitialValueInEffect is true', () => { + const storage = new TestStorage(); + storage.setItem('key', JSON.stringify('stored-value')); + const getItemSpy = vi.spyOn(storage, 'getItem'); + const useStorageState = createUseStorageState(() => storage); + + const Demo = () => { + const [state] = useStorageState('key', { + defaultValue: 'default-value', + getInitialValueInEffect: true, + }); + + return createElement('span', null, state); + }; + + const html = renderToString(createElement(Demo)); + + expect(html).toContain('default-value'); + expect(getItemSpy).not.toHaveBeenCalled(); + }); + + test('should read storage in SSR when getInitialValueInEffect is false', () => { + const storage = new TestStorage(); + storage.setItem('key', JSON.stringify('stored-value')); + const getItemSpy = vi.spyOn(storage, 'getItem'); + const useStorageState = createUseStorageState(() => storage); + + const Demo = () => { + const [state] = useStorageState('key', { + defaultValue: 'default-value', + }); + + return createElement('span', null, state); + }; + + const html = renderToString(createElement(Demo)); + + expect(html).toContain('stored-value'); + expect(getItemSpy).toHaveBeenCalledWith('key'); + }); +}); diff --git a/packages/hooks/src/createUseStorageState/__tests__/index.test.ts b/packages/hooks/src/createUseStorageState/__tests__/index.test.ts deleted file mode 100644 index 937558b1b3..0000000000 --- a/packages/hooks/src/createUseStorageState/__tests__/index.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import { IFuncUpdater, createUseStorageState } from '../index'; - -class TestStorage implements Storage { - [name: string]: any; - - length: number = 0; - - _values = new Map(); - - clear(): void { - this._values.clear(); - this.length = 0; - } - - getItem(key: string): string | null { - return this._values.get(key) || null; - } - - key(index: number): string | null { - if (index >= this._values.size) { - return null; - } - - return Array.from(this._values.keys())[index]; - } - - removeItem(key: string): void { - if (this._values.delete(key)) { - this.length -= 1; - } - } - - setItem(key: string, value: string): void { - if (!this._values.has(key)) { - this.length += 1; - } - - this._values.set(key, value); - } -} - -interface StorageStateProps { - key: string; - defaultValue?: T | IFuncUpdater; -} - -describe('useStorageState', () => { - const setUp = (props: StorageStateProps) => { - const storage = new TestStorage(); - const useStorageState = createUseStorageState(() => storage); - - return renderHook( - ({ key, defaultValue }: StorageStateProps) => { - const [state, setState] = useStorageState(key, { defaultValue }); - - return { state, setState }; - }, - { - initialProps: props, - }, - ); - }; - - it('should get defaultValue for a given key', () => { - const hook = setUp({ key: 'key1', defaultValue: 'value1' }); - expect(hook.result.current.state).toEqual('value1'); - - hook.rerender({ key: 'key2', defaultValue: 'value2' }); - expect(hook.result.current.state).toEqual('value2'); - }); - - it('should get default and set value for a given key', () => { - const hook = setUp({ key: 'key', defaultValue: 'defaultValue' }); - expect(hook.result.current.state).toEqual('defaultValue'); - act(() => { - hook.result.current.setState('setValue'); - }); - expect(hook.result.current.state).toEqual('setValue'); - hook.rerender({ key: 'key' }); - expect(hook.result.current.state).toEqual('setValue'); - }); - - it('should remove value for a given key', () => { - const hook = setUp({ key: 'key' }); - act(() => { - hook.result.current.setState('value'); - }); - expect(hook.result.current.state).toEqual('value'); - act(() => { - hook.result.current.setState(undefined); - }); - expect(hook.result.current.state).toBeUndefined(); - }); -}); diff --git a/packages/hooks/src/createUseStorageState/index.ts b/packages/hooks/src/createUseStorageState/index.ts index 83696798b8..a0effaeb8f 100644 --- a/packages/hooks/src/createUseStorageState/index.ts +++ b/packages/hooks/src/createUseStorageState/index.ts @@ -1,84 +1,163 @@ -/* eslint-disable no-empty */ -import { useState } from 'react'; +import { useRef, useState } from 'react'; +import useEventListener from '../useEventListener'; import useMemoizedFn from '../useMemoizedFn'; +import useMount from '../useMount'; import useUpdateEffect from '../useUpdateEffect'; import { isFunction, isUndef } from '../utils'; -export interface IFuncUpdater { - (previousState?: T): T; -} -export interface IFuncStorage { - (): Storage; -} +export const SYNC_STORAGE_EVENT_NAME = 'AHOOKS_SYNC_STORAGE_EVENT_NAME'; + +export type SetState = S | ((prevState?: S) => S); export interface Options { + defaultValue?: T | (() => T); + getInitialValueInEffect?: boolean; + listenStorageChange?: boolean; serializer?: (value: T) => string; deserializer?: (value: string) => T; - defaultValue?: T | IFuncUpdater; + onError?: (error: unknown) => void; } -export function createUseStorageState(getStorage: () => Storage | undefined) { - function useStorageState(key: string, options?: Options) { +export const createUseStorageState = (getStorage: () => Storage | undefined) => { + const useStorageState = (key: string, options: Options = {}) => { let storage: Storage | undefined; + const { listenStorageChange = false, getInitialValueInEffect = false } = options; + + const serializer = isFunction(options.serializer) ? options.serializer : JSON.stringify; + + const deserializer = isFunction(options.deserializer) ? options.deserializer : JSON.parse; + + const onError = isFunction(options.onError) ? options.onError : console.error; // https://github.com/alibaba/hooks/issues/800 try { storage = getStorage(); } catch (err) { - console.error(err); + onError(err); } - const serializer = (value: T) => { - if (options?.serializer) { - return options?.serializer(value); - } - return JSON.stringify(value); - }; - - const deserializer = (value: string) => { - if (options?.deserializer) { - return options?.deserializer(value); - } - return JSON.parse(value); - }; - - function getStoredValue() { + const getStoredValue = () => { try { const raw = storage?.getItem(key); if (raw) { return deserializer(raw); } } catch (e) { - console.error(e); + onError(e); } - if (isFunction(options?.defaultValue)) { - return options?.defaultValue(); - } - return options?.defaultValue; + return getDefaultValue(); } - const [state, setState] = useState(() => getStoredValue()); + function getDefaultValue() { + if (isFunction(options.defaultValue)) { + return options.defaultValue(); + } + + return options.defaultValue; + }; + + const [state, setState] = useState(() => { + if (getInitialValueInEffect) { + return getDefaultValue(); + } + + return getStoredValue(); + }); + + useMount(() => { + if (!getInitialValueInEffect) { + return; + } - useUpdateEffect(() => { setState(getStoredValue()); + }); + + const stateRef = useRef(state); + stateRef.current = state; + + useUpdateEffect(() => { + const nextState = getStoredValue(); + if (Object.is(nextState, stateRef.current)) { + return; // 新旧状态相同,不更新 state,避免 setState 带来不必要的 re-render + } + stateRef.current = nextState; + setState(nextState); }, [key]); - const updateState = (value: T | IFuncUpdater) => { - const currentState = isFunction(value) ? value(state) : value; - setState(currentState); - - if (isUndef(currentState)) { - storage?.removeItem(key); - } else { - try { - storage?.setItem(key, serializer(currentState)); - } catch (e) { - console.error(e); + const updateState = (value: SetState) => { + const previousState = stateRef.current; + const currentState = isFunction(value) ? value(previousState) : value; + + if (Object.is(currentState, previousState)) { + return; // 新旧状态相同,不更新 state,避免 setState 带来不必要的 re-render + } + + if (!listenStorageChange) { + stateRef.current = currentState; + setState(currentState); + } + + try { + let newValue: string | null; + const oldValue = storage?.getItem(key); + + if (isUndef(currentState)) { + newValue = null; + storage?.removeItem(key); + } else { + newValue = serializer(currentState); + storage?.setItem(key, newValue); } + + dispatchEvent( + // send custom event to communicate within same page + // importantly this should not be a StorageEvent since those cannot + // be constructed with a non-built-in storage area + new CustomEvent(SYNC_STORAGE_EVENT_NAME, { + detail: { + key, + newValue, + oldValue, + storageArea: storage, + }, + }), + ); + } catch (e) { + onError(e); + } + }; + + const syncState = (event: StorageEvent) => { + if (event.key !== key || event.storageArea !== storage) { + return; + } + + const nextState = getStoredValue(); + + if (Object.is(nextState, stateRef.current)) { + return; // 新旧状态相同,不更新 state,避免 setState 带来不必要的 re-render } + + stateRef.current = nextState; + setState(nextState); }; + const syncStateFromCustomEvent = (event: CustomEvent) => { + syncState(event.detail); + }; + + // from another document + useEventListener('storage', syncState, { + enable: listenStorageChange, + }); + + // from the same document but different hooks + useEventListener(SYNC_STORAGE_EVENT_NAME, syncStateFromCustomEvent, { + enable: listenStorageChange, + }); + return [state, useMemoizedFn(updateState)] as const; - } + }; + return useStorageState; -} +}; diff --git a/packages/hooks/src/index.spec.ts b/packages/hooks/src/index.spec.ts new file mode 100644 index 0000000000..55c80f44ec --- /dev/null +++ b/packages/hooks/src/index.spec.ts @@ -0,0 +1,10 @@ +import { describe, expect, test } from 'vitest'; +import * as ahooks from '.'; + +describe('ahooks', () => { + test('exports modules should be defined', () => { + Object.entries(ahooks).forEach(([key, value]) => { + expect(value).toBeDefined(); + }); + }); +}); diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index 58cefd9c79..55c7232b0d 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -50,7 +50,7 @@ import useRafTimeout from './useRafTimeout'; import useReactive from './useReactive'; import useRequest, { clearCache } from './useRequest'; import useResetState from './useResetState'; -import { configResponsive, useResponsive } from './useResponsive'; +import useResponsive, { configResponsive } from './useResponsive'; import useSafeState from './useSafeState'; import useScroll from './useScroll'; import useSelections from './useSelections'; @@ -75,6 +75,7 @@ import useVirtualList from './useVirtualList'; import useWebSocket from './useWebSocket'; import useWhyDidYouUpdate from './useWhyDidYouUpdate'; import useMutationObserver from './useMutationObserver'; +import useTheme from './useTheme'; export { useRequest, @@ -156,4 +157,5 @@ export { useRafTimeout, useResetState, useMutationObserver, + useTheme, }; diff --git a/packages/hooks/src/useAntdTable/__tests__/index.spec.ts b/packages/hooks/src/useAntdTable/__tests__/index.spec.ts new file mode 100644 index 0000000000..365b71a873 --- /dev/null +++ b/packages/hooks/src/useAntdTable/__tests__/index.spec.ts @@ -0,0 +1,382 @@ +import type { RenderHookResult } from '@testing-library/react'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { Form } from 'antd'; +import { useEffect } from 'react'; +import { describe, expect, test } from 'vitest'; +import { sleep } from '../../utils/testingHelpers'; +import useAntdTable from '../index'; + +interface Query { + current: number; + pageSize: number; + + [key: string]: any; +} + +describe('useAntdTable', () => { + let queryArgs: any; + const asyncFn = (query: Query, formData: any = {}) => { + queryArgs = { ...query, ...formData }; + return Promise.resolve({ + total: 20, + list: [], + }); + }; + + let searchType = 'simple'; + + const form = { + getInternalHooks: () => {}, + initialValue: { + name: 'default name', + }, + fieldsValue: { + name: 'default name', + }, + getFieldsValue() { + if (searchType === 'simple') { + return { + name: this.fieldsValue.name, + }; + } + return this.fieldsValue; + }, + setFieldsValue(values: object) { + this.fieldsValue = { + ...this.fieldsValue, + ...values, + }; + }, + resetFields() { + this.fieldsValue = { ...this.initialValue }; + }, + validateFields(fields: any[]) { + const targetFields: Record = {}; + fields.forEach((field: string | number) => { + targetFields[field] = (this.fieldsValue as any)[field]; + }); + return Promise.resolve(targetFields); + }, + }; + + const changeSearchType = (type: any) => { + searchType = type; + }; + + const setUp = ( + service: Parameters[0], + options: Parameters[1], + ) => renderHook((o) => useAntdTable(service, o || options)); + + let hook: RenderHookResult; + + test('should fetch after first render', async () => { + queryArgs = undefined; + form.resetFields(); + changeSearchType('simple'); + + act(() => { + hook = setUp(asyncFn, {}); + }); + + expect(hook.result.current.tableProps.loading).toBe(false); + expect(hook.result.current.tableProps.pagination.current).toBe(1); + expect(hook.result.current.tableProps.pagination.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.tableProps.pagination.total).toBe(20)); + }); + + test('should defaultParams work', async () => { + queryArgs = undefined; + form.resetFields(); + changeSearchType('advance'); + act(() => { + hook = setUp(asyncFn, { + form, + defaultParams: [ + { + current: 2, + pageSize: 10, + }, + { name: 'hello', phone: '123' }, + ], + defaultType: 'advance', + }); + }); + const { search } = hook.result.current; + expect(hook.result.current.tableProps.loading).toBe(false); + await waitFor(() => expect(queryArgs.current).toBe(2)); + expect(queryArgs.pageSize).toBe(10); + expect(queryArgs.name).toBe('hello'); + expect(queryArgs.phone).toBe('123'); + expect(search.type).toBe('advance'); + }); + + test('should stop the query when validate fields failed', async () => { + queryArgs = undefined; + form.resetFields(); + changeSearchType('advance'); + act(() => { + hook = setUp(asyncFn, { + form: { ...form, validateFields: () => Promise.reject() }, + defaultParams: [ + { + current: 2, + pageSize: 10, + }, + { name: 'hello', phone: '123' }, + ], + defaultType: 'advance', + }); + }); + + await sleep(1); + expect(queryArgs).toBeUndefined(); + }); + + test('should ready work', async () => { + queryArgs = undefined; + form.resetFields(); + changeSearchType('advance'); + + act(() => { + hook = setUp(asyncFn, { + ready: false, + form, + defaultParams: [ + { + current: 2, + pageSize: 10, + }, + { name: 'hello', phone: '123' }, + ], + defaultType: 'advance', + }); + }); + await sleep(1); + expect(queryArgs).toBeUndefined(); + + hook.rerender({ + ready: true, + form, + defaultParams: [ + { + current: 2, + pageSize: 10, + }, + { name: 'hello', phone: '456' }, + ], + defaultType: 'advance', + }); + + const { search } = hook.result.current; + expect(hook.result.current.tableProps.loading).toBe(false); + await waitFor(() => expect(queryArgs.current).toBe(2)); + expect(queryArgs.pageSize).toBe(10); + expect(queryArgs.name).toBe('hello'); + expect(queryArgs.phone).toBe('456'); + expect(search.type).toBe('advance'); + }); + + test('should antd v3 work', async () => { + queryArgs = undefined; + form.resetFields(); + changeSearchType('simple'); + + const v3Form = { + ...form, + getInternalHooks: undefined, + validateFields: function (fields: any[], callback: (arg0: undefined, arg1: {}) => void) { + const targetFields: Record = {}; + fields.forEach((field: string | number) => { + targetFields[field] = (this.fieldsValue as any)[field]; + }); + callback(undefined, targetFields); + }, + getFieldInstance(key: string) { + // 根据不同的 type 返回不同的 fieldsValues + if (searchType === 'simple') { + return ['name'].includes(key) as any; + } + return ['name', 'email', 'phone'].includes(key) as any; + }, + }; + + act(() => { + hook = setUp(asyncFn, { form: v3Form }); + }); + const { search } = hook.result.current; + expect(hook.result.current.tableProps.loading).toBe(false); + await waitFor(() => expect(queryArgs.current).toBe(1)); + expect(queryArgs.pageSize).toBe(10); + expect(queryArgs.name).toBe('default name'); + expect(search.type).toBe('simple'); + + // /* 切换 分页 */ + act(() => { + hook.result.current.tableProps.onChange({ + current: 2, + pageSize: 5, + }); + }); + await waitFor(() => expect(queryArgs.current).toBe(2)); + expect(queryArgs.pageSize).toBe(5); + expect(queryArgs.name).toBe('default name'); + + /* 改变 name,提交表单 */ + v3Form.fieldsValue.name = 'change name'; + act(() => { + search.submit(); + }); + await waitFor(() => expect(queryArgs.current).toBe(1)); + expect(queryArgs.current).toBe(1); + // expect(queryArgs.pageSize).toBe(5); + expect(queryArgs.name).toBe('change name'); + }); + + test('should reset pageSize in defaultParams', async () => { + queryArgs = undefined; + form.resetFields(); + act(() => { + hook = setUp(asyncFn, { + form, + defaultParams: [ + { + current: 1, + pageSize: 10, + }, + ], + }); + }); + + const { search, tableProps } = hook.result.current; + expect(tableProps.loading).toBe(false); + await waitFor(() => expect(queryArgs.current).toBe(1)); + expect(queryArgs.pageSize).toBe(10); + + // change params + act(() => { + tableProps.onChange({ + current: 2, + pageSize: 5, + }); + }); + + await waitFor(() => { + expect(queryArgs.current).toBe(2); + expect(queryArgs.pageSize).toBe(5); + }); + + // reset params + act(() => { + search.reset(); + }); + + await waitFor(() => { + expect(queryArgs.current).toBe(1); + expect(queryArgs.pageSize).toBe(10); + }); + }); + + test('should reset pageSize in defaultPageSize', async () => { + queryArgs = undefined; + form.resetFields(); + act(() => { + hook = setUp(asyncFn, { + form, + defaultParams: { + current: 1, + pageSize: 10, + } as any, + defaultPageSize: 20, + }); + }); + + const { search, tableProps } = hook.result.current; + expect(tableProps.loading).toBe(false); + await waitFor(() => expect(queryArgs.current).toBe(1)); + expect(queryArgs.pageSize).toBe(20); + + // change params + act(() => { + tableProps.onChange({ + current: 2, + pageSize: 5, + }); + }); + + await waitFor(() => { + expect(queryArgs.current).toBe(2); + expect(queryArgs.pageSize).toBe(5); + }); + + // reset params + act(() => { + search.reset(); + }); + + await waitFor(() => { + expect(queryArgs.current).toBe(1); + expect(queryArgs.pageSize).toBe(20); + }); + }); + + test('search submit use default params', async () => { + queryArgs = undefined; + form.resetFields(); + act(() => { + hook = setUp(asyncFn, { + form, + defaultParams: [ + { + current: 2, + pageSize: 100, + }, + ], + }); + }); + + const { search } = hook.result.current; + + act(() => { + search.submit(); + }); + + await waitFor(() => { + expect(queryArgs.current).toBe(2); + expect(queryArgs.pageSize).toBe(100); + }); + }); + + test('should defaultParams work with manual is true', async () => { + queryArgs = undefined; + form.resetFields(); + changeSearchType('advance'); + + act(() => { + renderHook((o) => { + const [myForm] = Form.useForm(); + + useAntdTable( + asyncFn, + o || { + form: myForm, + defaultParams: [ + { + current: 2, + pageSize: 10, + }, + { name: 'hello', phone: '123' }, + ], + defaultType: 'advance', + }, + ); + + useEffect(() => { + // defaultParams works + expect(myForm.getFieldValue('name')).toBe('hello'); + expect(queryArgs).toBe(undefined); + }, []); + }); + }); + }); +}); diff --git a/packages/hooks/src/useAntdTable/__tests__/index.test.ts b/packages/hooks/src/useAntdTable/__tests__/index.test.ts deleted file mode 100644 index 83f5e083eb..0000000000 --- a/packages/hooks/src/useAntdTable/__tests__/index.test.ts +++ /dev/null @@ -1,384 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import { sleep } from '../../utils/testingHelpers'; -import useAntdTable from '../index'; - -interface Query { - current: number; - pageSize: number; - [key: string]: any; -} - -describe('useAntdTable', () => { - // jest.useFakeTimers(); - - let queryArgs: any; - const asyncFn = (query: Query, formData: any = {}) => { - queryArgs = { ...query, ...formData }; - return Promise.resolve({ - total: 20, - list: [], - }); - }; - - let searchType = 'simple'; - - const form: any = { - getInternalHooks: () => {}, - initialValue: { - name: 'default name', - }, - fieldsValue: { - name: 'default name', - }, - getFieldsValue() { - if (searchType === 'simple') { - return { - name: this.fieldsValue.name, - }; - } - return this.fieldsValue; - }, - setFieldsValue(values: object) { - this.fieldsValue = { - ...this.fieldsValue, - ...values, - }; - }, - resetFields() { - this.fieldsValue = { ...this.initialValue }; - }, - validateFields(fields) { - const targetFileds = {}; - fields.forEach((field) => { - targetFileds[field] = this.fieldsValue[field]; - }); - return Promise.resolve(targetFileds); - }, - }; - - const changeSearchType = (type: any) => { - searchType = type; - }; - - const setUp = (service, options) => renderHook((o) => useAntdTable(service, o || options)); - - let hook: any; - - // afterEach(() => { - // form.resetFields(); - // changeSearchType('simple'); - // hook?.unmount(); - // }); - - it('should fetch after first render', async () => { - queryArgs = undefined; - form.resetFields(); - changeSearchType('simple'); - - act(() => { - hook = setUp(asyncFn, {}); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.tableProps.loading).toEqual(false); - expect(hook.result.current.tableProps.pagination.current).toEqual(1); - expect(hook.result.current.tableProps.pagination.pageSize).toEqual(10); - expect(hook.result.current.tableProps.pagination.total).toEqual(20); - hook.unmount(); - }); - - // it('should form, defaultPageSize, cacheKey work', async () => { - // queryArgs = undefined; - // form.resetFields(); - // changeSearchType('simple'); - // act(() => { - // hook = setUp(asyncFn, { form, defaultPageSize: 5, cacheKey: 'tableId' }); - // }); - // await hook.waitForNextUpdate(); - // const { search } = hook.result.current; - // expect(hook.result.current.tableProps.loading).toEqual(false); - // expect(queryArgs.current).toEqual(1); - // expect(queryArgs.pageSize).toEqual(5); - // expect(queryArgs.name).toEqual('default name'); - // expect(search.type).toEqual('simple'); - - // // /* 切换 分页 */ - // act(() => { - // hook.result.current.tableProps.onChange({ - // current: 2, - // pageSize: 5, - // }); - // }); - // await hook.waitForNextUpdate(); - // expect(queryArgs.current).toEqual(2); - // expect(queryArgs.pageSize).toEqual(5); - // expect(queryArgs.name).toEqual('default name'); - - // /* 改变 name, 提交表单 */ - // form.fieldsValue.name = 'change name'; - // act(() => { - // search.submit(); - // }); - // await hook.waitForNextUpdate(); - // expect(queryArgs.current).toEqual(1); - // expect(queryArgs.pageSize).toEqual(5); - // expect(queryArgs.name).toEqual('change name'); - - // // /* 切换 searchType 到 advance */ - // act(() => { - // if (search) { - // search.changeType(); - // changeSearchType('advance'); - // } - // }); - // expect(hook.result.current.search.type).toEqual('advance'); - // act(() => { - // hook.result.current.search.submit(); - // }); - // await hook.waitForNextUpdate(); - - // expect(queryArgs.current).toEqual(1); - // expect(queryArgs.name).toEqual('change name'); - - // // /* 手动改变其他两个字段的值 */ - // form.fieldsValue.phone = '13344556677'; - // form.fieldsValue.email = 'x@qq.com'; - - // act(() => { - // hook.result.current.search.submit(); - // }); - // await hook.waitForNextUpdate(); - // expect(queryArgs.current).toEqual(1); - // expect(queryArgs.name).toEqual('change name'); - // expect(queryArgs.phone).toEqual('13344556677'); - // expect(queryArgs.email).toEqual('x@qq.com'); - - // // /* 改变 name,但是不提交,切换到 simple 去 */ - // form.fieldsValue.name = 'change name 2'; - // act(() => { - // hook.result.current.search.changeType(); - // changeSearchType('simple'); - // }); - // expect(hook.result.current.search.type).toEqual('simple'); - // expect(form.fieldsValue.name).toEqual('change name 2'); - // // /* 提交 */ - // act(() => { - // hook.result.current.search.submit(); - // }); - // await hook.waitForNextUpdate(); - - // expect(queryArgs.name).toEqual('change name 2'); - // expect(queryArgs.phone).toBeUndefined(); - // expect(queryArgs.email).toBeUndefined(); - - // // /* 切换回 advance,恢复之前的条件 */ - // act(() => { - // hook.result.current.search.changeType(); - // changeSearchType('advance'); - // }); - - // if (hook.result.current.search) { - // expect(hook.result.current.search.type).toEqual('advance'); - // } - // expect(form.fieldsValue.name).toEqual('change name 2'); - // expect(form.fieldsValue.phone).toEqual('13344556677'); - // expect(form.fieldsValue.email).toEqual('x@qq.com'); - - // act(() => { - // hook.result.current.tableProps.onChange({ - // current: 3, - // pageSize: 5, - // }); - // }); - // await hook.waitForNextUpdate(); - // // /* 卸载重装 */ - // form.fieldsValue = { - // name: '', - // phone: '', - // email: '', - // }; - // act(() => { - // hook.unmount(); - // }); - // act(() => { - // hook = setUp(asyncFn, { form, defaultPageSize: 5, cacheKey: 'tableId' }); - // }); - // await hook.waitForNextUpdate(); - // expect(hook.result.current.search.type).toEqual('simple'); - // expect(hook.result.current.tableProps.pagination.current).toEqual(3); - // expect(form.fieldsValue.name).toEqual('change name 2'); - // expect(form.fieldsValue.phone).toEqual('13344556677'); - // expect(form.fieldsValue.email).toEqual('x@qq.com'); - - // /* refresh */ - // act(() => { - // hook.result.current.refresh(); - // }); - // // expect(hook.result.current.tableProps.loading).toEqual(true); - // await hook.waitForNextUpdate(); - // /* reset */ - // act(() => { - // hook.result.current.search.reset(); - // }); - - // expect(form.fieldsValue.name).toEqual('default name'); - // expect(form.fieldsValue.phone).toBeUndefined(); - // expect(form.fieldsValue.email).toBeUndefined(); - // hook.unmount(); - // }, 60000); - - it('should defaultParams work', async () => { - queryArgs = undefined; - form.resetFields(); - changeSearchType('advance'); - act(() => { - hook = setUp(asyncFn, { - form, - defaultParams: [ - { - current: 2, - pageSize: 10, - }, - { name: 'hello', phone: '123' }, - ], - defaultType: 'advance', - }); - }); - await hook.waitForNextUpdate(); - const { search } = hook.result.current; - expect(hook.result.current.tableProps.loading).toEqual(false); - expect(queryArgs.current).toEqual(2); - expect(queryArgs.pageSize).toEqual(10); - expect(queryArgs.name).toEqual('hello'); - expect(queryArgs.phone).toEqual('123'); - expect(search.type).toEqual('advance'); - hook.unmount(); - }); - - it('should stop the query when validate fields failed', async () => { - queryArgs = undefined; - form.resetFields(); - changeSearchType('advance'); - act(() => { - hook = setUp(asyncFn, { - form: { ...form, validateFields: () => Promise.reject() }, - defaultParams: [ - { - current: 2, - pageSize: 10, - }, - { name: 'hello', phone: '123' }, - ], - defaultType: 'advance', - }); - }); - - await sleep(1); - expect(queryArgs).toEqual(undefined); - hook.unmount(); - }); - - it('should ready work', async () => { - queryArgs = undefined; - form.resetFields(); - changeSearchType('advance'); - - act(() => { - hook = setUp(asyncFn, { - ready: false, - form, - defaultParams: [ - { - current: 2, - pageSize: 10, - }, - { name: 'hello', phone: '123' }, - ], - defaultType: 'advance', - }); - }); - await sleep(1); - expect(queryArgs).toEqual(undefined); - - hook.rerender({ - ready: true, - form, - defaultParams: [ - { - current: 2, - pageSize: 10, - }, - { name: 'hello', phone: '456' }, - ], - defaultType: 'advance', - }); - - await hook.waitForNextUpdate(); - const { search } = hook.result.current; - expect(hook.result.current.tableProps.loading).toEqual(false); - expect(queryArgs.current).toEqual(2); - expect(queryArgs.pageSize).toEqual(10); - expect(queryArgs.name).toEqual('hello'); - expect(queryArgs.phone).toEqual('456'); - expect(search.type).toEqual('advance'); - hook.unmount(); - }); - - it('should antd v3 work', async () => { - queryArgs = undefined; - form.resetFields(); - changeSearchType('simple'); - - const v3Form = { - ...form, - getInternalHooks: undefined, - validateFields: function (fields, callback) { - const targetFileds = {}; - fields.forEach((field) => { - targetFileds[field] = this.fieldsValue[field]; - }); - callback(undefined, targetFileds); - }, - getFieldInstance(key: string) { - // 根据不同的 type 返回不同的 fieldsValues - if (searchType === 'simple') { - return ['name'].includes(key); - } - return ['name', 'email', 'phone'].includes(key); - }, - }; - - act(() => { - hook = setUp(asyncFn, { form: v3Form }); - }); - await hook.waitForNextUpdate(); - const { search } = hook.result.current; - expect(hook.result.current.tableProps.loading).toEqual(false); - expect(queryArgs.current).toEqual(1); - expect(queryArgs.pageSize).toEqual(10); - expect(queryArgs.name).toEqual('default name'); - expect(search.type).toEqual('simple'); - - // /* 切换 分页 */ - act(() => { - hook.result.current.tableProps.onChange({ - current: 2, - pageSize: 5, - }); - }); - await hook.waitForNextUpdate(); - expect(queryArgs.current).toEqual(2); - expect(queryArgs.pageSize).toEqual(5); - expect(queryArgs.name).toEqual('default name'); - - /* 改变 name, 提交表单 */ - v3Form.fieldsValue.name = 'change name'; - act(() => { - search.submit(); - }); - await hook.waitForNextUpdate(); - expect(queryArgs.current).toEqual(1); - expect(queryArgs.pageSize).toEqual(5); - expect(queryArgs.name).toEqual('change name'); - hook.unmount(); - }); -}); diff --git a/packages/hooks/src/useAntdTable/demo/cache.tsx b/packages/hooks/src/useAntdTable/demo/cache.tsx index 232f56c0fe..f001404a7d 100644 --- a/packages/hooks/src/useAntdTable/demo/cache.tsx +++ b/packages/hooks/src/useAntdTable/demo/cache.tsx @@ -1,6 +1,7 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Button, Col, Form, Input, Row, Table, Select } from 'antd'; import { useAntdTable, clearCache } from 'ahooks'; +import ReactJson from 'react-json-view'; const { Option } = Select; @@ -19,10 +20,22 @@ interface Result { } const getTableData = ( - { current, pageSize, sorter, filters }, - formData: Object, + { + current, + pageSize, + sorter, + filters, + extra, + }: { + current: number; + pageSize: number; + sorter: any; + filters: any; + extra: any; + }, + formData: Record, ): Promise => { - console.log(sorter, filters); + console.log(sorter, filters, extra); let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -135,11 +148,13 @@ const UserList = () => { return (
{type === 'simple' ? searchForm : advanceSearchForm} - +
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useAntdTable/demo/form.tsx b/packages/hooks/src/useAntdTable/demo/form.tsx index db41cc997e..fc1a4a6c25 100644 --- a/packages/hooks/src/useAntdTable/demo/form.tsx +++ b/packages/hooks/src/useAntdTable/demo/form.tsx @@ -1,6 +1,6 @@ -import React from 'react'; import { Button, Col, Form, Input, Row, Table, Select } from 'antd'; import { useAntdTable } from 'ahooks'; +import ReactJson from 'react-json-view'; const { Option } = Select; @@ -18,7 +18,16 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { + current, + pageSize, + }: { + current: number; + pageSize: number; + }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -121,11 +130,13 @@ export default () => { return (
{type === 'simple' ? searchForm : advanceSearchForm} -
+
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useAntdTable/demo/init.tsx b/packages/hooks/src/useAntdTable/demo/init.tsx index cc1e5549a6..30888f0c31 100644 --- a/packages/hooks/src/useAntdTable/demo/init.tsx +++ b/packages/hooks/src/useAntdTable/demo/init.tsx @@ -1,6 +1,6 @@ -import React from 'react'; import { Button, Col, Form, Input, Row, Table, Select } from 'antd'; import { useAntdTable } from 'ahooks'; +import ReactJson from 'react-json-view'; const { Option } = Select; @@ -18,7 +18,16 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { + current, + pageSize, + }: { + current: number; + pageSize: number; + }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -37,7 +46,7 @@ const getTableData = ({ current, pageSize }, formData: Object): Promise export default () => { const [form] = Form.useForm(); - const { loading, tableProps, search, params } = useAntdTable(getTableData, { + const { tableProps, search, params } = useAntdTable(getTableData, { form, defaultParams: [ { current: 2, pageSize: 5 }, @@ -125,11 +134,13 @@ export default () => { return (
{type === 'simple' ? searchForm : advanceSearchForm} -
+
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useAntdTable/demo/ready.tsx b/packages/hooks/src/useAntdTable/demo/ready.tsx index 00e627bd09..9732649452 100644 --- a/packages/hooks/src/useAntdTable/demo/ready.tsx +++ b/packages/hooks/src/useAntdTable/demo/ready.tsx @@ -1,6 +1,7 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Button, Col, Form, Input, Row, Table, Select } from 'antd'; import { useAntdTable } from 'ahooks'; +import ReactJson from 'react-json-view'; const { Option } = Select; @@ -18,7 +19,16 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { + current, + pageSize, + }: { + current: number; + pageSize: number; + }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -130,11 +140,13 @@ export default () => {
{type === 'simple' ? searchForm : advanceSearchForm} -
+
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useAntdTable/demo/table.tsx b/packages/hooks/src/useAntdTable/demo/table.tsx index ecfa26698d..d93d679d55 100644 --- a/packages/hooks/src/useAntdTable/demo/table.tsx +++ b/packages/hooks/src/useAntdTable/demo/table.tsx @@ -1,5 +1,4 @@ import { Table } from 'antd'; -import React from 'react'; import { useAntdTable } from 'ahooks'; interface Item { @@ -16,7 +15,13 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }): Promise => { +const getTableData = ({ + current, + pageSize, +}: { + current: number; + pageSize: number; +}): Promise => { const query = `page=${current}&size=${pageSize}`; return fetch(`https://randomuser.me/api?results=55&${query}`) @@ -49,5 +54,5 @@ export default () => { }, ]; - return
; + return
; }; diff --git a/packages/hooks/src/useAntdTable/demo/validate.tsx b/packages/hooks/src/useAntdTable/demo/validate.tsx index 1cc5ab63de..2a0dd3f76d 100644 --- a/packages/hooks/src/useAntdTable/demo/validate.tsx +++ b/packages/hooks/src/useAntdTable/demo/validate.tsx @@ -1,6 +1,6 @@ import { Form, Input, Select, Table } from 'antd'; -import React from 'react'; import { useAntdTable } from 'ahooks'; +import ReactJson from 'react-json-view'; const { Option } = Select; @@ -18,7 +18,16 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { + current, + pageSize, + }: { + current: number; + pageSize: number; + }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -87,11 +96,13 @@ export default () => { return (
{searchForm} -
+
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useAntdTable/index.en-US.md b/packages/hooks/src/useAntdTable/index.en-US.md index cbe4be447d..5b2ae41fbc 100644 --- a/packages/hooks/src/useAntdTable/index.en-US.md +++ b/packages/hooks/src/useAntdTable/index.en-US.md @@ -9,7 +9,7 @@ nav: Before using it, you need to understand a few points that are different from `useRequest`: -1. `service` receives two parameters, the first parameter is the paging data `{ current, pageSize, sorter, filters }`, and the second parameter is the form data. +1. `service` receives two parameters, the first parameter is the paging data `{ current, pageSize, sorter, filters, extra }`, and the second parameter is the form data. 2. The data structure returned by `service` must be `{ total: number, list: Item[] }`. 3. Additional `tableProps` and `search` fields will be returned to manage tables and forms. 4. When `refreshDeps` changes, it will reset `current` to the first page and re-initiate the request. @@ -72,7 +72,7 @@ All parameters and returned results of `useRequest` are applicable to `useAntdTa ```typescript type Data = { total: number; list: any[] }; -type Params = [{ current: number; pageSize: number, filter?: any, sorter?: any }, { [key: string]: any }]; +type Params = [{ current: number; pageSize: number, filters?: any, sorter?: any, extra?: any }, { [key: string]: any }]; const { ..., @@ -83,6 +83,7 @@ const { pagination: any, filters?: any, sorter?: any, + extra?: any, ) => void; pagination: { current: number; diff --git a/packages/hooks/src/useAntdTable/index.tsx b/packages/hooks/src/useAntdTable/index.tsx index 8671fc82db..b6341cea9d 100644 --- a/packages/hooks/src/useAntdTable/index.tsx +++ b/packages/hooks/src/useAntdTable/index.tsx @@ -27,8 +27,14 @@ const useAntdTable = ( } = options; const result = usePagination(service, { + ready, manual: true, ...rest, + onSuccess(...args) { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + runSuccessRef.current = true; + rest.onSuccess?.(...args); + }, }); const { params = [], run } = result; @@ -39,6 +45,7 @@ const useAntdTable = ( const allFormDataRef = useRef>({}); const defaultDataSourceRef = useRef([]); + const runSuccessRef = useRef(false); const isAntdV4 = !!form?.getInternalHooks; @@ -55,7 +62,7 @@ const useAntdTable = ( // antd 3 const allFieldsValue = form.getFieldsValue(); - const activeFieldsValue = {}; + const activeFieldsValue: Record = {}; Object.keys(allFieldsValue).forEach((key: string) => { if (form.getFieldInstance ? form.getFieldInstance(key) : true) { activeFieldsValue[key] = allFieldsValue[key]; @@ -99,7 +106,7 @@ const useAntdTable = ( } // antd v3 - const activeFieldsValue = {}; + const activeFieldsValue: Record = {}; Object.keys(allFormDataRef.current).forEach((key) => { if (form.getFieldInstance ? form.getFieldInstance(key) : true) { activeFieldsValue[key] = allFormDataRef.current[key]; @@ -114,7 +121,7 @@ const useAntdTable = ( ...allFormDataRef.current, ...activeFieldsValue, }; - setType((t) => (t === 'simple' ? 'advance' : 'simple')); + setType((t: string) => (t === 'simple' ? 'advance' : 'simple')); }; const _submit = (initPagination?: TParams[0]) => { @@ -155,15 +162,27 @@ const useAntdTable = ( if (form) { form.resetFields(); } - _submit(); + _submit({ + ...(defaultParams?.[0] || {}), + pageSize: options.defaultPageSize || options.defaultParams?.[0]?.pageSize || 10, + current: 1, + }); }; const submit = (e?: any) => { e?.preventDefault?.(); - _submit(); + _submit( + runSuccessRef.current + ? undefined + : { + pageSize: options.defaultPageSize || options.defaultParams?.[0]?.pageSize || 10, + current: 1, + ...(defaultParams?.[0] || {}), + }, + ); }; - const onTableChange = (pagination: any, filters: any, sorter: any) => { + const onTableChange = (pagination: any, filters: any, sorter: any, extra: any) => { const [oldPaginationParams, ...restParams] = params || []; run( // @ts-ignore @@ -173,6 +192,7 @@ const useAntdTable = ( pageSize: pagination.pageSize, filters, sorter, + extra, }, ...restParams, ); @@ -188,10 +208,12 @@ const useAntdTable = ( run(...params); return; } - if (!manual && ready) { + if (ready) { allFormDataRef.current = defaultParams?.[1] || {}; restoreForm(); - _submit(defaultParams?.[0]); + if (!manual) { + _submit(defaultParams?.[0]); + } } }, []); @@ -228,7 +250,11 @@ const useAntdTable = ( } if (!manual) { hasAutoRun.current = true; - result.pagination.changeCurrent(1); + if (options.refreshDepsAction) { + options.refreshDepsAction(); + } else { + result.pagination.changeCurrent(1); + } } }, [...refreshDeps]); diff --git a/packages/hooks/src/useAntdTable/index.zh-CN.md b/packages/hooks/src/useAntdTable/index.zh-CN.md index 95f314dc31..6f18abceb8 100644 --- a/packages/hooks/src/useAntdTable/index.zh-CN.md +++ b/packages/hooks/src/useAntdTable/index.zh-CN.md @@ -10,7 +10,7 @@ nav: 在使用之前,你需要了解它与 `useRequest` 不同的几个点: -1. `service` 接收两个参数,第一个参数为分页数据 `{ current, pageSize, sorter, filters }`,第二个参数为表单数据。 +1. `service` 接收两个参数,第一个参数为分页数据 `{ current, pageSize, sorter, filters, extra }`,第二个参数为表单数据。 2. `service` 返回的数据结构为 `{ total: number, list: Item[] }`。 3. 会额外返回 `tableProps` 和 `search` 字段,管理表格和表单。 4. `refreshDeps` 变化,会重置 `current` 到第一页,并重新发起请求。 @@ -73,7 +73,7 @@ nav: ```typescript type Data = { total: number; list: any[] }; -type Params = [{ current: number; pageSize: number, filter?: any, sorter?: any }, { [key: string]: any }]; +type Params = [{ current: number; pageSize: number, filters?: any, sorter?: any, extra?: any }, { [key: string]: any }]; const { ..., @@ -84,6 +84,7 @@ const { pagination: any, filters?: any, sorter?: any, + extra?: any, ) => void; pagination: { current: number; diff --git a/packages/hooks/src/useAntdTable/types.ts b/packages/hooks/src/useAntdTable/types.ts index 536a1d7eff..f366c21d44 100644 --- a/packages/hooks/src/useAntdTable/types.ts +++ b/packages/hooks/src/useAntdTable/types.ts @@ -7,7 +7,8 @@ export type Params = [ current: number; pageSize: number; sorter?: any; - filter?: any; + filters?: any; + extra?: any; [key: string]: any; }, ...any[], @@ -19,7 +20,7 @@ export type Service = ( export type Antd3ValidateFields = ( fieldNames: string[], - callback: (errors, values: Record) => void, + callback: (errors: any, values: Record) => void, ) => void; export type Antd4ValidateFields = (fieldNames?: string[]) => Promise>; diff --git a/packages/hooks/src/useAsyncEffect/__tests__/index.test.ts b/packages/hooks/src/useAsyncEffect/__tests__/index.spec.ts similarity index 87% rename from packages/hooks/src/useAsyncEffect/__tests__/index.test.ts rename to packages/hooks/src/useAsyncEffect/__tests__/index.spec.ts index e6107d731c..bf62143e7d 100644 --- a/packages/hooks/src/useAsyncEffect/__tests__/index.test.ts +++ b/packages/hooks/src/useAsyncEffect/__tests__/index.spec.ts @@ -1,10 +1,11 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useAsyncEffect from '../index'; +import { act, renderHook } from '@testing-library/react'; import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; import { sleep } from '../../utils/testingHelpers'; +import useAsyncEffect from '../index'; describe('useAsyncEffect', () => { - it('should work without clean up', async () => { + test('should work without clean up', async () => { const hook = renderHook(() => { const [x, setX] = useState(0); useAsyncEffect(async () => { @@ -20,7 +21,7 @@ describe('useAsyncEffect', () => { expect(hook.result.current).toBe(1); }); - it('should work with yield break', async () => { + test('should work with yield break', async () => { const hook = renderHook(() => { const [x, setX] = useState(1); const [y, setY] = useState(0); diff --git a/packages/hooks/src/useAsyncEffect/demo/demo1.tsx b/packages/hooks/src/useAsyncEffect/demo/demo1.tsx index 75f06152bd..e0f38a0a42 100644 --- a/packages/hooks/src/useAsyncEffect/demo/demo1.tsx +++ b/packages/hooks/src/useAsyncEffect/demo/demo1.tsx @@ -7,7 +7,7 @@ */ import { useAsyncEffect } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; function mockCheck(): Promise { return new Promise((resolve) => { diff --git a/packages/hooks/src/useAsyncEffect/demo/demo2.tsx b/packages/hooks/src/useAsyncEffect/demo/demo2.tsx index a84b931ac6..e54edaf199 100644 --- a/packages/hooks/src/useAsyncEffect/demo/demo2.tsx +++ b/packages/hooks/src/useAsyncEffect/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 通过 `yield` 语句可以增加一些检查点,如果发现当前 effect 已经被清理,会停止继续往下执行。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useAsyncEffect } from 'ahooks'; function mockCheck(val: string): Promise { diff --git a/packages/hooks/src/useAsyncEffect/index.ts b/packages/hooks/src/useAsyncEffect/index.ts index 3e6ca1e92f..c15f49a894 100644 --- a/packages/hooks/src/useAsyncEffect/index.ts +++ b/packages/hooks/src/useAsyncEffect/index.ts @@ -2,15 +2,16 @@ import type { DependencyList } from 'react'; import { useEffect } from 'react'; import { isFunction } from '../utils'; +function isAsyncGenerator( + val: AsyncGenerator | Promise, +): val is AsyncGenerator { + return isFunction((val as any)[Symbol.asyncIterator]); +} + function useAsyncEffect( effect: () => AsyncGenerator | Promise, deps?: DependencyList, ) { - function isAsyncGenerator( - val: AsyncGenerator | Promise, - ): val is AsyncGenerator { - return isFunction(val[Symbol.asyncIterator]); - } useEffect(() => { const e = effect(); let cancelled = false; diff --git a/packages/hooks/src/useBoolean/__tests__/index.test.ts b/packages/hooks/src/useBoolean/__tests__/index.spec.ts similarity index 63% rename from packages/hooks/src/useBoolean/__tests__/index.test.ts rename to packages/hooks/src/useBoolean/__tests__/index.spec.ts index 3a235c8255..2498d3fa62 100644 --- a/packages/hooks/src/useBoolean/__tests__/index.test.ts +++ b/packages/hooks/src/useBoolean/__tests__/index.spec.ts @@ -1,10 +1,11 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useBoolean from '../index'; const setUp = (defaultValue?: boolean) => renderHook(() => useBoolean(defaultValue)); describe('useBoolean', () => { - it('test on methods', async () => { + test('test on methods', async () => { const { result } = setUp(); expect(result.current[0]).toBe(false); act(() => { @@ -43,8 +44,19 @@ describe('useBoolean', () => { expect(result.current[0]).toBe(true); }); - it('test on default value', () => { - const hook = setUp(true); - expect(hook.result.current[0]).toBe(true); + test('test on default value', () => { + const hook1 = setUp(true); + expect(hook1.result.current[0]).toBe(true); + const hook2 = setUp(); + expect(hook2.result.current[0]).toBe(false); + // @ts-ignore + const hook3 = setUp(0); + expect(hook3.result.current[0]).toBe(false); + // @ts-ignore + const hook4 = setUp(''); + expect(hook4.result.current[0]).toBe(false); + // @ts-ignore + const hook5 = setUp('hello'); + expect(hook5.result.current[0]).toBe(true); }); }); diff --git a/packages/hooks/src/useBoolean/demo/demo1.tsx b/packages/hooks/src/useBoolean/demo/demo1.tsx index b50a11571a..a3e2a97b1a 100644 --- a/packages/hooks/src/useBoolean/demo/demo1.tsx +++ b/packages/hooks/src/useBoolean/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 切换 boolean,可以接收默认值。 */ -import React from 'react'; import { useBoolean } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useBoolean/index.ts b/packages/hooks/src/useBoolean/index.ts index b27114605a..d0a2b7a12a 100644 --- a/packages/hooks/src/useBoolean/index.ts +++ b/packages/hooks/src/useBoolean/index.ts @@ -9,7 +9,7 @@ export interface Actions { } export default function useBoolean(defaultValue = false): [boolean, Actions] { - const [state, { toggle, set }] = useToggle(defaultValue); + const [state, { toggle, set }] = useToggle(!!defaultValue); const actions: Actions = useMemo(() => { const setTrue = () => set(true); diff --git a/packages/hooks/src/useClickAway/__tests__/index.test.ts b/packages/hooks/src/useClickAway/__tests__/index.spec.ts similarity index 71% rename from packages/hooks/src/useClickAway/__tests__/index.test.ts rename to packages/hooks/src/useClickAway/__tests__/index.spec.ts index 2bfbc70edc..41abfcee5f 100644 --- a/packages/hooks/src/useClickAway/__tests__/index.test.ts +++ b/packages/hooks/src/useClickAway/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; import useClickAway from '../index'; describe('useClickAway', () => { @@ -18,7 +19,7 @@ describe('useClickAway', () => { document.body.removeChild(container1); }); - it('test on dom optional', async () => { + test('test on dom optional', async () => { let state: number = 0; const { rerender, unmount } = renderHook((dom: any) => useClickAway(() => { @@ -28,22 +29,22 @@ describe('useClickAway', () => { rerender(container); container.click(); - expect(state).toEqual(0); + expect(state).toBe(0); document.body.click(); - expect(state).toEqual(1); + expect(state).toBe(1); rerender(container1); container1.click(); - expect(state).toEqual(1); + expect(state).toBe(1); document.body.click(); - expect(state).toEqual(2); + expect(state).toBe(2); unmount(); document.body.click(); - expect(state).toEqual(2); + expect(state).toBe(2); }); - it('should works on multiple target', async () => { + test('should works on multiple target', async () => { let state: number = 0; const { rerender, unmount } = renderHook((dom: any) => useClickAway(() => { @@ -53,14 +54,14 @@ describe('useClickAway', () => { rerender([container, container1]); container.click(); - expect(state).toEqual(0); + expect(state).toBe(0); container1.click(); - expect(state).toEqual(0); + expect(state).toBe(0); document.body.click(); - expect(state).toEqual(1); + expect(state).toBe(1); unmount(); document.body.click(); - expect(state).toEqual(1); + expect(state).toBe(1); }); }); diff --git a/packages/hooks/src/useClickAway/demo/demo1.tsx b/packages/hooks/src/useClickAway/demo/demo1.tsx index 6232f37399..bdf227b8f6 100644 --- a/packages/hooks/src/useClickAway/demo/demo1.tsx +++ b/packages/hooks/src/useClickAway/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 请点击按钮或按钮外查看效果。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useClickAway } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useClickAway/demo/demo2.tsx b/packages/hooks/src/useClickAway/demo/demo2.tsx index 99eb632cc4..bde14f71a7 100644 --- a/packages/hooks/src/useClickAway/demo/demo2.tsx +++ b/packages/hooks/src/useClickAway/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 支持直接传入 DOM 对象或 function。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useClickAway } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useClickAway/demo/demo3.tsx b/packages/hooks/src/useClickAway/demo/demo3.tsx index c7c0cdd5bd..b5f2f67d5c 100644 --- a/packages/hooks/src/useClickAway/demo/demo3.tsx +++ b/packages/hooks/src/useClickAway/demo/demo3.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 支持传入多个目标对象。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useClickAway } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useClickAway/demo/demo4.tsx b/packages/hooks/src/useClickAway/demo/demo4.tsx index b1fb69f832..a910da64d4 100644 --- a/packages/hooks/src/useClickAway/demo/demo4.tsx +++ b/packages/hooks/src/useClickAway/demo/demo4.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 通过设置 eventName,可以指定需要监听的事件,试试点击鼠标右键。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useClickAway } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useClickAway/demo/demo5.tsx b/packages/hooks/src/useClickAway/demo/demo5.tsx index 78a1f443fe..7cd2fc1cf7 100644 --- a/packages/hooks/src/useClickAway/demo/demo5.tsx +++ b/packages/hooks/src/useClickAway/demo/demo5.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 设置了多个事件,你可以试试用鼠标左键或者右键。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useClickAway } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useClickAway/demo/demo6.tsx b/packages/hooks/src/useClickAway/demo/demo6.tsx index 233b472d2e..70ac74b002 100644 --- a/packages/hooks/src/useClickAway/demo/demo6.tsx +++ b/packages/hooks/src/useClickAway/demo/demo6.tsx @@ -3,10 +3,10 @@ * desc: Add the addEventListener to shadow DOM root instead of the document * * title.zh-CN: 支持 shadow DOM - * desc.zh-CN: 将 addEventListener 添加到 shadow DOM root + * desc.zh-CN: 将 addEventListener 添加到 shadow DOM root */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useClickAway } from 'ahooks'; import root from 'react-shadow'; diff --git a/packages/hooks/src/useClickAway/index.en-US.md b/packages/hooks/src/useClickAway/index.en-US.md index c629cf00d7..a4407251f6 100644 --- a/packages/hooks/src/useClickAway/index.en-US.md +++ b/packages/hooks/src/useClickAway/index.en-US.md @@ -37,18 +37,19 @@ Listen for click events outside the target element. ```typescript type Target = Element | (() => Element) | React.MutableRefObject; +type DocumentEventKey = keyof DocumentEventMap; useClickAway( onClickAway: (event: T) => void, target: Target | Target[], - eventName?: string | string[] + eventName?: DocumentEventKey | DocumentEventKey[] ); ``` ### Params -| Property | Description | Type | Default | -| ----------- | ------------------------------------------- | ---------------------- | ------- | -| onClickAway | Trigger Function | `(event: T) => void` | - | -| target | DOM elements or Ref, support array | `Target` \| `Target[]` | - | -| eventName | Set the event to be listened, support array | `string` \| `string[]` | `click` | +| Property | Description | Type | Default | +| ----------- | ---------------------------------------------- | ------------------------------------------ | ------- | +| onClickAway | Trigger Function | `(event: T) => void` | - | +| target | DOM elements or Ref or Function, support array | `Target` \| `Target[]` | - | +| eventName | Set the event to be listened, support array | `DocumentEventKey` \| `DocumentEventKey[]` | `click` | diff --git a/packages/hooks/src/useClickAway/index.ts b/packages/hooks/src/useClickAway/index.ts index c888b8f13d..92f1a7ba54 100644 --- a/packages/hooks/src/useClickAway/index.ts +++ b/packages/hooks/src/useClickAway/index.ts @@ -4,10 +4,12 @@ import { getTargetElement } from '../utils/domTarget'; import getDocumentOrShadow from '../utils/getDocumentOrShadow'; import useEffectWithTarget from '../utils/useEffectWithTarget'; +type DocumentEventKey = keyof DocumentEventMap; + export default function useClickAway( onClickAway: (event: T) => void, target: BasicTarget | BasicTarget[], - eventName: string | string[] = 'click', + eventName: DocumentEventKey | DocumentEventKey[] = 'click', ) { const onClickAwayRef = useLatest(onClickAway); diff --git a/packages/hooks/src/useClickAway/index.zh-CN.md b/packages/hooks/src/useClickAway/index.zh-CN.md index 917112a07a..3bfbe4cedb 100644 --- a/packages/hooks/src/useClickAway/index.zh-CN.md +++ b/packages/hooks/src/useClickAway/index.zh-CN.md @@ -37,18 +37,19 @@ nav: ```typescript type Target = Element | (() => Element) | React.MutableRefObject; +type DocumentEventKey = keyof DocumentEventMap; useClickAway( onClickAway: (event: T) => void, target: Target | Target[], - eventName?: string | string[] + eventName?: DocumentEventKey | DocumentEventKey[] ); ``` ### Params -| 参数 | 说明 | 类型 | 默认值 | -| ----------- | ---------------------------- | ---------------------- | ------- | -| onClickAway | 触发函数 | `(event: T) => void` | - | -| target | DOM 节点或者 Ref,支持数组 | `Target` \| `Target[]` | - | -| eventName | 指定需要监听的事件,支持数组 | `string` \| `string[]` | `click` | +| 参数 | 说明 | 类型 | 默认值 | +| ----------- | ----------------------------------- | ------------------------------------------ | ------- | +| onClickAway | 触发函数 | `(event: T) => void` | - | +| target | DOM 节点或者 Ref 或者函数,支持数组 | `Target` \| `Target[]` | - | +| eventName | 指定需要监听的事件,支持数组 | `DocumentEventKey` \| `DocumentEventKey[]` | `click` | diff --git a/packages/hooks/src/useControllableValue/__tests__/index.test.ts b/packages/hooks/src/useControllableValue/__tests__/index.spec.ts similarity index 58% rename from packages/hooks/src/useControllableValue/__tests__/index.test.ts rename to packages/hooks/src/useControllableValue/__tests__/index.spec.ts index 272472504e..35a75ca2e2 100644 --- a/packages/hooks/src/useControllableValue/__tests__/index.test.ts +++ b/packages/hooks/src/useControllableValue/__tests__/index.spec.ts @@ -1,57 +1,59 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useControllableValue, { Options, Props } from '../index'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import type { Options, Props } from '../index'; +import useControllableValue from '../index'; describe('useControllableValue', () => { - const setUp = (props?: Props, options?: Options): any => + const setUp = (props?: Props, options?: Options) => renderHook(() => useControllableValue(props, options)); - it('defaultValue should work', () => { + test('defaultValue should work', () => { const hook = setUp({ defaultValue: 1 }); - expect(hook.result.current[0]).toEqual(1); + expect(hook.result.current[0]).toBe(1); }); - it('value should work', () => { + test('value should work', () => { const hook = setUp({ defaultValue: 1, value: 2 }); - expect(hook.result.current[0]).toEqual(2); + expect(hook.result.current[0]).toBe(2); }); - it('state should be undefined', () => { + test('state should be undefined', () => { const hook = setUp(); expect(hook.result.current[0]).toBeUndefined(); }); - it('onChange should work', () => { + test('onChange should work', () => { let extraParam: string = ''; const props = { value: 2, - onChange(v: any, extra) { + onChange(v: any, extra: any) { this.value = v; extraParam = extra; }, }; const hook = setUp(props); - expect(hook.result.current[0]).toEqual(2); + expect(hook.result.current[0]).toBe(2); act(() => { hook.result.current[1](3, 'extraParam'); }); - expect(props.value).toEqual(3); - expect(extraParam).toEqual('extraParam'); + expect(props.value).toBe(3); + expect(extraParam).toBe('extraParam'); }); - it('test on state update', () => { + test('test on state update', () => { const props: any = { value: 1, }; const { result, rerender } = setUp(props); props.value = 2; rerender(props); - expect(result.current[0]).toEqual(2); + expect(result.current[0]).toBe(2); props.value = 3; rerender(props); - expect(result.current[0]).toEqual(3); + expect(result.current[0]).toBe(3); }); - it('test set state', async () => { + test('test set state', async () => { const { result } = setUp({ newValue: 1, }); @@ -63,13 +65,13 @@ describe('useControllableValue', () => { expect(result.current[0]).toBeNull(); act(() => setValue(55)); - expect(result.current[0]).toEqual(55); + expect(result.current[0]).toBe(55); - act(() => setValue((prevState) => prevState + 1)); - expect(result.current[0]).toEqual(56); + act(() => setValue((prevState: number) => prevState + 1)); + expect(result.current[0]).toBe(56); }); - it('type inference should work', async () => { + test('type inference should work', async () => { type Value = { foo: number; }; diff --git a/packages/hooks/src/useControllableValue/demo/demo1.tsx b/packages/hooks/src/useControllableValue/demo/demo1.tsx index 2339afef4c..b1ac92cc5c 100644 --- a/packages/hooks/src/useControllableValue/demo/demo1.tsx +++ b/packages/hooks/src/useControllableValue/demo/demo1.tsx @@ -5,7 +5,6 @@ * title.zh-CN: 非受控组件 * desc.zh-CN: 如果 props 中没有 value,则组件内部自己管理 state */ -import React from 'react'; import { useControllableValue } from 'ahooks'; export default (props: any) => { diff --git a/packages/hooks/src/useControllableValue/demo/demo2.tsx b/packages/hooks/src/useControllableValue/demo/demo2.tsx index 7daec7022f..6a7e4fb588 100644 --- a/packages/hooks/src/useControllableValue/demo/demo2.tsx +++ b/packages/hooks/src/useControllableValue/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 如果 props 有 value 字段,则由父级接管控制 state */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useControllableValue } from 'ahooks'; const ControllableComponent = (props: any) => { diff --git a/packages/hooks/src/useControllableValue/demo/demo3.tsx b/packages/hooks/src/useControllableValue/demo/demo3.tsx index 67d0615380..2d48de2189 100644 --- a/packages/hooks/src/useControllableValue/demo/demo3.tsx +++ b/packages/hooks/src/useControllableValue/demo/demo3.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 只要 props 中有 onChange 字段,则在 state 变化时,就会触发 onChange 函数 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useControllableValue } from 'ahooks'; const ControllableComponent = (props: any) => { diff --git a/packages/hooks/src/useControllableValue/index.en-US.md b/packages/hooks/src/useControllableValue/index.en-US.md index 113ee49db9..63c126f913 100644 --- a/packages/hooks/src/useControllableValue/index.en-US.md +++ b/packages/hooks/src/useControllableValue/index.en-US.md @@ -46,6 +46,6 @@ const [state, setState] = useControllableValue(props: Record, optio | Property | Description | Type | Default | | -------------------- | ------------------------------------------------------------------------------- | -------- | -------------- | | defaultValue | The default value, will be overridden by `props.defaultValue` and `props.value` | - | - | -| defaultValuePropName | Custom defaultVlue attribute name | `string` | `defaultValue` | +| defaultValuePropName | Custom defaultValue attribute name | `string` | `defaultValue` | | valuePropName | Custom value attribute name | `string` | `value` | | trigger | Custom trigger attribute name | `string` | `onChange` | diff --git a/packages/hooks/src/useControllableValue/index.ts b/packages/hooks/src/useControllableValue/index.ts index f9e7759990..446dd3de51 100644 --- a/packages/hooks/src/useControllableValue/index.ts +++ b/packages/hooks/src/useControllableValue/index.ts @@ -26,7 +26,9 @@ function useControllableValue( props?: Props, options?: Options, ): [T, (v: SetStateAction, ...args: any[]) => void]; -function useControllableValue(props: Props = {}, options: Options = {}) { +function useControllableValue(defaultProps?: Props, options: Options = {}) { + const props = defaultProps ?? {}; + const { defaultValue, defaultValuePropName = 'defaultValue', @@ -35,13 +37,13 @@ function useControllableValue(props: Props = {}, options: Options = } = options; const value = props[valuePropName] as T; - const isControlled = props.hasOwnProperty(valuePropName); + const isControlled = Object.prototype.hasOwnProperty.call(props, valuePropName); const initialValue = useMemo(() => { if (isControlled) { return value; } - if (props.hasOwnProperty(defaultValuePropName)) { + if (Object.prototype.hasOwnProperty.call(props, defaultValuePropName)) { return props[defaultValuePropName]; } return defaultValue; diff --git a/packages/hooks/src/useCookieState/__tests__/index.spec.tsx b/packages/hooks/src/useCookieState/__tests__/index.spec.tsx new file mode 100644 index 0000000000..431c1c5bb9 --- /dev/null +++ b/packages/hooks/src/useCookieState/__tests__/index.spec.tsx @@ -0,0 +1,103 @@ +import { act, renderHook } from '@testing-library/react'; +import Cookies from 'js-cookie'; +import { describe, expect, test } from 'vitest'; +import type { Options } from '../index'; +import useCookieState from '../index'; + +describe('useCookieState', () => { + const setUp = (key: string, options: Options) => + renderHook(() => { + const [state, setState] = useCookieState(key, options); + return { + state, + setState, + } as const; + }); + + test('getKey should work', () => { + const COOKIE = 'test-key'; + const hook = setUp(COOKIE, { + defaultValue: 'A', + }); + expect(hook.result.current.state).toBe('A'); + act(() => { + hook.result.current.setState('B'); + }); + expect(hook.result.current.state).toBe('B'); + const anotherHook = setUp(COOKIE, { + defaultValue: 'A', + }); + expect(anotherHook.result.current.state).toBe('B'); + act(() => { + anotherHook.result.current.setState('C'); + }); + expect(anotherHook.result.current.state).toBe('C'); + expect(hook.result.current.state).toBe('B'); + expect(Cookies.get(COOKIE)).toBe('C'); + }); + + test('should support undefined', () => { + const COOKIE = 'test-boolean-key-with-undefined'; + const hook = setUp(COOKIE, { + defaultValue: 'undefined', + }); + expect(hook.result.current.state).toBe('undefined'); + act(() => { + hook.result.current.setState(undefined); + }); + expect(hook.result.current.state).toBeUndefined(); + const anotherHook = setUp(COOKIE, { + defaultValue: 'false', + }); + expect(anotherHook.result.current.state).toBe('false'); + expect(Cookies.get(COOKIE)).toBeUndefined(); + act(() => { + // @ts-ignore + hook.result.current.setState(); + }); + expect(hook.result.current.state).toBeUndefined(); + expect(Cookies.get(COOKIE)).toBeUndefined(); + }); + + test('should support empty string', () => { + Cookies.set('test-key-empty-string', ''); + expect(Cookies.get('test-key-empty-string')).toBe(''); + const COOKIE = 'test-key-empty-string'; + const hook = setUp(COOKIE, { + defaultValue: 'hello', + }); + expect(hook.result.current.state).toBe(''); + }); + + test('should support function updater', () => { + const COOKIE = 'test-func-updater'; + const hook = setUp(COOKIE, { + defaultValue: () => 'hello world', + }); + expect(hook.result.current.state).toBe('hello world'); + act(() => { + hook.result.current.setState((state) => `${state}, zhangsan`); + }); + expect(hook.result.current.state).toBe('hello world, zhangsan'); + }); + + test('using the same cookie name', () => { + const COOKIE_NAME = 'test-same-cookie-name'; + const { result: result1 } = setUp(COOKIE_NAME, { defaultValue: 'A' }); + const { result: result2 } = setUp(COOKIE_NAME, { defaultValue: 'B' }); + expect(result1.current.state).toBe('A'); + expect(result2.current.state).toBe('B'); + act(() => { + result1.current.setState('C'); + }); + expect(result1.current.state).toBe('C'); + expect(result2.current.state).toBe('B'); + expect(Cookies.get(COOKIE_NAME)).toBe('C'); + act(() => { + result2.current.setState('D'); + }); + expect(result1.current.state).toBe('C'); + expect(result2.current.state).toBe('D'); + expect(Cookies.get(COOKIE_NAME)).toBe('D'); + }); +}); diff --git a/packages/hooks/src/useCookieState/__tests__/index.test.ts b/packages/hooks/src/useCookieState/__tests__/index.test.ts deleted file mode 100644 index 5eff730a81..0000000000 --- a/packages/hooks/src/useCookieState/__tests__/index.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useCookieState, { Options } from '../index'; -import Cookies from 'js-cookie'; - -describe('useCookieState', () => { - const setUp = (key: string, options: Options) => - renderHook(() => { - const [state, setState] = useCookieState(key, options); - return { - state, - setState, - } as const; - }); - - it('getKey should work', () => { - const COOKIE_KEY = 'test-key'; - const hook = setUp(COOKIE_KEY, { - defaultValue: 'A', - }); - expect(hook.result.current.state).toEqual('A'); - act(() => { - hook.result.current.setState('B'); - }); - expect(hook.result.current.state).toEqual('B'); - const anotherHook = setUp(COOKIE_KEY, { - defaultValue: 'A', - }); - expect(anotherHook.result.current.state).toEqual('B'); - act(() => { - anotherHook.result.current.setState('C'); - }); - expect(anotherHook.result.current.state).toEqual('C'); - expect(hook.result.current.state).toEqual('B'); - }); - - it('should support undefined', () => { - const COOKIE_KEY = 'test-boolean-key-with-undefined'; - const hook = setUp(COOKIE_KEY, { - defaultValue: 'undefined', - }); - expect(hook.result.current.state).toEqual('undefined'); - act(() => { - hook.result.current.setState(undefined); - }); - expect(hook.result.current.state).toEqual(undefined); - const anotherHook = setUp(COOKIE_KEY, { - defaultValue: 'false', - }); - expect(anotherHook.result.current.state).toEqual('false'); - }); - - it('should support empty string', () => { - Cookies.set('test-key-empty-string', ''); - expect(Cookies.get('test-key-empty-string')).toBe(''); - const COOKIE_KEY = 'test-key-empty-string'; - const hook = setUp(COOKIE_KEY, { - defaultValue: 'hello', - }); - expect(hook.result.current.state).toEqual(''); - }); - - it('should support function updater', () => { - const COOKIE_KEY = 'test-func-updater'; - const hook = setUp(COOKIE_KEY, { - defaultValue: () => 'hello world', - }); - expect(hook.result.current.state).toEqual('hello world'); - act(() => { - hook.result.current.setState((state) => `${state}, zhangsan`); - }); - expect(hook.result.current.state).toEqual('hello world, zhangsan'); - }); -}); diff --git a/packages/hooks/src/useCookieState/demo/demo1.tsx b/packages/hooks/src/useCookieState/demo/demo1.tsx index 94c2cb11e9..abae8408e3 100644 --- a/packages/hooks/src/useCookieState/demo/demo1.tsx +++ b/packages/hooks/src/useCookieState/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 刷新页面后,可以看到输入框中的内容被从 Cookie 中恢复了。 */ -import React from 'react'; import { useCookieState } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useCookieState/demo/demo2.tsx b/packages/hooks/src/useCookieState/demo/demo2.tsx index dc84161bf9..eb2baf967d 100644 --- a/packages/hooks/src/useCookieState/demo/demo2.tsx +++ b/packages/hooks/src/useCookieState/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: useCookieState 的 setState 可以接收 function updater,就像 useState 那样。 */ -import React from 'react'; import { useCookieState } from 'ahooks'; export default function App() { diff --git a/packages/hooks/src/useCookieState/demo/demo3.tsx b/packages/hooks/src/useCookieState/demo/demo3.tsx index a10b816699..fdf5725a9e 100644 --- a/packages/hooks/src/useCookieState/demo/demo3.tsx +++ b/packages/hooks/src/useCookieState/demo/demo3.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 可配置属性:默认值、有效时间、路径、域名、协议、跨域等,详见 Options 文档。 */ -import React from 'react'; import { useCookieState } from 'ahooks'; export default function App() { diff --git a/packages/hooks/src/useCookieState/index.ts b/packages/hooks/src/useCookieState/index.ts index 57c0c44a83..e6a603d3cb 100644 --- a/packages/hooks/src/useCookieState/index.ts +++ b/packages/hooks/src/useCookieState/index.ts @@ -13,7 +13,9 @@ function useCookieState(cookieKey: string, options: Options = {}) { const [state, setState] = useState(() => { const cookieValue = Cookies.get(cookieKey); - if (isString(cookieValue)) return cookieValue; + if (isString(cookieValue)) { + return cookieValue; + } if (isFunction(options.defaultValue)) { return options.defaultValue(); @@ -27,16 +29,17 @@ function useCookieState(cookieKey: string, options: Options = {}) { newValue: State | ((prevState: State) => State), newOptions: Cookies.CookieAttributes = {}, ) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { defaultValue, ...restOptions } = { ...options, ...newOptions }; - setState((prevState) => { - const value = isFunction(newValue) ? newValue(prevState) : newValue; - if (value === undefined) { - Cookies.remove(cookieKey); - } else { - Cookies.set(cookieKey, value, restOptions); - } - return value; - }); + const value = isFunction(newValue) ? newValue(state) : newValue; + + setState(value); + + if (value === undefined) { + Cookies.remove(cookieKey); + } else { + Cookies.set(cookieKey, value, restOptions); + } }, ); diff --git a/packages/hooks/src/useCountDown/__tests__/index.test.ts b/packages/hooks/src/useCountDown/__tests__/index.spec.ts similarity index 65% rename from packages/hooks/src/useCountDown/__tests__/index.test.ts rename to packages/hooks/src/useCountDown/__tests__/index.spec.ts index f5324923ea..8b703134c9 100644 --- a/packages/hooks/src/useCountDown/__tests__/index.test.ts +++ b/packages/hooks/src/useCountDown/__tests__/index.spec.ts @@ -1,20 +1,22 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useCountDown, { Options } from '../index'; +import { act, renderHook } from '@testing-library/react'; +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; +import type { Options } from '../index'; +import useCountDown from '../index'; const setup = (options: Options = {}) => renderHook((props: Options = options) => useCountDown(props)); describe('useCountDown', () => { beforeAll(() => { - jest.useFakeTimers('modern'); - jest.setSystemTime(1479427200000); + vi.useFakeTimers(); + vi.setSystemTime(1479427200000); }); afterAll(() => { - jest.useRealTimers(); + vi.useRealTimers(); }); - it('should initialize correctly with undefined targetDate', () => { + test('should initialize correctly with undefined targetDate', () => { const { result } = setup(); const [count, formattedRes] = result.current; @@ -29,7 +31,7 @@ describe('useCountDown', () => { }); }); - it('should initialize correctly with correct targetDate', () => { + test('should initialize correctly with correct targetDate', () => { const { result } = setup({ targetDate: Date.now() + 5000, interval: 1000, @@ -40,7 +42,7 @@ describe('useCountDown', () => { expect(formattedRes.milliseconds).toBe(0); }); - it('should work manually', () => { + test('should work manually', () => { const { result, rerender } = setup({ interval: 100 }); rerender({ targetDate: Date.now() + 5000, interval: 1000 }); @@ -48,26 +50,26 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(5); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current[0]).toBe(4000); expect(result.current[1].seconds).toBe(4); act(() => { - jest.advanceTimersByTime(4000); + vi.advanceTimersByTime(4000); }); - expect(result.current[0]).toEqual(0); + expect(result.current[0]).toBe(0); expect(result.current[1].seconds).toBe(0); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); - expect(result.current[0]).toEqual(0); + expect(result.current[0]).toBe(0); expect(result.current[1].seconds).toBe(0); }); - it('should work automatically', () => { + test('should work automatically', () => { const { result } = setup({ targetDate: Date.now() + 5000, interval: 1000, @@ -77,19 +79,19 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(5); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current[0]).toBe(4000); expect(result.current[1].seconds).toBe(4); act(() => { - jest.advanceTimersByTime(4000); + vi.advanceTimersByTime(4000); }); expect(result.current[0]).toBe(0); expect(result.current[1].seconds).toBe(0); }); - it('should work stop', () => { + test('should work stop', () => { const { result, rerender } = setup({ targetDate: Date.now() + 5000, interval: 1000, @@ -103,7 +105,7 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(5); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current[0]).toBe(4000); expect(result.current[1].seconds).toBe(4); @@ -115,27 +117,27 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(0); }); - it('it onEnd should work', () => { - const onEnd = jest.fn(); + test('it onEnd should work', () => { + const onEnd = vi.fn(); setup({ targetDate: Date.now() + 5000, interval: 1000, onEnd, }); act(() => { - jest.advanceTimersByTime(6000); + vi.advanceTimersByTime(6000); }); expect(onEnd).toBeCalled(); }); - it('timeLeft should be 0 when target date less than current time', () => { + test('timeLeft should be 0 when target date less than current time', () => { const { result } = setup({ targetDate: Date.now() - 5000, }); expect(result.current[0]).toBe(0); }); - it('should initialize correctly with undefined leftTime', () => { + test('should initialize correctly with undefined leftTime', () => { const { result } = setup(); const [count, formattedRes] = result.current; @@ -150,7 +152,7 @@ describe('useCountDown', () => { }); }); - it('should initialize correctly with correct leftTime', () => { + test('should initialize correctly with correct leftTime', () => { const { result } = setup({ leftTime: 5 * 1000, interval: 1000 }); const [count, formattedRes] = result.current; expect(count).toBe(5000); @@ -158,7 +160,7 @@ describe('useCountDown', () => { expect(formattedRes.milliseconds).toBe(0); }); - it('should work manually', () => { + test('should work manually', () => { const { result, rerender } = setup({ interval: 100 }); rerender({ leftTime: 5 * 1000, interval: 1000 }); @@ -166,45 +168,45 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(5); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current[0]).toBe(4000); expect(result.current[1].seconds).toBe(4); act(() => { - jest.advanceTimersByTime(4000); + vi.advanceTimersByTime(4000); }); - expect(result.current[0]).toEqual(0); + expect(result.current[0]).toBe(0); expect(result.current[1].seconds).toBe(0); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); - expect(result.current[0]).toEqual(0); + expect(result.current[0]).toBe(0); expect(result.current[1].seconds).toBe(0); }); - it('should work automatically', () => { + test('should work automatically', () => { const { result } = setup({ leftTime: 5 * 1000, interval: 1000 }); expect(result.current[0]).toBe(5000); expect(result.current[1].seconds).toBe(5); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current[0]).toBe(4000); expect(result.current[1].seconds).toBe(4); act(() => { - jest.advanceTimersByTime(4000); + vi.advanceTimersByTime(4000); }); expect(result.current[0]).toBe(0); expect(result.current[1].seconds).toBe(0); }); - it('should work stop', () => { + test('should work stop', () => { const { result, rerender } = setup({ leftTime: 5 * 1000, interval: 1000 }); rerender({ leftTime: 5 * 1000, interval: 1000 }); @@ -212,7 +214,7 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(5); act(() => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current[0]).toBe(4000); expect(result.current[1].seconds).toBe(4); @@ -222,17 +224,43 @@ describe('useCountDown', () => { expect(result.current[1].seconds).toBe(0); }); - it('it onEnd should work', () => { - const onEnd = jest.fn(); + test('it onEnd should work', () => { + const onEnd = vi.fn(); setup({ leftTime: 5 * 1000, interval: 1000, onEnd }); act(() => { - jest.advanceTimersByTime(6000); + vi.advanceTimersByTime(6000); }); expect(onEnd).toBeCalled(); }); - it('timeLeft should be 0 when leftTime less than current time', () => { + test('timeLeft should be 0 when leftTime less than current time', () => { const { result } = setup({ leftTime: -5 * 1000 }); expect(result.current[0]).toBe(0); }); + + test('run with timeLeft should not be reset after targetDate changed', async () => { + let targetDate = Date.now() + 8000; + + const { result, rerender } = setup({ + leftTime: 6000, + targetDate, + }); + expect(result.current[0]).toBe(6000); + + act(() => { + vi.advanceTimersByTime(2000); + }); + rerender({ + leftTime: 6000, + targetDate: targetDate, + }); + expect(result.current[0]).toBe(4000); + + targetDate = Date.now() + 9000; + rerender({ + leftTime: 6000, + targetDate: targetDate, + }); + expect(result.current[0]).toBe(4000); + }); }); diff --git a/packages/hooks/src/useCountDown/demo/demo1.tsx b/packages/hooks/src/useCountDown/demo/demo1.tsx index 019f67e356..0eaae0362b 100644 --- a/packages/hooks/src/useCountDown/demo/demo1.tsx +++ b/packages/hooks/src/useCountDown/demo/demo1.tsx @@ -6,21 +6,17 @@ * desc.zh-CN: 基础的倒计时管理。 */ -import React from 'react'; import { useCountDown } from 'ahooks'; export default () => { - const [countdown, formattedRes] = useCountDown({ - targetDate: '2022-12-31 24:00:00', + const [, formattedRes] = useCountDown({ + targetDate: `${new Date().getFullYear()}-12-31 23:59:59`, }); const { days, hours, minutes, seconds, milliseconds } = formattedRes; - return ( - <> -

- There are {days} days {hours} hours {minutes} minutes {seconds} seconds {milliseconds}{' '} - milliseconds until 2022-12-31 24:00:00 -

- +

+ There are {days} days {hours} hours {minutes} minutes {seconds} seconds {milliseconds}{' '} + milliseconds until {new Date().getFullYear()}-12-31 23:59:59 +

); }; diff --git a/packages/hooks/src/useCountDown/demo/demo2.tsx b/packages/hooks/src/useCountDown/demo/demo2.tsx index 9d0af362cb..dc0223102b 100644 --- a/packages/hooks/src/useCountDown/demo/demo2.tsx +++ b/packages/hooks/src/useCountDown/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 动态变更配置项, 适用于验证码或类似场景,时间结束后会触发 onEnd 回调。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useCountDown } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useCountDown/index.ts b/packages/hooks/src/useCountDown/index.ts index 6f64a9711f..bcb8866b76 100644 --- a/packages/hooks/src/useCountDown/index.ts +++ b/packages/hooks/src/useCountDown/index.ts @@ -42,13 +42,11 @@ const parseMs = (milliseconds: number): FormattedRes => { const useCountdown = (options: Options = {}) => { const { leftTime, targetDate, interval = 1000, onEnd } = options || {}; - const target = useMemo(() => { - if ('leftTime' in options) { - return isNumber(leftTime) && leftTime > 0 ? Date.now() + leftTime : undefined; - } else { - return targetDate; - } - }, [leftTime, targetDate]); + const memoLeftTime = useMemo(() => { + return isNumber(leftTime) && leftTime > 0 ? Date.now() + leftTime : undefined; + }, [leftTime]); + + const target = 'leftTime' in options ? memoLeftTime : targetDate; const [timeLeft, setTimeLeft] = useState(() => calcLeft(target)); diff --git a/packages/hooks/src/useCounter/__tests__/index.spec.ts b/packages/hooks/src/useCounter/__tests__/index.spec.ts new file mode 100644 index 0000000000..e095e2e89d --- /dev/null +++ b/packages/hooks/src/useCounter/__tests__/index.spec.ts @@ -0,0 +1,51 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import type { Options } from '../index'; +import useCounter from '../index'; + +const setUp = (init?: number, options?: Options) => renderHook(() => useCounter(init, options)); + +describe('useCounter', () => { + test('should init counter', () => { + const { result } = setUp(100); + const [current] = result.current; + expect(current).toBe(100); + }); + + test('should max, min, actions work', () => { + const { result } = setUp(100, { max: 10, min: 1 }); + const [current, { inc, dec, reset, set }] = result.current; + expect(current).toBe(10); + act(() => { + inc(1); + }); + expect(result.current[0]).toBe(10); + act(() => { + dec(100); + }); + expect(result.current[0]).toBe(1); + act(() => { + inc(); + }); + expect(result.current[0]).toBe(2); + act(() => { + reset(); + }); + expect(result.current[0]).toBe(10); + act(() => { + set(-1000); + }); + expect(result.current[0]).toBe(1); + act(() => { + set((c) => c + 2); + }); + expect(result.current[0]).toBe(3); + + act(() => { + inc(); + inc(); + inc(); + }); + expect(result.current[0]).toBe(6); + }); +}); diff --git a/packages/hooks/src/useCounter/__tests__/index.test.ts b/packages/hooks/src/useCounter/__tests__/index.test.ts deleted file mode 100644 index d2e0bdaad6..0000000000 --- a/packages/hooks/src/useCounter/__tests__/index.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useCounter, { Options } from '../index'; - -const setUp = (init?: number, options?: Options) => renderHook(() => useCounter(init, options)); - -it('should init counter', () => { - const { result } = setUp(100); - const [current] = result.current; - expect(current).toEqual(100); -}); - -it('should max, min, actions work', () => { - const { result } = setUp(100, { max: 10, min: 1 }); - const [current, { inc, dec, reset, set }] = result.current; - expect(current).toEqual(10); - act(() => { - inc(1); - }); - expect(result.current[0]).toEqual(10); - act(() => { - dec(100); - }); - expect(result.current[0]).toEqual(1); - act(() => { - inc(); - }); - expect(result.current[0]).toEqual(2); - act(() => { - reset(); - }); - expect(result.current[0]).toEqual(10); - act(() => { - set(-1000); - }); - expect(result.current[0]).toEqual(1); - act(() => { - set((c) => c + 2); - }); - expect(result.current[0]).toEqual(3); - - act(() => { - inc(); - inc(); - inc(); - }); - expect(result.current[0]).toEqual(6); -}); diff --git a/packages/hooks/src/useCounter/demo/demo1.tsx b/packages/hooks/src/useCounter/demo/demo1.tsx index 7f10abc05d..f6de445ae7 100644 --- a/packages/hooks/src/useCounter/demo/demo1.tsx +++ b/packages/hooks/src/useCounter/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 简单的 counter 管理示例。 */ -import React from 'react'; import { useCounter } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useCreation/__tests__/index.test.ts b/packages/hooks/src/useCreation/__tests__/index.spec.ts similarity index 82% rename from packages/hooks/src/useCreation/__tests__/index.test.ts rename to packages/hooks/src/useCreation/__tests__/index.spec.ts index e4f945383c..341c493ea0 100644 --- a/packages/hooks/src/useCreation/__tests__/index.test.ts +++ b/packages/hooks/src/useCreation/__tests__/index.spec.ts @@ -1,5 +1,6 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; import useCreation from '../index'; describe('useCreation', () => { @@ -11,7 +12,7 @@ describe('useCreation', () => { data: number; } - const setUp = (): any => + const setUp = () => renderHook(() => { const [count, setCount] = useState(0); const [, setFlag] = useState({}); @@ -24,7 +25,7 @@ describe('useCreation', () => { }; }); - it('should work', () => { + test('should work', () => { const hook = setUp(); const { foo } = hook.result.current; act(() => { diff --git a/packages/hooks/src/useCreation/demo/demo1.tsx b/packages/hooks/src/useCreation/demo/demo1.tsx index 2c61a094e9..6cce230e5a 100644 --- a/packages/hooks/src/useCreation/demo/demo1.tsx +++ b/packages/hooks/src/useCreation/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 点击 "Rerender" 按钮,触发组件的更新,但 Foo 的实例会保持不变 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useCreation } from 'ahooks'; class Foo { diff --git a/packages/hooks/src/useCreation/index.ts b/packages/hooks/src/useCreation/index.ts index ca8bf4a813..944d22b7aa 100644 --- a/packages/hooks/src/useCreation/index.ts +++ b/packages/hooks/src/useCreation/index.ts @@ -2,10 +2,10 @@ import type { DependencyList } from 'react'; import { useRef } from 'react'; import depsAreSame from '../utils/depsAreSame'; -export default function useCreation(factory: () => T, deps: DependencyList) { +const useCreation = (factory: () => T, deps: DependencyList) => { const { current } = useRef({ deps, - obj: undefined as undefined | T, + obj: undefined as T, initialized: false, }); if (current.initialized === false || !depsAreSame(current.deps, deps)) { @@ -13,5 +13,7 @@ export default function useCreation(factory: () => T, deps: DependencyList) { current.obj = factory(); current.initialized = true; } - return current.obj as T; -} + return current.obj; +}; + +export default useCreation; diff --git a/packages/hooks/src/useCreation/index.zh-CN.md b/packages/hooks/src/useCreation/index.zh-CN.md index 437119cb80..5359eb662c 100644 --- a/packages/hooks/src/useCreation/index.zh-CN.md +++ b/packages/hooks/src/useCreation/index.zh-CN.md @@ -7,7 +7,7 @@ nav: `useCreation` 是 `useMemo` 或 `useRef` 的替代品。 -因为 `useMemo` 不能保证被 memo 的值一定不会被重计算,而 `useCreation` 可以保证这一点。以下为 React 官方文档中的介绍: +因为 `useMemo` 不能保证被 memo 的值一定不会被重新计算,而 `useCreation` 可以保证这一点。以下为 React 官方文档中的介绍: > **You may rely on useMemo as a performance optimization, not as a semantic guarantee.** In the future, React may choose to “forget” some previously memoized values and recalculate them on next render, e.g. to free memory for offscreen components. Write your code so that it still works without `useMemo` — and then add it to optimize performance. diff --git a/packages/hooks/src/useDebounce/__tests__/index.spec.ts b/packages/hooks/src/useDebounce/__tests__/index.spec.ts new file mode 100644 index 0000000000..8b5883e1a5 --- /dev/null +++ b/packages/hooks/src/useDebounce/__tests__/index.spec.ts @@ -0,0 +1,34 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import { sleep } from '../../utils/testingHelpers'; +import useDebounce from '../index'; + +describe('useDebounce', () => { + test('useDebounce wait:200ms', async () => { + let mountedState = 0; + const { result, rerender } = renderHook(() => useDebounce(mountedState, { wait: 200 })); + expect(result.current).toBe(0); + + mountedState = 1; + rerender(); + await sleep(50); + expect(result.current).toBe(0); + + mountedState = 2; + rerender(); + await sleep(100); + expect(result.current).toBe(0); + + mountedState = 3; + rerender(); + await sleep(150); + expect(result.current).toBe(0); + + mountedState = 4; + rerender(); + await act(async () => { + await sleep(250); + }); + expect(result.current).toBe(4); + }); +}); diff --git a/packages/hooks/src/useDebounce/__tests__/index.test.ts b/packages/hooks/src/useDebounce/__tests__/index.test.ts deleted file mode 100644 index 7455a053a7..0000000000 --- a/packages/hooks/src/useDebounce/__tests__/index.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useDebounce from '../index'; -import { sleep } from '../../utils/testingHelpers'; - -describe('useDebounce', () => { - it('useDebounce wait:200ms', async () => { - let mountedState = 0; - const { result, rerender } = renderHook(() => useDebounce(mountedState, { wait: 200 })); - expect(result.current).toEqual(0); - - await act(async () => { - mountedState = 1; - rerender(); - await sleep(50); - expect(result.current).toEqual(0); - - mountedState = 2; - rerender(); - await sleep(100); - expect(result.current).toEqual(0); - - mountedState = 3; - rerender(); - await sleep(150); - expect(result.current).toEqual(0); - - mountedState = 4; - rerender(); - await sleep(250); - expect(result.current).toEqual(4); - }); - }); -}); diff --git a/packages/hooks/src/useDebounce/demo/demo1.tsx b/packages/hooks/src/useDebounce/demo/demo1.tsx index 4605f03a46..faa14547e5 100644 --- a/packages/hooks/src/useDebounce/demo/demo1.tsx +++ b/packages/hooks/src/useDebounce/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: DebouncedValue 只会在输入结束 500ms 后变化。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useDebounce } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useDebounceEffect/__tests__/index.spec.ts b/packages/hooks/src/useDebounceEffect/__tests__/index.spec.ts new file mode 100644 index 0000000000..f30e058377 --- /dev/null +++ b/packages/hooks/src/useDebounceEffect/__tests__/index.spec.ts @@ -0,0 +1,97 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { sleep } from '../../utils/testingHelpers'; +import useDebounceEffect from '../index'; + +let hook: RenderHookResult; + +describe('useDebounceEffect', () => { + test('useDebounceEffect should work', async () => { + let mountedState = 1; + const mockEffect = vi.fn(() => {}); + const mockCleanUp = vi.fn(() => {}); + act(() => { + hook = renderHook(() => + useDebounceEffect( + () => { + mockEffect(); + return () => { + mockCleanUp(); + }; + }, + [mountedState], + { wait: 200 }, + ), + ); + }); + + expect(mockEffect.mock.calls.length).toBe(0); + expect(mockCleanUp.mock.calls.length).toBe(0); + mountedState = 2; + hook.rerender(); + await sleep(50); + mountedState = 3; + hook.rerender(); + expect(mockEffect.mock.calls.length).toBe(0); + expect(mockCleanUp.mock.calls.length).toBe(0); + await act(async () => { + await sleep(300); + }); + expect(mockEffect.mock.calls.length).toBe(1); + expect(mockCleanUp.mock.calls.length).toBe(0); + mountedState = 4; + hook.rerender(); + expect(mockEffect.mock.calls.length).toBe(1); + expect(mockCleanUp.mock.calls.length).toBe(0); + await act(async () => { + await sleep(300); + }); + expect(mockEffect.mock.calls.length).toBe(2); + expect(mockCleanUp.mock.calls.length).toBe(1); + }); + + test('should cancel timeout on unmount', async () => { + const mockEffect = vi.fn(() => {}); + const mockCleanUp = vi.fn(() => {}); + + const hook2 = renderHook( + (props) => + useDebounceEffect( + () => { + mockEffect(); + return () => { + mockCleanUp(); + }; + }, + [props], + { wait: 200 }, + ), + { initialProps: 0 }, + ); + + expect(mockEffect.mock.calls.length).toBe(0); + expect(mockCleanUp.mock.calls.length).toBe(0); + + hook2.rerender(1); + await sleep(50); + expect(mockEffect.mock.calls.length).toBe(0); + expect(mockCleanUp.mock.calls.length).toBe(0); + + await act(async () => { + await sleep(300); + }); + expect(mockEffect.mock.calls.length).toBe(1); + expect(mockCleanUp.mock.calls.length).toBe(0); + + hook2.rerender(2); + await act(async () => { + await sleep(300); + }); + expect(mockEffect.mock.calls.length).toBe(2); + expect(mockCleanUp.mock.calls.length).toBe(1); + + hook2.unmount(); + expect(mockEffect.mock.calls.length).toBe(2); + expect(mockCleanUp.mock.calls.length).toBe(2); + }); +}); diff --git a/packages/hooks/src/useDebounceEffect/__tests__/index.test.ts b/packages/hooks/src/useDebounceEffect/__tests__/index.test.ts deleted file mode 100644 index 5d8de49c08..0000000000 --- a/packages/hooks/src/useDebounceEffect/__tests__/index.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; -import useDebounceEffect from '../index'; -import { sleep } from '../../utils/testingHelpers'; - -interface ParamsObj { - value: any; - wait: number; -} - -let hook: RenderHookResult; - -describe('useDebounceEffect', () => { - it('useDebounceEffect should work', async () => { - let mountedState = 1; - const mockEffect = jest.fn(() => {}); - const mockCleanUp = jest.fn(() => {}); - act(() => { - hook = renderHook(() => - useDebounceEffect( - () => { - mockEffect(); - return () => { - mockCleanUp(); - }; - }, - [mountedState], - { wait: 200 }, - ), - ); - }); - await act(async () => { - expect(mockEffect.mock.calls.length).toEqual(0); - expect(mockCleanUp.mock.calls.length).toEqual(0); - mountedState = 2; - hook.rerender(); - await sleep(50); - mountedState = 3; - hook.rerender(); - expect(mockEffect.mock.calls.length).toEqual(0); - expect(mockCleanUp.mock.calls.length).toEqual(0); - await sleep(300); - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(0); - mountedState = 4; - hook.rerender(); - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(0); - await sleep(300); - expect(mockEffect.mock.calls.length).toEqual(2); - expect(mockCleanUp.mock.calls.length).toEqual(1); - }); - }); - - it('should cancel timeout on unmount', async () => { - const mockEffect = jest.fn(() => {}); - const mockCleanUp = jest.fn(() => {}); - - const hook = renderHook( - (props) => - useDebounceEffect( - () => { - mockEffect(); - return () => { - mockCleanUp(); - }; - }, - [props], - { wait: 200 }, - ), - { initialProps: 0 }, - ); - - await act(async () => { - expect(mockEffect.mock.calls.length).toEqual(0); - expect(mockCleanUp.mock.calls.length).toEqual(0); - - hook.rerender(1); - await sleep(50); - expect(mockEffect.mock.calls.length).toEqual(0); - expect(mockCleanUp.mock.calls.length).toEqual(0); - - await sleep(300); - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(0); - - hook.rerender(2); - await sleep(300); - expect(mockEffect.mock.calls.length).toEqual(2); - expect(mockCleanUp.mock.calls.length).toEqual(1); - - hook.unmount(); - expect(mockEffect.mock.calls.length).toEqual(2); - expect(mockCleanUp.mock.calls.length).toEqual(2); - }); - }); -}); diff --git a/packages/hooks/src/useDebounceEffect/demo/demo1.tsx b/packages/hooks/src/useDebounceEffect/demo/demo1.tsx index edb8bc15ee..a54baab6f4 100644 --- a/packages/hooks/src/useDebounceEffect/demo/demo1.tsx +++ b/packages/hooks/src/useDebounceEffect/demo/demo1.tsx @@ -1,5 +1,5 @@ import { useDebounceEffect } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [value, setValue] = useState('hello'); diff --git a/packages/hooks/src/useDebounceFn/__tests__/index.test.ts b/packages/hooks/src/useDebounceFn/__tests__/index.spec.ts similarity index 69% rename from packages/hooks/src/useDebounceFn/__tests__/index.test.ts rename to packages/hooks/src/useDebounceFn/__tests__/index.spec.ts index 919ba45c5b..53649b843f 100644 --- a/packages/hooks/src/useDebounceFn/__tests__/index.test.ts +++ b/packages/hooks/src/useDebounceFn/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import { sleep } from '../../utils/testingHelpers'; import useDebounceFn from '../index'; @@ -15,10 +16,10 @@ const debounceFn = (gap: number) => { const setUp = ({ fn, wait }: ParamsObj) => renderHook(() => useDebounceFn(fn, { wait })); -let hook: RenderHookResult>; +let hook: RenderHookResult; describe('useDebounceFn', () => { - it('run, cancel and flush should work', async () => { + test('run, cancel and flush should work', async () => { act(() => { hook = setUp({ fn: debounceFn, @@ -54,11 +55,4 @@ describe('useDebounceFn', () => { expect(count).toBe(7); }); }); - - it('should output error when fn is not a function', () => { - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - renderHook(() => useDebounceFn(1 as any)); - expect(errSpy).toBeCalledWith('useDebounceFn expected parameter is a function, got number'); - errSpy.mockRestore(); - }); }); diff --git a/packages/hooks/src/useDebounceFn/demo/demo1.tsx b/packages/hooks/src/useDebounceFn/demo/demo1.tsx index aa64c20521..529d2eb14b 100644 --- a/packages/hooks/src/useDebounceFn/demo/demo1.tsx +++ b/packages/hooks/src/useDebounceFn/demo/demo1.tsx @@ -7,7 +7,7 @@ */ import { useDebounceFn } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [value, setValue] = useState(0); diff --git a/packages/hooks/src/useDebounceFn/index.en-US.md b/packages/hooks/src/useDebounceFn/index.en-US.md index 7d9344e30f..42198da4d6 100644 --- a/packages/hooks/src/useDebounceFn/index.en-US.md +++ b/packages/hooks/src/useDebounceFn/index.en-US.md @@ -46,6 +46,6 @@ const { | Property | Description | Type | | -------- | ------------------------------------------------------ | ------------------------- | -| run | Invode and pass parameters to fn. | `(...args: any[]) => any` | +| run | invoke and pass parameters to fn. | `(...args: any[]) => any` | | cancel | Cancel the invocation of currently debounced function. | `() => void` | | flush | Immediately invoke currently debounced function. | `() => void` | diff --git a/packages/hooks/src/useDebounceFn/index.ts b/packages/hooks/src/useDebounceFn/index.ts index 0728071ca6..24910f4b37 100644 --- a/packages/hooks/src/useDebounceFn/index.ts +++ b/packages/hooks/src/useDebounceFn/index.ts @@ -1,4 +1,4 @@ -import debounce from 'lodash/debounce'; +import { debounce } from '../utils/lodash-polyfill'; import { useMemo } from 'react'; import type { DebounceOptions } from '../useDebounce/debounceOptions'; import useLatest from '../useLatest'; diff --git a/packages/hooks/src/useDeepCompareEffect/__tests__/index.test.ts b/packages/hooks/src/useDeepCompareEffect/__tests__/index.spec.ts similarity index 71% rename from packages/hooks/src/useDeepCompareEffect/__tests__/index.test.ts rename to packages/hooks/src/useDeepCompareEffect/__tests__/index.spec.ts index 0e4f3aa4c8..d820491da2 100644 --- a/packages/hooks/src/useDeepCompareEffect/__tests__/index.test.ts +++ b/packages/hooks/src/useDeepCompareEffect/__tests__/index.spec.ts @@ -1,14 +1,15 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; import useDeepCompareEffect from '../index'; describe('useDeepCompareEffect', () => { - it('test deep compare', async () => { + test('test deep compare', async () => { const hook = renderHook(() => { const [x, setX] = useState(0); const [y, setY] = useState({}); useDeepCompareEffect(() => { - setX((x) => x + 1); + setX((prevState) => prevState + 1); }, [y]); return { x, setY }; }); diff --git a/packages/hooks/src/useDeepCompareEffect/demo/demo1.tsx b/packages/hooks/src/useDeepCompareEffect/demo/demo1.tsx index 209af76428..49ac4fe0b7 100644 --- a/packages/hooks/src/useDeepCompareEffect/demo/demo1.tsx +++ b/packages/hooks/src/useDeepCompareEffect/demo/demo1.tsx @@ -1,8 +1,8 @@ import { useDeepCompareEffect } from 'ahooks'; -import React, { useEffect, useState, useRef } from 'react'; +import { useEffect, useState, useRef } from 'react'; export default () => { - const [count, setCount] = useState(0); + const [, setCount] = useState(0); const effectCountRef = useRef(0); const deepCompareCountRef = useRef(0); diff --git a/packages/hooks/src/useDeepCompareEffect/index.en-US.md b/packages/hooks/src/useDeepCompareEffect/index.en-US.md index b8a8ad4047..28e9d3898d 100644 --- a/packages/hooks/src/useDeepCompareEffect/index.en-US.md +++ b/packages/hooks/src/useDeepCompareEffect/index.en-US.md @@ -5,7 +5,7 @@ nav: # useDeepCompareEffect -Usage is the same as `useEffect`, but deps are compared with [lodash.isEqual](https://lodash.com/docs/4.17.15#isEqual). +Usage is the same as `useEffect`, but deps are compared with [react-fast-compare](https://www.npmjs.com/package/react-fast-compare). ## Examples diff --git a/packages/hooks/src/useDeepCompareEffect/index.zh-CN.md b/packages/hooks/src/useDeepCompareEffect/index.zh-CN.md index 056a2be0dd..d96fe9f218 100644 --- a/packages/hooks/src/useDeepCompareEffect/index.zh-CN.md +++ b/packages/hooks/src/useDeepCompareEffect/index.zh-CN.md @@ -5,7 +5,7 @@ nav: # useDeepCompareEffect -用法与 useEffect 一致,但 deps 通过 [lodash isEqual](https://lodash.com/docs/4.17.15#isEqual) 进行深比较。 +用法与 useEffect 一致,但 deps 通过 [react-fast-compare](https://www.npmjs.com/package/react-fast-compare) 进行深比较。 ## 代码演示 diff --git a/packages/hooks/src/useDeepCompareLayoutEffect/__tests__/index.test.ts b/packages/hooks/src/useDeepCompareLayoutEffect/__tests__/index.spec.ts similarity index 78% rename from packages/hooks/src/useDeepCompareLayoutEffect/__tests__/index.test.ts rename to packages/hooks/src/useDeepCompareLayoutEffect/__tests__/index.spec.ts index d593e06b81..4907a3d998 100644 --- a/packages/hooks/src/useDeepCompareLayoutEffect/__tests__/index.test.ts +++ b/packages/hooks/src/useDeepCompareLayoutEffect/__tests__/index.spec.ts @@ -1,9 +1,10 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; import useDeepCompareLayoutEffect from '../index'; describe('useDeepCompareLayoutEffect', () => { - it('test deep compare', async () => { + test('test deep compare', async () => { const hook = renderHook(() => { const [x, setX] = useState(0); const [y, setY] = useState({}); diff --git a/packages/hooks/src/useDeepCompareLayoutEffect/demo/demo1.tsx b/packages/hooks/src/useDeepCompareLayoutEffect/demo/demo1.tsx index 58c9d65c29..a0a37f54b5 100644 --- a/packages/hooks/src/useDeepCompareLayoutEffect/demo/demo1.tsx +++ b/packages/hooks/src/useDeepCompareLayoutEffect/demo/demo1.tsx @@ -1,5 +1,5 @@ import { useDeepCompareLayoutEffect } from 'ahooks'; -import React, { useLayoutEffect, useState, useRef } from 'react'; +import { useLayoutEffect, useState, useRef } from 'react'; export default () => { const [, setCount] = useState(0); diff --git a/packages/hooks/src/useDeepCompareLayoutEffect/index.en-US.md b/packages/hooks/src/useDeepCompareLayoutEffect/index.en-US.md index 03d25e7b96..0b1e8cd48b 100644 --- a/packages/hooks/src/useDeepCompareLayoutEffect/index.en-US.md +++ b/packages/hooks/src/useDeepCompareLayoutEffect/index.en-US.md @@ -5,7 +5,7 @@ nav: # useDeepCompareLayoutEffect -Usage is the same as `useLayoutEffect`, but deps are compared with [lodash.isEqual](https://lodash.com/docs/4.17.15#isEqual). +Usage is the same as `useLayoutEffect`, but deps are compared with [react-fast-compare](https://www.npmjs.com/package/react-fast-compare). ## Examples diff --git a/packages/hooks/src/useDeepCompareLayoutEffect/index.zh-CN.md b/packages/hooks/src/useDeepCompareLayoutEffect/index.zh-CN.md index 1816813a25..3d5fb32cef 100644 --- a/packages/hooks/src/useDeepCompareLayoutEffect/index.zh-CN.md +++ b/packages/hooks/src/useDeepCompareLayoutEffect/index.zh-CN.md @@ -5,7 +5,7 @@ nav: # useDeepCompareLayoutEffect -用法与 useLayoutEffect 一致,但 deps 通过 [lodash isEqual](https://lodash.com/docs/4.17.15#isEqual) 进行深比较。 +用法与 useLayoutEffect 一致,但 deps 通过 [react-fast-compare](https://www.npmjs.com/package/react-fast-compare) 进行深比较。 ## 代码演示 diff --git a/packages/hooks/src/useDocumentVisibility/__tests__/index.test.ts b/packages/hooks/src/useDocumentVisibility/__tests__/index.spec.ts similarity index 65% rename from packages/hooks/src/useDocumentVisibility/__tests__/index.test.ts rename to packages/hooks/src/useDocumentVisibility/__tests__/index.spec.ts index 9639f93dd6..8358c34086 100644 --- a/packages/hooks/src/useDocumentVisibility/__tests__/index.test.ts +++ b/packages/hooks/src/useDocumentVisibility/__tests__/index.spec.ts @@ -1,10 +1,11 @@ +import { act, renderHook } from '@testing-library/react'; +import { afterAll, describe, expect, test, vi } from 'vitest'; import useDocumentVisibility from '../index'; -import { renderHook, act } from '@testing-library/react-hooks'; -const mockIsBrowser = jest.fn(); -const mockDocumentVisibilityState = jest.spyOn(document, 'visibilityState', 'get'); +const mockIsBrowser = vi.fn(); +const mockDocumentVisibilityState = vi.spyOn(document, 'visibilityState', 'get'); -jest.mock('../../utils/isBrowser', () => { +vi.mock('../../utils/isBrowser', () => { return { __esModule: true, get default() { @@ -14,29 +15,29 @@ jest.mock('../../utils/isBrowser', () => { }); afterAll(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); describe('useDocumentVisibility', () => { - it('isBrowser effect corrent', async () => { + test('isBrowser effect correct', async () => { mockDocumentVisibilityState.mockReturnValue('hidden'); // Object.defineProperty(document, 'visibilityState', { value: 'hidden', writable: true }); mockIsBrowser.mockReturnValue(false); const { result } = renderHook(() => useDocumentVisibility()); - expect(result.current).toEqual('visible'); + expect(result.current).toBe('visible'); }); - it('visibilitychange update correct ', async () => { + test('visibilitychange update correct ', async () => { mockDocumentVisibilityState.mockReturnValue('hidden'); // Object.defineProperty(document, 'visibilityState', { value: 'hidden', writable: true }); mockIsBrowser.mockReturnValue(true); const { result } = renderHook(() => useDocumentVisibility()); - expect(result.current).toEqual('hidden'); + expect(result.current).toBe('hidden'); mockDocumentVisibilityState.mockReturnValue('visible'); // Object.defineProperty(document, 'visibilityState', { value: 'visible', writable: true }); act(() => { document.dispatchEvent(new Event('visibilitychange')); }); - expect(result.current).toEqual('visible'); + expect(result.current).toBe('visible'); }); }); diff --git a/packages/hooks/src/useDocumentVisibility/demo/demo1.tsx b/packages/hooks/src/useDocumentVisibility/demo/demo1.tsx index c442103e2c..ee88b7de74 100644 --- a/packages/hooks/src/useDocumentVisibility/demo/demo1.tsx +++ b/packages/hooks/src/useDocumentVisibility/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 监听 document 的可见状态 */ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { useDocumentVisibility } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useDocumentVisibility/index.ts b/packages/hooks/src/useDocumentVisibility/index.ts index e5f294c969..d8fea6302b 100644 --- a/packages/hooks/src/useDocumentVisibility/index.ts +++ b/packages/hooks/src/useDocumentVisibility/index.ts @@ -12,7 +12,7 @@ const getVisibility = () => { }; function useDocumentVisibility(): VisibilityState { - const [documentVisibility, setDocumentVisibility] = useState(() => getVisibility()); + const [documentVisibility, setDocumentVisibility] = useState(getVisibility); useEventListener( 'visibilitychange', diff --git a/packages/hooks/src/useDocumentVisibility/index.zh-CN.md b/packages/hooks/src/useDocumentVisibility/index.zh-CN.md index 0526c8e1fc..349930a52e 100644 --- a/packages/hooks/src/useDocumentVisibility/index.zh-CN.md +++ b/packages/hooks/src/useDocumentVisibility/index.zh-CN.md @@ -21,6 +21,6 @@ const documentVisibility = useDocumentVisibility(); ### Result -| 参数 | 说明 | 类型 | -| ------------------ | ------------------------------------ | -------------------------------------------------- | -| documentVisibility | 判断 document 是否在是否处于可见状态 | `visible`\| `hidden` \| `prerender` \| `undefined` | +| 参数 | 说明 | 类型 | +| ------------------ | ------------------------------ | -------------------------------------------------- | +| documentVisibility | 判断 document 是否处于可见状态 | `visible`\| `hidden` \| `prerender` \| `undefined` | diff --git a/packages/hooks/src/useDrag/__tests__/index.test.ts b/packages/hooks/src/useDrag/__tests__/index.spec.ts similarity index 75% rename from packages/hooks/src/useDrag/__tests__/index.test.ts rename to packages/hooks/src/useDrag/__tests__/index.spec.ts index f185d88a1f..ab7251f172 100644 --- a/packages/hooks/src/useDrag/__tests__/index.test.ts +++ b/packages/hooks/src/useDrag/__tests__/index.spec.ts @@ -1,24 +1,28 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import type { BasicTarget } from '../../utils/domTarget'; import type { Options } from '../index'; import useDrag from '../index'; -import type { BasicTarget } from '../../utils/domTarget'; const setup = (data: T, target: BasicTarget, options?: Options) => renderHook((newData: T) => useDrag(newData ? newData : data, target, options)); const events: Record void> = {}; const mockTarget = { - addEventListener: jest.fn((event, callback) => { + addEventListener: vi.fn((event, callback) => { events[event] = callback; }), - removeEventListener: jest.fn((event) => { + removeEventListener: vi.fn((event) => { Reflect.deleteProperty(events, event); }), - setAttribute: jest.fn(), + setAttribute: vi.fn(), }; describe('useDrag', () => { - it('should add/remove listener on mount/unmount', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + test('should add/remove listener on mount/unmount', () => { const { unmount } = setup(1, mockTarget as any); expect(mockTarget.addEventListener).toBeCalled(); expect(mockTarget.addEventListener.mock.calls[0][0]).toBe('dragstart'); @@ -28,12 +32,12 @@ describe('useDrag', () => { expect(mockTarget.removeEventListener).toBeCalled(); }); - it('should triggle drag callback', () => { - const onDragStart = jest.fn(); - const onDragEnd = jest.fn(); + test('should trigger drag callback', () => { + const onDragStart = vi.fn(); + const onDragEnd = vi.fn(); const mockEvent = { dataTransfer: { - setData: jest.fn(), + setData: vi.fn(), }, }; const hook = setup(1, mockTarget as any, { @@ -55,7 +59,7 @@ describe('useDrag', () => { expect(onDragEnd).toBeCalled(); }); - it(`should not work when target don't support addEventListener method`, () => { + test(`should not work when target don't support addEventListener method`, () => { Object.defineProperty(mockTarget, 'addEventListener', { get() { return false; diff --git a/packages/hooks/src/useDrag/index.ts b/packages/hooks/src/useDrag/index.ts index 28301e5f68..2d2f091470 100644 --- a/packages/hooks/src/useDrag/index.ts +++ b/packages/hooks/src/useDrag/index.ts @@ -1,4 +1,7 @@ +import { useRef } from 'react'; import useLatest from '../useLatest'; +import useMount from '../useMount'; +import { isString } from '../utils'; import type { BasicTarget } from '../utils/domTarget'; import { getTargetElement } from '../utils/domTarget'; import useEffectWithTarget from '../utils/useEffectWithTarget'; @@ -6,11 +9,35 @@ import useEffectWithTarget from '../utils/useEffectWithTarget'; export interface Options { onDragStart?: (event: React.DragEvent) => void; onDragEnd?: (event: React.DragEvent) => void; + dragImage?: { + image: string | Element; + offsetX?: number; + offsetY?: number; + }; } const useDrag = (data: T, target: BasicTarget, options: Options = {}) => { const optionsRef = useLatest(options); const dataRef = useLatest(data); + const imageElementRef = useRef(undefined); + + const { dragImage } = optionsRef.current; + + useMount(() => { + if (dragImage?.image) { + const { image } = dragImage; + + if (isString(image)) { + const imageElement = new Image(); + + imageElement.src = image; + imageElementRef.current = imageElement; + } else { + imageElementRef.current = image; + } + } + }); + useEffectWithTarget( () => { const targetElement = getTargetElement(target); @@ -21,6 +48,12 @@ const useDrag = (data: T, target: BasicTarget, options: Options = {}) => { const onDragStart = (event: React.DragEvent) => { optionsRef.current.onDragStart?.(event); event.dataTransfer.setData('custom', JSON.stringify(dataRef.current)); + + if (dragImage?.image && imageElementRef.current) { + const { offsetX = 0, offsetY = 0 } = dragImage; + + event.dataTransfer.setDragImage(imageElementRef.current, offsetX, offsetY); + } }; const onDragEnd = (event: React.DragEvent) => { diff --git a/packages/hooks/src/useDrop/__tests__/index.test.ts b/packages/hooks/src/useDrop/__tests__/index.spec.ts similarity index 65% rename from packages/hooks/src/useDrop/__tests__/index.test.ts rename to packages/hooks/src/useDrop/__tests__/index.spec.ts index 9c01a32666..e0ffb25f11 100644 --- a/packages/hooks/src/useDrop/__tests__/index.test.ts +++ b/packages/hooks/src/useDrop/__tests__/index.spec.ts @@ -1,16 +1,18 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useDrop, { Options } from '../index'; +import { renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; import type { BasicTarget } from '../../utils/domTarget'; +import type { Options } from '../index'; +import useDrop from '../index'; const setup = (target: unknown, options?: Options) => renderHook(() => useDrop(target as BasicTarget, options)); -const events = {}; +const events: Record void> = {}; const mockTarget = { - addEventListener: jest.fn((event, callback) => { + addEventListener: vi.fn((event: string, callback: (event?: any) => void) => { events[event] = callback; }), - removeEventListener: jest.fn((event) => { + removeEventListener: vi.fn((event) => { Reflect.deleteProperty(events, event); }), }; @@ -34,12 +36,12 @@ const mockEvent = { return [] as unknown[]; }, }, - preventDefault: jest.fn(), - stopPropagation: jest.fn(), + preventDefault: vi.fn(), + stopPropagation: vi.fn(), }; describe('useDrop', () => { - it(`should not work when target don't support addEventListener method`, () => { + test(`should not work when target don't support addEventListener method`, () => { const originAddEventListener = mockTarget.addEventListener; Object.defineProperty(mockTarget, 'addEventListener', { value: false, @@ -51,7 +53,7 @@ describe('useDrop', () => { }); }); - it('should add/remove listener on mount/unmount', () => { + test('should add/remove listener on mount/unmount', () => { const { unmount } = setup(mockTarget); const eventNames = ['dragenter', 'dragover', 'dragleave', 'drop', 'paste']; expect(mockTarget.addEventListener).toBeCalledTimes(eventNames.length); @@ -65,12 +67,12 @@ describe('useDrop', () => { }); }); - it('should call callback', () => { - const onDragEnter = jest.fn(); - const onDragOver = jest.fn(); - const onDragLeave = jest.fn(); - const onDrop = jest.fn(); - const onPaste = jest.fn(); + test('should call callback', () => { + const onDragEnter = vi.fn(); + const onDragOver = vi.fn(); + const onDragLeave = vi.fn(); + const onDrop = vi.fn(); + const onPaste = vi.fn(); setup(mockTarget, { onDragEnter, @@ -87,16 +89,16 @@ describe('useDrop', () => { callbacks.forEach((callback) => expect(callback).toBeCalled()); }); - it('should call onText on drop', async () => { - jest.spyOn(mockEvent.dataTransfer, 'items', 'get').mockReturnValue([ + test('should call onText on drop', async () => { + vi.spyOn(mockEvent.dataTransfer, 'items', 'get').mockReturnValue([ { - getAsString: (callback) => { + getAsString: (callback: (text: string) => void) => { callback('drop text'); }, }, ]); - const onText = jest.fn(); + const onText = vi.fn(); setup(mockTarget, { onText, }); @@ -105,10 +107,10 @@ describe('useDrop', () => { expect(onText.mock.calls[0][0]).toBe('drop text'); }); - it('should call onFiles on drop', async () => { + test('should call onFiles on drop', async () => { const file = new File(['hello'], 'hello.png'); - jest.spyOn(mockEvent.dataTransfer, 'files', 'get').mockReturnValue([file]); - const onFiles = jest.fn(); + vi.spyOn(mockEvent.dataTransfer, 'files', 'get').mockReturnValue([file]); + const onFiles = vi.fn(); setup(mockTarget, { onFiles, }); @@ -117,13 +119,14 @@ describe('useDrop', () => { expect(onFiles.mock.calls[0][0]).toHaveLength(1); }); - it('should call onUri on drop', async () => { + test('should call onUri on drop', async () => { const url = 'https://alipay.com'; - jest.spyOn(mockEvent.dataTransfer, 'getData').mockImplementation((format: string) => { + vi.spyOn(mockEvent.dataTransfer, 'getData').mockImplementation((format?: string) => { if (format === 'text/uri-list') return url; + return undefined; }); - const onUri = jest.fn(); + const onUri = vi.fn(); setup(mockTarget, { onUri, }); @@ -132,15 +135,16 @@ describe('useDrop', () => { expect(onUri.mock.calls[0][0]).toBe(url); }); - it('should call onDom on drop', async () => { + test('should call onDom on drop', async () => { const data = { value: 'mock', }; - jest.spyOn(mockEvent.dataTransfer, 'getData').mockImplementation((format: string) => { + vi.spyOn(mockEvent.dataTransfer, 'getData').mockImplementation((format?: string) => { if (format === 'custom') return data; + return undefined; }); - const onDom = jest.fn(); + const onDom = vi.fn(); setup(mockTarget, { onDom, }); @@ -149,24 +153,25 @@ describe('useDrop', () => { expect(onDom.mock.calls[0][0]).toMatchObject(data); // catch JSON.parse error - jest.spyOn(mockEvent.dataTransfer, 'getData').mockImplementation((format: string) => { + vi.spyOn(mockEvent.dataTransfer, 'getData').mockImplementation((format?: string) => { if (format === 'custom') return {}; + return undefined; }); events['dragenter'](mockEvent); events['drop'](mockEvent); expect(onDom.mock.calls[0][0]).toMatchObject({}); }); - it('should call onText on paste', async () => { - jest.spyOn(mockEvent.clipboardData, 'items', 'get').mockReturnValue([ + test('should call onText on paste', async () => { + vi.spyOn(mockEvent.clipboardData, 'items', 'get').mockReturnValue([ { - getAsString: (callback) => { + getAsString: (callback: (text: string) => void) => { callback('paste text'); }, }, ]); - const onText = jest.fn(); + const onText = vi.fn(); setup(mockTarget, { onText, }); diff --git a/packages/hooks/src/useDrop/demo/demo1.tsx b/packages/hooks/src/useDrop/demo/demo1.tsx index bcbf2032b7..2ee2c0fba3 100644 --- a/packages/hooks/src/useDrop/demo/demo1.tsx +++ b/packages/hooks/src/useDrop/demo/demo1.tsx @@ -6,10 +6,10 @@ * desc.zh-CN: 拖拽区域可以接受文件,链接,文字,和下方的 box 节点。 */ -import React, { useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import { useDrop, useDrag } from 'ahooks'; -const DragItem = ({ data }) => { +const DragItem = ({ data }: { data: string }) => { const dragRef = useRef(null); const [dragging, setDragging] = useState(false); @@ -70,8 +70,8 @@ export default () => { {isHovering ? 'release here' : 'drop here'} -
- {['1', '2', '3', '4', '5'].map((e, i) => ( +
+ {['1', '2', '3', '4', '5'].map((e) => ( ))}
diff --git a/packages/hooks/src/useDrop/demo/demo2.tsx b/packages/hooks/src/useDrop/demo/demo2.tsx new file mode 100644 index 0000000000..7e0776d92b --- /dev/null +++ b/packages/hooks/src/useDrop/demo/demo2.tsx @@ -0,0 +1,36 @@ +/** + * title: Customize Image + * desc: Customize image that follow the mouse pointer during dragging. + * + * title.zh-CN: 自定义拖拽图像 + * desc.zh-CN: 自定义拖拽过程中跟随鼠标指针的图像。 + */ + +import { useRef } from 'react'; +import { useDrag } from 'ahooks'; + +const COMMON_STYLE: React.CSSProperties = { + border: '1px solid #e8e8e8', + height: '50px', + lineHeight: '50px', + padding: '16px', + textAlign: 'center', + marginRight: '16px', +}; + +export default () => { + const dragRef = useRef(null); + + useDrag('', dragRef, { + dragImage: { + image: '/logo.svg', + }, + }); + + return ( +
+ +
drag me
+
+ ); +}; diff --git a/packages/hooks/src/useDrop/index.en-US.md b/packages/hooks/src/useDrop/index.en-US.md index c56a93fd45..a6755c292c 100644 --- a/packages/hooks/src/useDrop/index.en-US.md +++ b/packages/hooks/src/useDrop/index.en-US.md @@ -19,6 +19,10 @@ A pair of hooks to help you manage data transfer between drag and drop +### Customize Image + + + ## API ### useDrag @@ -41,10 +45,19 @@ useDrag( #### DragOptions -| Property | Description | Type | Default | -| ----------- | ---------------------- | ------------------------------ | ------- | -| onDragStart | On drag start callback | `(e: React.DragEvent) => void` | - | -| onDragEnd | On drag end callback | `(e: React.DragEvent) => void` | - | +| Property | Description | Type | Default | +| ----------- | ------------------------------------------------------------- | ------------------------------ | ------- | +| onDragStart | On drag start callback | `(e: React.DragEvent) => void` | - | +| onDragEnd | On drag end callback | `(e: React.DragEvent) => void` | - | +| dragImage | Customize image that follow the mouse pointer during dragging | `DragImageOptions` | - | + +#### DragImageOptions + +| 参数 | 说明 | 类型 | 默认值 | +| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ------ | +| image | An image Element element to use for the drag feedback image. The image will typically be an [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) element but it can also be a [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas) or any other visible element | `string \| Element` | - | +| offsetX | the horizontal offset within the image | `number` | 0 | +| offsetY | the vertical offset within the image | `number` | 0 | ### useDrop diff --git a/packages/hooks/src/useDrop/index.ts b/packages/hooks/src/useDrop/index.ts index a340cb4f0b..6a82f935e7 100644 --- a/packages/hooks/src/useDrop/index.ts +++ b/packages/hooks/src/useDrop/index.ts @@ -20,7 +20,7 @@ const useDrop = (target: BasicTarget, options: Options = {}) => { const optionsRef = useLatest(options); // https://stackoverflow.com/a/26459269 - const dragEnterTarget = useRef(); + const dragEnterTarget = useRef(undefined); useEffectWithTarget( () => { @@ -40,7 +40,7 @@ const useDrop = (target: BasicTarget, options: Options = {}) => { let data = dom; try { data = JSON.parse(dom); - } catch (e) { + } catch { data = dom; } optionsRef.current.onDom(data, event as React.DragEvent); diff --git a/packages/hooks/src/useDrop/index.zh-CN.md b/packages/hooks/src/useDrop/index.zh-CN.md index c0a422cac5..c1dc96d4ae 100644 --- a/packages/hooks/src/useDrop/index.zh-CN.md +++ b/packages/hooks/src/useDrop/index.zh-CN.md @@ -19,6 +19,10 @@ nav: +### 自定义拖拽图像 + + + ## API ### useDrag @@ -41,10 +45,19 @@ useDrag( #### DragOptions -| 参数 | 说明 | 类型 | 默认值 | -| ----------- | -------------- | ------------------------------ | ------ | -| onDragStart | 开始拖拽的回调 | `(e: React.DragEvent) => void` | - | -| onDragEnd | 结束拖拽的回调 | `(e: React.DragEvent) => void` | - | +| 参数 | 说明 | 类型 | 默认值 | +| ----------- | ---------------------------------- | ------------------------------ | ------ | +| onDragStart | 开始拖拽的回调 | `(e: React.DragEvent) => void` | - | +| onDragEnd | 结束拖拽的回调 | `(e: React.DragEvent) => void` | - | +| dragImage | 自定义拖拽过程中跟随鼠标指针的图像 | `DragImageOptions` | - | + +#### DragImageOptions + +| 参数 | 说明 | 类型 | 默认值 | +| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | ------ | +| image | 拖拽过程中跟随鼠标指针的图像。图像通常是一个 [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) 元素,但也可以是 [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas) 或任何其他图像元素。 | `string \| Element` | - | +| offsetX | 水平偏移 | `number` | 0 | +| offsetY | 垂直偏移 | `number` | 0 | ### useDrop diff --git a/packages/hooks/src/useDynamicList/__tests__/index.spec.ts b/packages/hooks/src/useDynamicList/__tests__/index.spec.ts new file mode 100644 index 0000000000..00d54a0fc2 --- /dev/null +++ b/packages/hooks/src/useDynamicList/__tests__/index.spec.ts @@ -0,0 +1,203 @@ +import { act, renderHook } from '@testing-library/react'; +import { afterAll, afterEach, describe, expect, test, vi } from 'vitest'; +import useDynamicList from '../index'; + +describe('useDynamicList', () => { + const setUp = (props: any): any => renderHook(() => useDynamicList(props)); + const warnSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + afterEach(() => { + warnSpy.mockReset(); + }); + + afterAll(() => { + warnSpy.mockRestore(); + }); + + test('getKey should work', () => { + const hook = setUp([1, 2, 3]); + expect(hook.result.current.list[0]).toBe(1); + expect(hook.result.current.getKey(0)).toBe(0); + expect(hook.result.current.getKey(1)).toBe(1); + expect(hook.result.current.getKey(2)).toBe(2); + }); + + test('methods should work', () => { + const hook = setUp([ + { name: 'aaa', age: 18 }, + { name: 'bbb', age: 19 }, + { name: 'ccc', age: 20 }, + ]); + + expect(hook.result.current.list[0].age).toBe(18); + expect(hook.result.current.list[1].age).toBe(19); + expect(hook.result.current.list[2].age).toBe(20); + + expect(hook.result.current.getKey(0)).toBe(0); + expect(hook.result.current.getKey(1)).toBe(1); + expect(hook.result.current.getKey(2)).toBe(2); + + // unshift + act(() => { + hook.result.current.unshift({ name: 'ddd', age: 21 }); + }); + + expect(hook.result.current.list[0].name).toBe('ddd'); + expect(hook.result.current.getKey(0)).toBe(3); + + // push + act(() => { + hook.result.current.push({ name: 'ddd', age: 21 }); + }); + + expect(hook.result.current.list[4].name).toBe('ddd'); + expect(hook.result.current.getKey(0)).toBe(3); + expect(hook.result.current.getKey(4)).toBe(4); + + // insert + act(() => { + hook.result.current.insert(1, { name: 'eee', age: 22 }); + }); + expect(hook.result.current.list[1].name).toBe('eee'); + expect(hook.result.current.getKey(1)).toBe(5); + + // merge + act(() => { + hook.result.current.merge(0, [1, 2, 3, 4]); + }); + expect(hook.result.current.list[0]).toBe(1); + expect(hook.result.current.getKey(0)).toBe(6); + + // move + act(() => { + hook.result.current.move(0, 1); + }); + expect(hook.result.current.list[0]).toBe(2); + expect(hook.result.current.getKey(0)).toBe(7); + + // move without changes + act(() => { + hook.result.current.move(2, 2); + }); + expect(hook.result.current.list[0]).toBe(2); + expect(hook.result.current.getKey(0)).toBe(7); + + // shift + act(() => { + hook.result.current.shift(); + }); + expect(hook.result.current.list[0]).toBe(1); + expect(hook.result.current.getKey(0)).toBe(6); + expect(hook.result.current.list.length).toBe(9); + + // pop + act(() => { + hook.result.current.pop(); + }); + expect(hook.result.current.list.length).toBe(8); + + // replace + act(() => { + hook.result.current.replace(7, { value: 8 }); + }); + expect(hook.result.current.list[7].value).toBe(8); + + // remove + act(() => { + hook.result.current.remove(7); + }); + expect(hook.result.current.list.length).toBe(7); + + // batch remove + act(() => { + hook.result.current.batchRemove(1); + }); + expect(warnSpy).toHaveBeenCalledWith( + '`indexes` parameter of `batchRemove` function expected to be an array, but got "number".', + ); + act(() => { + hook.result.current.batchRemove([0, 1, 2]); + }); + expect(hook.result.current.list.length).toBe(4); + }); + + test('same items should have different keys', () => { + const hook = setUp([1, 1, 1, 1]); + expect(hook.result.current.getKey(0)).toBe(0); + expect(hook.result.current.getKey(1)).toBe(1); + expect(hook.result.current.getKey(2)).toBe(2); + expect(hook.result.current.getKey(3)).toBe(3); + + act(() => { + hook.result.current.push(1); + }); + + expect(hook.result.current.getKey(4)).toBe(4); + const testObj = {}; + + act(() => { + hook.result.current.push({}); + hook.result.current.push(testObj); + hook.result.current.push(testObj); + }); + + expect(hook.result.current.getKey(5)).toBe(5); + expect(hook.result.current.getKey(6)).toBe(6); + expect(hook.result.current.getKey(7)).toBe(7); + }); + + test('initialValue changes', () => { + const hook = renderHook(({ initialValue }) => useDynamicList(initialValue), { + initialProps: { + initialValue: [1], + }, + }); + expect(hook.result.current.list[0]).toBe(1); + expect(hook.result.current.getKey(0)).toBe(0); + + act(() => { + hook.result.current.resetList([2]); + }); + + expect(hook.result.current.list[0]).toBe(2); + expect(hook.result.current.getKey(0)).toBe(1); + + act(() => { + hook.result.current.resetList([3]); + }); + + expect(hook.result.current.list[0]).toBe(3); + expect(hook.result.current.getKey(0)).toBe(2); + }); + + test('sortList', () => { + const hook = setUp([1, 2, 3, 4]); + const formData = [ + { + name: 'my bro', + age: '23', + memo: "he's my bro", + }, + { + name: 'my sis', + age: '21', + memo: "she's my sis", + }, + null, + { + name: '新增行', + age: '25', + }, + ]; + + let sorted = hook.result.current.sortList(formData); + expect(sorted.length).toBe(3); + expect(sorted[0].name).toBe('my bro'); + + act(() => { + hook.result.current.move(3, 0); + }); + sorted = hook.result.current.sortList(formData); + expect(sorted[0].name).toBe('新增行'); + }); +}); diff --git a/packages/hooks/src/useDynamicList/__tests__/index.test.ts b/packages/hooks/src/useDynamicList/__tests__/index.test.ts deleted file mode 100644 index 7025d87091..0000000000 --- a/packages/hooks/src/useDynamicList/__tests__/index.test.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useDynamicList from '../index'; - -describe('useDynamicList', () => { - const setUp = (props: any): any => renderHook(() => useDynamicList(props)); - - it('getKey should work', () => { - const hook = setUp([1, 2, 3]); - expect(hook.result.current.list[0]).toEqual(1); - expect(hook.result.current.getKey(0)).toEqual(0); - expect(hook.result.current.getKey(1)).toEqual(1); - expect(hook.result.current.getKey(2)).toEqual(2); - }); - - it('methods should work', () => { - const hook = setUp([ - { name: 'aaa', age: 18 }, - { name: 'bbb', age: 19 }, - { name: 'ccc', age: 20 }, - ]); - - expect(hook.result.current.list[0].age).toEqual(18); - expect(hook.result.current.list[1].age).toEqual(19); - expect(hook.result.current.list[2].age).toEqual(20); - - expect(hook.result.current.getKey(0)).toEqual(0); - expect(hook.result.current.getKey(1)).toEqual(1); - expect(hook.result.current.getKey(2)).toEqual(2); - - // unshift - act(() => { - hook.result.current.unshift({ name: 'ddd', age: 21 }); - }); - - expect(hook.result.current.list[0].name).toEqual('ddd'); - expect(hook.result.current.getKey(0)).toEqual(3); - - // push - act(() => { - hook.result.current.push({ name: 'ddd', age: 21 }); - }); - - expect(hook.result.current.list[4].name).toEqual('ddd'); - expect(hook.result.current.getKey(0)).toEqual(3); - expect(hook.result.current.getKey(4)).toEqual(4); - - // insert - act(() => { - hook.result.current.insert(1, { name: 'eee', age: 22 }); - }); - expect(hook.result.current.list[1].name).toEqual('eee'); - expect(hook.result.current.getKey(1)).toEqual(5); - - // merge - act(() => { - hook.result.current.merge(0, [1, 2, 3, 4]); - }); - expect(hook.result.current.list[0]).toEqual(1); - expect(hook.result.current.getKey(0)).toEqual(6); - - // move - act(() => { - hook.result.current.move(0, 1); - }); - expect(hook.result.current.list[0]).toEqual(2); - expect(hook.result.current.getKey(0)).toEqual(7); - - // move without changes - act(() => { - hook.result.current.move(2, 2); - }); - expect(hook.result.current.list[0]).toEqual(2); - expect(hook.result.current.getKey(0)).toEqual(7); - - // shift - act(() => { - hook.result.current.shift(); - }); - expect(hook.result.current.list[0]).toEqual(1); - expect(hook.result.current.getKey(0)).toEqual(6); - expect(hook.result.current.list.length).toEqual(9); - - // pop - act(() => { - hook.result.current.pop(); - }); - expect(hook.result.current.list.length).toEqual(8); - - // replace - act(() => { - hook.result.current.replace(7, { value: 8 }); - }); - expect(hook.result.current.list[7].value).toEqual(8); - - // remove - act(() => { - hook.result.current.remove(7); - }); - expect(hook.result.current.list.length).toEqual(7); - }); - - it('same items should have different keys', () => { - const hook = setUp([1, 1, 1, 1]); - expect(hook.result.current.getKey(0)).toEqual(0); - expect(hook.result.current.getKey(1)).toEqual(1); - expect(hook.result.current.getKey(2)).toEqual(2); - expect(hook.result.current.getKey(3)).toEqual(3); - - act(() => { - hook.result.current.push(1); - }); - - expect(hook.result.current.getKey(4)).toEqual(4); - const testObj = {}; - - act(() => { - hook.result.current.push({}); - hook.result.current.push(testObj); - hook.result.current.push(testObj); - }); - - expect(hook.result.current.getKey(5)).toEqual(5); - expect(hook.result.current.getKey(6)).toEqual(6); - expect(hook.result.current.getKey(7)).toEqual(7); - }); - - it('initialValue changes', () => { - const hook = renderHook(({ initialValue }) => useDynamicList(initialValue), { - initialProps: { - initialValue: [1], - }, - }); - expect(hook.result.current.list[0]).toEqual(1); - expect(hook.result.current.getKey(0)).toEqual(0); - - act(() => { - hook.result.current.resetList([2]); - }); - - expect(hook.result.current.list[0]).toEqual(2); - expect(hook.result.current.getKey(0)).toEqual(1); - - act(() => { - hook.result.current.resetList([3]); - }); - - expect(hook.result.current.list[0]).toEqual(3); - expect(hook.result.current.getKey(0)).toEqual(2); - }); - - it('sortList', () => { - const hook = setUp([1, 2, 3, 4]); - const formData = [ - { - name: 'my bro', - age: '23', - memo: "he's my bro", - }, - { - name: 'my sis', - age: '21', - memo: "she's my sis", - }, - null, - { - name: '新增行', - age: '25', - }, - ]; - - let sorted = hook.result.current.sortList(formData); - expect(sorted.length).toEqual(3); - expect(sorted[0].name).toEqual('my bro'); - - act(() => { - hook.result.current.move(3, 0); - }); - sorted = hook.result.current.sortList(formData); - expect(sorted[0].name).toEqual('新增行'); - }); -}); diff --git a/packages/hooks/src/useDynamicList/demo/demo1.tsx b/packages/hooks/src/useDynamicList/demo/demo1.tsx index e7045a086c..0318872fe3 100644 --- a/packages/hooks/src/useDynamicList/demo/demo1.tsx +++ b/packages/hooks/src/useDynamicList/demo/demo1.tsx @@ -8,11 +8,11 @@ import { MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { useDynamicList } from 'ahooks'; -import { Input } from 'antd'; -import React from 'react'; +import { Button, Input, Space } from 'antd'; export default () => { - const { list, remove, getKey, insert, replace } = useDynamicList(['David', 'Jack']); + const { list, remove, batchRemove, getKey, insert, replace } = useDynamicList(['David', 'Jack']); + const listIndexes = list.map((item, index) => index); const Row = (index: number, item: any) => (
@@ -44,6 +44,23 @@ export default () => { <> {list.map((ele, index) => Row(index, ele))} + + + + +
{JSON.stringify([list])}
); diff --git a/packages/hooks/src/useDynamicList/demo/demo2.tsx b/packages/hooks/src/useDynamicList/demo/demo2.tsx index e7bf41c150..b9b06a36d7 100644 --- a/packages/hooks/src/useDynamicList/demo/demo2.tsx +++ b/packages/hooks/src/useDynamicList/demo/demo2.tsx @@ -9,7 +9,7 @@ import { MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { useDynamicList } from 'ahooks'; import { Button, Form, Input } from 'antd'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; const DynamicInputs = ({ value = [], diff --git a/packages/hooks/src/useDynamicList/demo/demo3.tsx b/packages/hooks/src/useDynamicList/demo/demo3.tsx index b5c319fab4..bf3976a88c 100644 --- a/packages/hooks/src/useDynamicList/demo/demo3.tsx +++ b/packages/hooks/src/useDynamicList/demo/demo3.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 注意 sortList 的使用,antd Form 获取的数据排序不对,通过 sortList 可以校准排序。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Form, Button, Input } from 'antd'; import { MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { useDynamicList } from 'ahooks'; diff --git a/packages/hooks/src/useDynamicList/demo/demo4.tsx b/packages/hooks/src/useDynamicList/demo/demo4.tsx index ef09146e67..6c762162d1 100644 --- a/packages/hooks/src/useDynamicList/demo/demo4.tsx +++ b/packages/hooks/src/useDynamicList/demo/demo4.tsx @@ -8,7 +8,7 @@ import { DragOutlined } from '@ant-design/icons'; import { Button, Form, Input, Table } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; import ReactDragListView from 'react-drag-listview'; import { useDynamicList } from 'ahooks'; @@ -75,6 +75,7 @@ export default () => { return (
+ {/* @ts-ignore - ReactDragListView types issue */} move(oldIndex, newIndex)} handleSelector={'span[aria-label="drag"]'} @@ -82,8 +83,9 @@ export default () => {
getKey(index).toString()} + rowKey={(r: Item, index?: number) => getKey(index || 0).toString()} pagination={false} + style={{ overflow: 'auto' }} /> diff --git a/packages/hooks/src/useDynamicList/index.ts b/packages/hooks/src/useDynamicList/index.ts index 1bcdd162cf..32d4987266 100644 --- a/packages/hooks/src/useDynamicList/index.ts +++ b/packages/hooks/src/useDynamicList/index.ts @@ -1,4 +1,5 @@ import { useCallback, useRef, useState } from 'react'; +import isDev from '../utils/isDev'; const useDynamicList = (initialList: T[] = []) => { const counterRef = useRef(-1); @@ -77,6 +78,37 @@ const useDynamicList = (initialList: T[] = []) => { }); }, []); + const batchRemove = useCallback((indexes: number[]) => { + if (!Array.isArray(indexes)) { + if (isDev) { + console.error( + `\`indexes\` parameter of \`batchRemove\` function expected to be an array, but got "${typeof indexes}".`, + ); + } + return; + } + if (!indexes.length) { + return; + } + + setList((prevList) => { + const newKeyList: number[] = []; + const newList = prevList.filter((item, index) => { + const shouldKeep = !indexes.includes(index); + + if (shouldKeep) { + newKeyList.push(getKey(index)); + } + + return shouldKeep; + }); + + keyList.current = newKeyList; + + return newList; + }); + }, []); + const move = useCallback((oldIndex: number, newIndex: number) => { if (oldIndex === newIndex) { return; @@ -150,6 +182,7 @@ const useDynamicList = (initialList: T[] = []) => { merge, replace, remove, + batchRemove, getKey, getIndex, move, diff --git a/packages/hooks/src/useEventEmitter/__tests__/index.test.ts b/packages/hooks/src/useEventEmitter/__tests__/index.spec.ts similarity index 69% rename from packages/hooks/src/useEventEmitter/__tests__/index.test.ts rename to packages/hooks/src/useEventEmitter/__tests__/index.spec.ts index fb4246f934..a6c35bded2 100644 --- a/packages/hooks/src/useEventEmitter/__tests__/index.test.ts +++ b/packages/hooks/src/useEventEmitter/__tests__/index.spec.ts @@ -1,9 +1,10 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; import useEventEmitter from '../index'; describe('useEventEmitter', () => { - const setUp = (): any => + const setUp = () => renderHook(() => { const event$ = useEventEmitter(); const [count, setCount] = useState(0); @@ -19,15 +20,15 @@ describe('useEventEmitter', () => { }; }); - it('emit and subscribe should work', () => { + test('emit and subscribe should work', () => { const hook = setUp(); act(() => { hook.result.current.event$.emit(1); }); - expect(hook.result.current.count).toEqual(12); + expect(hook.result.current.count).toBe(12); act(() => { hook.result.current.event$.emit(2); }); - expect(hook.result.current.count).toEqual(26); + expect(hook.result.current.count).toBe(26); }); }); diff --git a/packages/hooks/src/useEventEmitter/demo/demo1.tsx b/packages/hooks/src/useEventEmitter/demo/demo1.tsx index 75d9c2ac80..aadf732cf6 100644 --- a/packages/hooks/src/useEventEmitter/demo/demo1.tsx +++ b/packages/hooks/src/useEventEmitter/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 父组件创建了一个 `focus$` 事件,并且将它传递给了两个子组件。在 MessageBox 中调用 `focus$.emit` ,InputBox 组件就可以收到通知。 */ -import React, { useRef, FC } from 'react'; +import { useRef, type FC } from 'react'; import { useEventEmitter } from 'ahooks'; import { EventEmitter } from 'ahooks/lib/useEventEmitter'; @@ -31,9 +31,9 @@ const MessageBox: FC<{ const InputBox: FC<{ focus$: EventEmitter; }> = function (props) { - const inputRef = useRef(); + const inputRef = useRef(null); props.focus$.useSubscription(() => { - inputRef.current.focus(); + inputRef.current?.focus(); }); return ( diff --git a/packages/hooks/src/useEventEmitter/index.ts b/packages/hooks/src/useEventEmitter/index.ts index 0b6a801b88..d65058dbde 100644 --- a/packages/hooks/src/useEventEmitter/index.ts +++ b/packages/hooks/src/useEventEmitter/index.ts @@ -13,7 +13,7 @@ export class EventEmitter { useSubscription = (callback: Subscription) => { // eslint-disable-next-line react-hooks/rules-of-hooks - const callbackRef = useRef>(); + const callbackRef = useRef>(undefined); callbackRef.current = callback; // eslint-disable-next-line react-hooks/rules-of-hooks useEffect(() => { @@ -30,10 +30,12 @@ export class EventEmitter { }; } -export default function useEventEmitter() { - const ref = useRef>(); +function useEventEmitter() { + const ref = useRef>(undefined); if (!ref.current) { ref.current = new EventEmitter(); } return ref.current; } + +export default useEventEmitter; diff --git a/packages/hooks/src/useEventListener/__tests__/index.spec.ts b/packages/hooks/src/useEventListener/__tests__/index.spec.ts new file mode 100644 index 0000000000..1fa83d0191 --- /dev/null +++ b/packages/hooks/src/useEventListener/__tests__/index.spec.ts @@ -0,0 +1,105 @@ +import { renderHook } from '@testing-library/react'; +import { useRef } from 'react'; +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; +import useEventListener from '../index'; + +describe('useEventListener', () => { + let container: HTMLDivElement; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + }); + + test('test on click listener', async () => { + let state: number = 0; + const onClick = () => { + state++; + }; + const { rerender, unmount } = renderHook(() => + useEventListener('click', onClick, { target: () => container }), + ); + + document.body.click(); + expect(state).toBe(0); + rerender(); + container.click(); + expect(state).toBe(1); + unmount(); + document.body.click(); + expect(state).toBe(1); + }); + + test('test on event list listener', async () => { + let state: number = 0; + const onClick = () => { + state++; + }; + const onKeydown = () => { + state++; + }; + const { rerender, unmount } = renderHook( + () => ( + useEventListener('click', onClick, { target: () => container }), + useEventListener('keydown', onKeydown, { target: () => container }) + ), + ); + + document.body.click(); + document.body.dispatchEvent(new KeyboardEvent('keydown')); + expect(state).toBe(0); + rerender(); + container.click(); + container.dispatchEvent(new KeyboardEvent('keydown')); + expect(state).toBe(2); + unmount(); + document.body.click(); + document.body.dispatchEvent(new KeyboardEvent('keydown')); + expect(state).toBe(2); + }); + + test('test "enable" parameter', () => { + let state = 0; + let enable = true; + const onClick = () => state++; + const { rerender, unmount } = renderHook(() => + useEventListener('click', onClick, { target: () => container, enable }), + ); + + document.body.click(); + expect(state).toBe(0); + container.click(); + expect(state).toBe(1); + + enable = false; + rerender(); + container.click(); + expect(state).toBe(1); + unmount(); + }); + + // Type regression guard: this call should type-check when event generic is explicit + // and `target` is a ref. Runtime assertion only verifies listener still works. + test('should support ref target with explicit event generic', () => { + let state = 0; + const onScroll = () => { + state++; + }; + + const { unmount } = renderHook(() => { + const target = useRef(container); + useEventListener<'scroll'>('scroll', onScroll, { target }); + }); + + container.dispatchEvent(new Event('scroll')); + expect(state).toBe(1); + + unmount(); + container.dispatchEvent(new Event('scroll')); + expect(state).toBe(1); + }); +}); diff --git a/packages/hooks/src/useEventListener/__tests__/index.test.ts b/packages/hooks/src/useEventListener/__tests__/index.test.ts deleted file mode 100644 index 61017a432d..0000000000 --- a/packages/hooks/src/useEventListener/__tests__/index.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useEventListener from '../index'; - -describe('useEventListener', () => { - let container: HTMLDivElement; - - beforeEach(() => { - container = document.createElement('div'); - document.body.appendChild(container); - }); - - afterEach(() => { - document.body.removeChild(container); - }); - - it('test on click listener', async () => { - let state: number = 0; - const onClick = () => { - state++; - }; - const { rerender, unmount } = renderHook(() => - useEventListener('click', onClick, { target: () => container }), - ); - - document.body.click(); - expect(state).toEqual(0); - rerender(); - container.click(); - expect(state).toEqual(1); - unmount(); - document.body.click(); - expect(state).toEqual(1); - }); -}); diff --git a/packages/hooks/src/useEventListener/demo/demo1.tsx b/packages/hooks/src/useEventListener/demo/demo1.tsx index a404b56337..d2c75c557c 100644 --- a/packages/hooks/src/useEventListener/demo/demo1.tsx +++ b/packages/hooks/src/useEventListener/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 点击按钮查看效果。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useEventListener } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useEventListener/demo/demo2.tsx b/packages/hooks/src/useEventListener/demo/demo2.tsx index a5944d4bed..d0aefec8c7 100644 --- a/packages/hooks/src/useEventListener/demo/demo2.tsx +++ b/packages/hooks/src/useEventListener/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 按下键盘查看效果。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useEventListener } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useEventListener/demo/demo3.tsx b/packages/hooks/src/useEventListener/demo/demo3.tsx new file mode 100644 index 0000000000..e02a7f7f7f --- /dev/null +++ b/packages/hooks/src/useEventListener/demo/demo3.tsx @@ -0,0 +1,29 @@ +/** + * title: Listen to multiple events. + * desc: Mouse hover or over the button to preview. + * + * title.zh-CN: 监听多个事件 + * desc.zh-CN: 鼠标移入移出按钮查看效果。 + */ + +import { useRef, useState } from 'react'; +import { useEventListener } from 'ahooks'; + +export default () => { + const ref = useRef(null); + const [value, setValue] = useState(''); + + useEventListener( + ['mouseenter', 'mouseleave'], + (ev) => { + setValue(ev.type); + }, + { target: ref }, + ); + + return ( + + ); +}; diff --git a/packages/hooks/src/useEventListener/index.en-US.md b/packages/hooks/src/useEventListener/index.en-US.md index 2e89dd2404..04823a929a 100644 --- a/packages/hooks/src/useEventListener/index.en-US.md +++ b/packages/hooks/src/useEventListener/index.en-US.md @@ -17,6 +17,10 @@ Use addEventListener elegant by Hook. +### Listen for multiple events + + + ## API ```typescript @@ -29,11 +33,11 @@ useEventListener( ### Property -| Property | Description | type | default | -| --------- | ---------------------- | --------------------- | ------- | -| eventName | Event name | `string` | - | -| handler | Callback function | `(ev: Event) => void` | - | -| options | More options(optional) | `Options` | - | +| Property | Description | type | default | +| --------- | ---------------------- | ---------------------- | ------- | +| eventName | Event name | `string` \| `string[]` | - | +| handler | Callback function | `(ev: Event) => void` | - | +| options | More options(optional) | `Options` | - | ### Options @@ -43,3 +47,4 @@ useEventListener( | capture | Optional, a Boolean indicating that events of this type will be dispatched to the registered listener before being dispatched to any EventTarget beneath it in the DOM tree. | `boolean` | `false` | | once | Optional, A Boolean indicating that the listener should be invoked at most once after being added. If true, the listener would be automatically removed when invoked. | `boolean` | `false` | | passive | Optional, A Boolean which, if true, indicates that the function specified by listener will never call preventDefault(). If a passive listener does call preventDefault(), the user agent will do nothing other than generate a console warning. | `boolean` | `false` | +| enable | Optional, Whether to enable listening. | `boolean` | `true` | diff --git a/packages/hooks/src/useEventListener/index.ts b/packages/hooks/src/useEventListener/index.ts index 12a8eb60b1..d62e46f2cc 100644 --- a/packages/hooks/src/useEventListener/index.ts +++ b/packages/hooks/src/useEventListener/index.ts @@ -7,11 +7,14 @@ type noop = (...p: any) => void; export type Target = BasicTarget; -type Options = { - target?: T; +type TargetType = HTMLElement | Element | Window | Document; + +type Options = { + target?: BasicTarget; capture?: boolean; once?: boolean; passive?: boolean; + enable?: boolean; }; function useEventListener( @@ -34,13 +37,24 @@ function useEventListener( handler: (ev: WindowEventMap[K]) => void, options?: Options, ): void; -function useEventListener(eventName: string, handler: noop, options: Options): void; +function useEventListener( + eventName: string | string[], + handler: (event: Event) => void, + options?: Options, +): void; +function useEventListener(eventName: string | string[], handler: noop, options: Options): void; + +function useEventListener(eventName: string | string[], handler: noop, options: Options = {}) { + const { enable = true } = options; -function useEventListener(eventName: string, handler: noop, options: Options = {}) { const handlerRef = useLatest(handler); useEffectWithTarget( () => { + if (!enable) { + return; + } + const targetElement = getTargetElement(options.target, window); if (!targetElement?.addEventListener) { return; @@ -50,19 +64,25 @@ function useEventListener(eventName: string, handler: noop, options: Options = { return handlerRef.current(event); }; - targetElement.addEventListener(eventName, eventListener, { - capture: options.capture, - once: options.once, - passive: options.passive, + const eventNameArray = Array.isArray(eventName) ? eventName : [eventName]; + + eventNameArray.forEach((event) => { + targetElement.addEventListener(event, eventListener, { + capture: options.capture, + once: options.once, + passive: options.passive, + }); }); return () => { - targetElement.removeEventListener(eventName, eventListener, { - capture: options.capture, + eventNameArray.forEach((event) => { + targetElement.removeEventListener(event, eventListener, { + capture: options.capture, + }); }); }; }, - [eventName, options.capture, options.once, options.passive], + [eventName, options.capture, options.once, options.passive, enable], options.target, ); } diff --git a/packages/hooks/src/useEventListener/index.zh-CN.md b/packages/hooks/src/useEventListener/index.zh-CN.md index 35af05bcce..05506c56b1 100644 --- a/packages/hooks/src/useEventListener/index.zh-CN.md +++ b/packages/hooks/src/useEventListener/index.zh-CN.md @@ -17,6 +17,10 @@ nav: +### 监听多个事件 + + + ## API ```typescript @@ -29,11 +33,11 @@ useEventListener( ### Params -| 参数 | 说明 | 类型 | 默认值 | -| --------- | ---------- | --------------------- | ------ | -| eventName | 事件名称 | `string` | - | -| handler | 处理函数 | `(ev: Event) => void` | - | -| options | 设置(可选) | `Options` | - | +| 参数 | 说明 | 类型 | 默认值 | +| --------- | ---------- | ---------------------- | ------ | +| eventName | 事件名称 | `string` \| `string[]` | - | +| handler | 处理函数 | `(ev: Event) => void` | - | +| options | 设置(可选) | `Options` | - | ### Options @@ -43,3 +47,4 @@ useEventListener( | capture | 可选项,listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。 | `boolean` | `false` | | once | 可选项,listener 在添加之后最多只调用一次。如果是 true,listener 会在其被调用之后自动移除。 | `boolean` | `false` | | passive | 可选项,设置为 true 时,表示 listener 永远不会调用 preventDefault() 。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。 | `boolean` | `false` | +| enable | 可选项,是否开启监听。 | `boolean` | `true` | diff --git a/packages/hooks/src/useEventTarget/__tests__/index.test.ts b/packages/hooks/src/useEventTarget/__tests__/index.spec.ts similarity index 55% rename from packages/hooks/src/useEventTarget/__tests__/index.test.ts rename to packages/hooks/src/useEventTarget/__tests__/index.spec.ts index 86ffcd381e..a0176b2e5a 100644 --- a/packages/hooks/src/useEventTarget/__tests__/index.test.ts +++ b/packages/hooks/src/useEventTarget/__tests__/index.spec.ts @@ -1,53 +1,54 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useEventTarget from '../index'; describe('useEventTarget', () => { - it('should work without initial value', async () => { + test('should work without initial value', async () => { const hook = renderHook(() => useEventTarget()); - expect(hook.result.current[0]).toEqual(undefined); + expect(hook.result.current[0]).toBeUndefined(); act(() => { hook.result.current[1].onChange({ target: { value: 'abc' } }); }); - expect(hook.result.current[0]).toEqual('abc'); + expect(hook.result.current[0]).toBe('abc'); }); - it('should work with initial value', async () => { + test('should work with initial value', async () => { const hook = renderHook(() => useEventTarget({ initialValue: 'abc' })); - expect(hook.result.current[0]).toEqual('abc'); + expect(hook.result.current[0]).toBe('abc'); act(() => { hook.result.current[1].onChange({ target: { value: 'def' } }); }); - expect(hook.result.current[0]).toEqual('def'); + expect(hook.result.current[0]).toBe('def'); act(() => { hook.result.current[1].reset(); }); - expect(hook.result.current[0]).toEqual('abc'); + expect(hook.result.current[0]).toBe('abc'); }); - it('should work with transformer', () => { + test('should work with transformer', () => { const hook = renderHook(() => useEventTarget({ transformer: (str: string) => str.toUpperCase(), }), ); - expect(hook.result.current[0]).toEqual(undefined); + expect(hook.result.current[0]).toBeUndefined(); act(() => { hook.result.current[1].onChange({ target: { value: 'def' } }); }); - expect(hook.result.current[0]).toEqual('DEF'); + expect(hook.result.current[0]).toBe('DEF'); }); - it('should be able to transform to any type', () => { + test('should be able to transform to any type', () => { const hook = renderHook(() => useEventTarget({ transformer: (num: number) => String(num), }), ); - expect(hook.result.current[0]).toEqual(undefined); + expect(hook.result.current[0]).toBeUndefined(); act(() => { hook.result.current[1].onChange({ target: { value: 123 } }); }); - expect(hook.result.current[0]).toEqual('123'); + expect(hook.result.current[0]).toBe('123'); }); }); diff --git a/packages/hooks/src/useEventTarget/demo/demo1.tsx b/packages/hooks/src/useEventTarget/demo/demo1.tsx index 38fb809162..1804df85cd 100644 --- a/packages/hooks/src/useEventTarget/demo/demo1.tsx +++ b/packages/hooks/src/useEventTarget/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 受控的 input,支持 reset。 */ -import React from 'react'; import { useEventTarget } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useEventTarget/demo/demo2.tsx b/packages/hooks/src/useEventTarget/demo/demo2.tsx index e42032dde8..5287cf75a0 100644 --- a/packages/hooks/src/useEventTarget/demo/demo2.tsx +++ b/packages/hooks/src/useEventTarget/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 只能输入数字的 input 组件 */ -import React from 'react'; import { useEventTarget } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useExternal/__tests__/index.test.ts b/packages/hooks/src/useExternal/__tests__/index.spec.ts similarity index 69% rename from packages/hooks/src/useExternal/__tests__/index.test.ts rename to packages/hooks/src/useExternal/__tests__/index.spec.ts index c2413706e5..17d314428c 100644 --- a/packages/hooks/src/useExternal/__tests__/index.test.ts +++ b/packages/hooks/src/useExternal/__tests__/index.spec.ts @@ -1,6 +1,6 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useExternal, { Options } from '../index'; -import { fireEvent } from '@testing-library/react'; +import { act, fireEvent, renderHook } from '@testing-library/react'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import useExternal, { type Options } from '../index'; const setup = (path: string, options?: Options) => renderHook(() => useExternal(path, options)); @@ -10,7 +10,7 @@ describe('useExternal', () => { document.head.innerHTML = ''; }); - it('should load a script', () => { + test('should load a script', () => { const path = 'https://ahooks.js.org/useExternal/test-external-script.js'; const { result } = setup(path, { js: { @@ -25,7 +25,7 @@ describe('useExternal', () => { expect(result.current).toBe('ready'); }); - it('should load a css', () => { + test('should load a css', () => { const path = 'https://ahooks.js.org/useExternal/bootstrap-badge.css'; const { result } = setup(path, { css: { @@ -40,12 +40,12 @@ describe('useExternal', () => { expect(result.current).toBe('ready'); }); - it('status should be unset without path', () => { + test('status should be unset without path', () => { const { result } = setup(''); expect(result.current).toBe('unset'); }); - it('status should be error when load failed', async () => { + test('status should be error when load failed', async () => { const { result } = setup('xx.js'); const script = document.querySelector('script') as HTMLScriptElement; act(() => { @@ -54,13 +54,13 @@ describe('useExternal', () => { expect(result.current).toBe('error'); }); - it('should throw error when provide unsupported type', () => { - const mockSpy = jest.spyOn(console, 'error').mockImplementationOnce(() => {}); + test('should throw error when provide unsupported type', () => { + const mockSpy = vi.spyOn(console, 'error').mockImplementationOnce(() => {}); setup('ahooks.ts'); expect(mockSpy).toBeCalled(); }); - it('should not load again when the js exists', () => { + test('should not load again when the js exists', () => { const path = 'a.js'; const hook1 = setup(path); const script = document.querySelector('script') as HTMLScriptElement; @@ -73,7 +73,7 @@ describe('useExternal', () => { expect(hook2.result.current).toBe('ready'); }); - it('should not load again when the css exists', () => { + test('should not load again when the css exists', () => { const path = 'a.css'; const hook1 = setup(path); const link = document.querySelector('link') as HTMLLinkElement; @@ -86,7 +86,7 @@ describe('useExternal', () => { expect(hook2.result.current).toBe('ready'); }); - it('should remove when not use', () => { + test('should remove when not use', () => { const { unmount } = setup('b.js'); const script = document.querySelector('script') as HTMLScriptElement; act(() => { @@ -95,8 +95,20 @@ describe('useExternal', () => { unmount(); expect(document.querySelector('script')).toBeNull(); }); + test('should not remove when keepWhenUnused is true', () => { + // https://github.com/alibaba/hooks/discussions/2163 + const { result, unmount } = setup('b.js', { + keepWhenUnused: true, + }); + const script = document.querySelector('script') as HTMLScriptElement; + act(() => { + fireEvent.load(script); + }); + unmount(); + expect(result.current).toBe('ready'); + }); - it('css preload should work in IE Edge', () => { + test('css preload should work in IE Edge', () => { Object.defineProperty(HTMLLinkElement.prototype, 'hideFocus', { value: true, }); diff --git a/packages/hooks/src/useExternal/demo/demo1.tsx b/packages/hooks/src/useExternal/demo/demo1.tsx index b12f8dda5b..54e82935f5 100644 --- a/packages/hooks/src/useExternal/demo/demo1.tsx +++ b/packages/hooks/src/useExternal/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 加载 js 文件,例如引入 [test-external-script.js](/useExternal/test-external-script.js) */ -import React from 'react'; import { useExternal } from 'ahooks'; export default () => { @@ -22,7 +21,7 @@ export default () => { Status: {status}

- Response: {status === 'ready' ? window.TEST_SCRIPT?.start() : '-'} + Response: {status === 'ready' ? (window as any).TEST_SCRIPT?.start() : '-'}

); diff --git a/packages/hooks/src/useExternal/demo/demo2.tsx b/packages/hooks/src/useExternal/demo/demo2.tsx index 785179ef71..e5cf3991c3 100644 --- a/packages/hooks/src/useExternal/demo/demo2.tsx +++ b/packages/hooks/src/useExternal/demo/demo2.tsx @@ -7,7 +7,7 @@ */ import { useExternal } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [path, setPath] = useState('/useExternal/bootstrap-badge.css'); @@ -19,7 +19,7 @@ export default () => {

Status: {status}

-
+
Primary Secondary Success diff --git a/packages/hooks/src/useExternal/demo/demo3.tsx b/packages/hooks/src/useExternal/demo/demo3.tsx index fe3ec83b5a..1d1c6fc2ba 100644 --- a/packages/hooks/src/useExternal/demo/demo3.tsx +++ b/packages/hooks/src/useExternal/demo/demo3.tsx @@ -7,7 +7,7 @@ */ import { useExternal } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [path, setPath] = useState(''); diff --git a/packages/hooks/src/useExternal/index.en-US.md b/packages/hooks/src/useExternal/index.en-US.md index 70761a0018..dde8dc4e21 100644 --- a/packages/hooks/src/useExternal/index.en-US.md +++ b/packages/hooks/src/useExternal/index.en-US.md @@ -37,8 +37,9 @@ const status = useExternal(path: string, options?: Options); ### Options -| Params | Description | Type | Default | -| ------ | -------------------------------------------------------------------------------------------------------------------- | ------------------- | ------- | -| type | The type of extarnal resources which need to load, support `js`/`css`, if no type, it will deduced according to path | `string` | - | -| js | Attributes supported by `script` | `HTMLScriptElement` | - | -| css | Attributes supported by `link` | `HTMLStyleElement` | - | +| Params | Description | Type | Default | +| -------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------- | ------- | +| type | The type of external resources which need to load, support `js`/`css`, if no type, it will deduced according to path | `string` | - | +| js | Attributes supported by `script` | `HTMLScriptElement` | - | +| css | Attributes supported by `link` | `HTMLStyleElement` | - | +| keepWhenUnused | Allow resources to remain after they have lost their references | `boolean` | `false` | diff --git a/packages/hooks/src/useExternal/index.ts b/packages/hooks/src/useExternal/index.ts index e45420a49d..e12a1bbdd9 100644 --- a/packages/hooks/src/useExternal/index.ts +++ b/packages/hooks/src/useExternal/index.ts @@ -1,10 +1,25 @@ import { useEffect, useRef, useState } from 'react'; -export interface Options { - type?: 'js' | 'css'; +type JsOptions = { + type: 'js'; js?: Partial; + keepWhenUnused?: boolean; +}; + +type CssOptions = { + type: 'css'; css?: Partial; -} + keepWhenUnused?: boolean; +}; + +type DefaultOptions = { + type?: never; + js?: Partial; + css?: Partial; + keepWhenUnused?: boolean; +}; + +export type Options = JsOptions | CssOptions | DefaultOptions; // {[path]: count} // remove external when no used @@ -12,12 +27,14 @@ const EXTERNAL_USED_COUNT: Record = {}; export type Status = 'unset' | 'loading' | 'ready' | 'error'; -interface loadResult { +interface LoadResult { ref: Element; status: Status; } -const loadScript = (path: string, props = {}): loadResult => { +type LoadExternal = (path: string, props?: Partial) => LoadResult; + +const loadScript: LoadExternal = (path, props = {}) => { const script = document.querySelector(`script[src="${path}"]`); if (!script) { @@ -25,7 +42,7 @@ const loadScript = (path: string, props = {}): loadResult => { newScript.src = path; Object.keys(props).forEach((key) => { - newScript[key] = props[key]; + (newScript as any)[key] = (props as any)[key]; }); newScript.setAttribute('data-status', 'loading'); @@ -43,7 +60,7 @@ const loadScript = (path: string, props = {}): loadResult => { }; }; -const loadCss = (path: string, props = {}): loadResult => { +const loadCss: LoadExternal = (path, props = {}) => { const css = document.querySelector(`link[href="${path}"]`); if (!css) { const newCss = document.createElement('link'); @@ -51,7 +68,7 @@ const loadCss = (path: string, props = {}): loadResult => { newCss.rel = 'stylesheet'; newCss.href = path; Object.keys(props).forEach((key) => { - newCss[key] = props[key]; + (newCss as any)[key] = (props as any)[key]; }); // IE9+ const isLegacyIECss = 'hideFocus' in newCss; @@ -78,7 +95,7 @@ const loadCss = (path: string, props = {}): loadResult => { const useExternal = (path?: string, options?: Options) => { const [status, setStatus] = useState(path ? 'loading' : 'unset'); - const ref = useRef(); + const ref = useRef(undefined); useEffect(() => { if (!path) { @@ -126,7 +143,7 @@ const useExternal = (path?: string, options?: Options) => { EXTERNAL_USED_COUNT[path] -= 1; - if (EXTERNAL_USED_COUNT[path] === 0) { + if (EXTERNAL_USED_COUNT[path] === 0 && !options?.keepWhenUnused) { ref.current?.remove(); } diff --git a/packages/hooks/src/useExternal/index.zh-CN.md b/packages/hooks/src/useExternal/index.zh-CN.md index 84d37ed062..55156c4c95 100644 --- a/packages/hooks/src/useExternal/index.zh-CN.md +++ b/packages/hooks/src/useExternal/index.zh-CN.md @@ -37,8 +37,9 @@ const status = useExternal(path: string, options?: Options); ### Options -| 参数 | 说明 | 类型 | 默认值 | -| ---- | ----------------------------------------------------------------- | ------------------- | ------ | -| type | 需引入外部资源的类型,支持 `js`/`css`,如果不传,则根据 path 推导 | `string` | - | -| js | `script` 标签支持的属性 | `HTMLScriptElement` | - | -| css | `link` 标签支持的属性 | `HTMLStyleElement` | - | +| 参数 | 说明 | 类型 | 默认值 | +| -------------- | ----------------------------------------------------------------- | ------------------- | ------- | +| type | 需引入外部资源的类型,支持 `js`/`css`,如果不传,则根据 path 推导 | `string` | - | +| js | `script` 标签支持的属性 | `HTMLScriptElement` | - | +| css | `link` 标签支持的属性 | `HTMLStyleElement` | - | +| keepWhenUnused | 在不持有资源的引用后,仍然保留资源 | `boolean` | `false` | diff --git a/packages/hooks/src/useFavicon/__tests__/index.spec.tsx b/packages/hooks/src/useFavicon/__tests__/index.spec.tsx new file mode 100644 index 0000000000..f991858560 --- /dev/null +++ b/packages/hooks/src/useFavicon/__tests__/index.spec.tsx @@ -0,0 +1,30 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import useFavicon from '../index'; + +describe('useFavicon', () => { + test('should set the favicon', () => { + expect(document.querySelector("link[rel*='icon']")).toBeNull(); + renderHook(() => useFavicon('favicon.ico')); + expect(document.querySelector("link[rel*='icon']")).not.toBeNull(); + }); + + test('should support svg/png/ico/gif', () => { + const { rerender } = renderHook((url: string) => useFavicon(url)); + const suffixes = ['svg', 'png', 'ico', 'gif'] as const; + const imgTypeMap = { + svg: 'image/svg+xml', + ico: 'image/x-icon', + gif: 'image/gif', + png: 'image/png', + } as const; + suffixes.forEach((suffix) => { + const url = `favicon.${suffix}`; + rerender(url); + const link = document.querySelector("link[rel*='icon']") as HTMLLinkElement; + expect(link.getAttribute('type')).toBe(imgTypeMap[suffix]); + expect(link.getAttribute('href')).toBe(url); + expect(link.getAttribute('rel')).toBe('shortcut icon'); + }); + }); +}); diff --git a/packages/hooks/src/useFavicon/__tests__/index.test.tsx b/packages/hooks/src/useFavicon/__tests__/index.test.tsx deleted file mode 100644 index 5ffd1b343d..0000000000 --- a/packages/hooks/src/useFavicon/__tests__/index.test.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React, { useState } from 'react'; -import Enzyme, { mount } from 'enzyme'; -import Adapter from 'enzyme-adapter-react-16'; -import useFavicon from '../index'; - -Enzyme.configure({ adapter: new Adapter() }); - -// 直接导入demo1.tsx作为测试会报错(import { useFavicon } from 'ahooks') -const DEFAULT_FAVICON_URL = 'https://ahooks.js.org/simple-logo.svg'; -const GOOGLE_FAVICON_URL = 'https://www.google.com/favicon.ico'; - -const App: React.FC = () => { - const [url, setUrl] = useState(DEFAULT_FAVICON_URL); - useFavicon(url); - return ( - <> -

- 当前Favicon: {url} -

- - - - ); -}; - -describe.only('useFavicon Hook', () => { - it('should toggle favicon when URL changed', () => { - const wrapper = mount(); - const currentFaviconURL = wrapper.find('span').at(0); - const toggleToGoogleBtn = wrapper.find('button').at(0); - const toggleToAHooksBtn = wrapper.find('button').at(1); - expect(currentFaviconURL.text()).toBe(DEFAULT_FAVICON_URL); - toggleToGoogleBtn.simulate('click'); - expect(currentFaviconURL.text()).toBe(GOOGLE_FAVICON_URL); - toggleToAHooksBtn.simulate('click'); - expect(currentFaviconURL.text()).toBe(DEFAULT_FAVICON_URL); - }); -}); diff --git a/packages/hooks/src/useFavicon/demo/demo1.tsx b/packages/hooks/src/useFavicon/demo/demo1.tsx index 7f9a4c2705..19f56e8e2c 100644 --- a/packages/hooks/src/useFavicon/demo/demo1.tsx +++ b/packages/hooks/src/useFavicon/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 设置 favicon */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useFavicon } from 'ahooks'; export const DEFAULT_FAVICON_URL = 'https://ahooks.js.org/simple-logo.svg'; diff --git a/packages/hooks/src/useFavicon/index.en-US.md b/packages/hooks/src/useFavicon/index.en-US.md index afc8bf62c3..29a4880a2f 100644 --- a/packages/hooks/src/useFavicon/index.en-US.md +++ b/packages/hooks/src/useFavicon/index.en-US.md @@ -24,3 +24,13 @@ useFavicon(href: string); | Params | Description | Type | Default | | ------ | -------------------------------------------- | -------- | ------- | | href | favicon URL, support `svg`/`png`/`ico`/`gif` | `string` | - | + +## FAQ + +### It doesn't work in Safari? + +Safari cannot set the favicon dynamically. + +> Apple intentionally do not want the ability to script favicons. See https://bugs.webkit.org/show_bug.cgi?id=95979#c2 + +Related issues: [#2126](https://github.com/alibaba/hooks/issues/2126) diff --git a/packages/hooks/src/useFavicon/index.ts b/packages/hooks/src/useFavicon/index.ts index 3c923ea860..0dbde850c8 100644 --- a/packages/hooks/src/useFavicon/index.ts +++ b/packages/hooks/src/useFavicon/index.ts @@ -11,13 +11,17 @@ type ImgTypes = keyof typeof ImgTypeMap; const useFavicon = (href: string) => { useEffect(() => { - if (!href) return; + if (!href) { + return; + } const cutUrl = href.split('.'); + const imgSuffix = cutUrl[cutUrl.length - 1].toLocaleUpperCase() as ImgTypes; - const link: HTMLLinkElement = - document.querySelector("link[rel*='icon']") || document.createElement('link'); + const link = + document.querySelector("link[rel*='icon']") || + document.createElement('link'); link.type = ImgTypeMap[imgSuffix]; link.href = href; diff --git a/packages/hooks/src/useFavicon/index.zh-CN.md b/packages/hooks/src/useFavicon/index.zh-CN.md index 3be6e6a903..43d18963e5 100644 --- a/packages/hooks/src/useFavicon/index.zh-CN.md +++ b/packages/hooks/src/useFavicon/index.zh-CN.md @@ -24,3 +24,13 @@ useFavicon(href: string); | 参数 | 说明 | 类型 | 默认值 | | ---- | ----------------------------------------------------- | -------- | ------ | | href | favicon 地址, 支持 `svg`/`png`/`ico`/`gif` 后缀的图片 | `string` | - | + +## FAQ + +### 在 Safari 中不工作? + +Safari 无法动态设置 favicon。 + +> Apple intentionally do not want the ability to script favicons. See https://bugs.webkit.org/show_bug.cgi?id=95979#c2 + +相关 issue:[#2126](https://github.com/alibaba/hooks/issues/2126) diff --git a/packages/hooks/src/useFocusWithin/__tests__/index.test.tsx b/packages/hooks/src/useFocusWithin/__tests__/index.spec.tsx similarity index 51% rename from packages/hooks/src/useFocusWithin/__tests__/index.test.tsx rename to packages/hooks/src/useFocusWithin/__tests__/index.spec.tsx index 28d2dbe527..fbe241fdfc 100644 --- a/packages/hooks/src/useFocusWithin/__tests__/index.test.tsx +++ b/packages/hooks/src/useFocusWithin/__tests__/index.spec.tsx @@ -1,6 +1,7 @@ -import React, { useRef } from 'react'; -import useFocusWithin, { Options } from '../index'; -import { render, fireEvent } from '@testing-library/react'; +import { cleanup, fireEvent, render } from '@testing-library/react'; +import { useRef } from 'react'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import useFocusWithin, { type Options } from '../index'; const setup = (options?: Options) => { const TestComponent = () => { @@ -25,22 +26,26 @@ const setup = (options?: Options) => { }; describe('useFocusWithin', () => { - it('should call onFocus/onBlur', () => { - const onFocus = jest.fn(); - const onBlur = jest.fn(); + beforeEach(() => { + cleanup(); + vi.clearAllMocks(); + }); + test('should call onFocus/onBlur', () => { + const onFocus = vi.fn(); + const onBlur = vi.fn(); const result = setup({ onFocus, onBlur }); - fireEvent.focusIn(result.getByLabelText('First Name')); + fireEvent.focusIn(result.getAllByLabelText('First Name')[0]); expect(onFocus).toBeCalled(); - fireEvent.focusOut(result.getByLabelText('First Name')); + fireEvent.focusOut(result.getAllByLabelText('First Name')[0]); expect(onBlur).toBeCalled(); }); - it('should call onChange', () => { - const onChange = jest.fn(); + test('should call onChange', () => { + const onChange = vi.fn(); const result = setup({ onChange }); - fireEvent.focusIn(result.getByLabelText('First Name')); + fireEvent.focusIn(result.getAllByLabelText('First Name')[0]); expect(onChange).toBeCalledWith(true); - fireEvent.focusOut(result.getByLabelText('First Name')); + fireEvent.focusOut(result.getAllByLabelText('First Name')[0]); expect(onChange).toHaveBeenLastCalledWith(false); }); }); diff --git a/packages/hooks/src/useFocusWithin/demo/demo1.tsx b/packages/hooks/src/useFocusWithin/demo/demo1.tsx index 5482cdcb6d..c6456041b5 100644 --- a/packages/hooks/src/useFocusWithin/demo/demo1.tsx +++ b/packages/hooks/src/useFocusWithin/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 使用 ref 设置需要监听的区域。可以通过鼠标点击外部区域,或者使用键盘的 `tab` 等按键来切换焦点。 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useFocusWithin } from 'ahooks'; import { message } from 'antd'; diff --git a/packages/hooks/src/useFocusWithin/demo/demo2.tsx b/packages/hooks/src/useFocusWithin/demo/demo2.tsx index e1dfe61a9a..069c75059b 100644 --- a/packages/hooks/src/useFocusWithin/demo/demo2.tsx +++ b/packages/hooks/src/useFocusWithin/demo/demo2.tsx @@ -7,7 +7,6 @@ */ import { useFocusWithin } from 'ahooks'; -import React from 'react'; export default () => { const isFocusWithin = useFocusWithin(() => document.getElementById('focus-area')); diff --git a/packages/hooks/src/useFullscreen/__tests__/index.spec.ts b/packages/hooks/src/useFullscreen/__tests__/index.spec.ts new file mode 100644 index 0000000000..e9726fe01b --- /dev/null +++ b/packages/hooks/src/useFullscreen/__tests__/index.spec.ts @@ -0,0 +1,279 @@ +import { act, renderHook } from '@testing-library/react'; +import screenfull from 'screenfull'; +import { afterAll, afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import type { BasicTarget } from '../../utils/domTarget'; +import useFullscreen, { type Options } from '../index'; + +// Mock screenfull +vi.mock('screenfull', () => ({ + default: { + isEnabled: true, + element: null, + request: vi.fn(), + exit: vi.fn(), + on: vi.fn(), + off: vi.fn(), + }, +})); + +const mockScreenfull = screenfull as any; + +let globalHook: any; +let targetEl: any; +let changeCallback: any; + +const setup = (target: BasicTarget, options?: Options) => { + globalHook = renderHook(() => useFullscreen(target, options)); + return globalHook; +}; + +describe('useFullscreen', () => { + beforeEach(() => { + targetEl = document.createElement('div'); + document.body.appendChild(targetEl); + + // Reset screenfull mocks + mockScreenfull.element = null; + mockScreenfull.on.mockImplementation((event: string, callback: any) => { + if (event === 'change') { + changeCallback = callback; + } + }); + mockScreenfull.off.mockImplementation(() => {}); + mockScreenfull.request.mockImplementation((el: any) => { + mockScreenfull.element = el; + return Promise.resolve(); + }); + mockScreenfull.exit.mockImplementation(() => { + mockScreenfull.element = null; + return Promise.resolve(); + }); + + vi.clearAllMocks(); + }); + + afterEach(() => { + document.body.removeChild(targetEl); + globalHook?.unmount(); + changeCallback = null; + }); + + afterAll(() => { + vi.resetAllMocks(); + }); + + test('enterFullscreen/exitFullscreen should be work', () => { + const { result } = setup(targetEl); + const { enterFullscreen, exitFullscreen } = result.current[1]; + + enterFullscreen(); + expect(mockScreenfull.request).toBeCalledWith(targetEl); + + act(() => { + if (changeCallback) changeCallback(); + }); + expect(result.current[0]).toBe(true); + + exitFullscreen(); + expect(mockScreenfull.exit).toBeCalled(); + + act(() => { + if (changeCallback) changeCallback(); + }); + expect(result.current[0]).toBe(false); + }); + + test('toggleFullscreen should be work', () => { + const { result } = setup(targetEl); + const { toggleFullscreen } = result.current[1]; + + toggleFullscreen(); + expect(mockScreenfull.request).toBeCalledWith(targetEl); + + act(() => { + if (changeCallback) changeCallback(); + }); + expect(result.current[0]).toBe(true); + + toggleFullscreen(); + expect(mockScreenfull.exit).toBeCalled(); + + act(() => { + if (changeCallback) changeCallback(); + }); + expect(result.current[0]).toBe(false); + }); + + test('onExit/onEnter should be called', () => { + const onExit = vi.fn(); + const onEnter = vi.fn(); + const { result } = setup(targetEl, { + onExit, + onEnter, + }); + const { toggleFullscreen } = result.current[1]; + + toggleFullscreen(); + act(() => { + if (changeCallback) changeCallback(); + }); + expect(onEnter).toBeCalled(); + + toggleFullscreen(); + act(() => { + if (changeCallback) changeCallback(); + }); + expect(onExit).toBeCalled(); + }); + + test('onExit/onEnter should not be called', () => { + const onExit = vi.fn(); + const onEnter = vi.fn(); + const { result } = setup(targetEl, { + onExit, + onEnter, + }); + const { exitFullscreen, enterFullscreen } = result.current[1]; + + // `onExit` should not be called when not full screen + exitFullscreen(); + act(() => { + if (changeCallback) changeCallback(); + }); + expect(onExit).not.toBeCalled(); + + // Enter full screen + enterFullscreen(); + act(() => { + if (changeCallback) changeCallback(); + }); + expect(onEnter).toBeCalled(); + onEnter.mockReset(); + + // `onEnter` should not be called when full screen + enterFullscreen(); + expect(onEnter).not.toBeCalled(); + }); + + test('pageFullscreen should be work', () => { + const PAGE_FULLSCREEN_CLASS_NAME = 'test-page-fullscreen'; + const PAGE_FULLSCREEN_Z_INDEX = 101; + const onExit = vi.fn(); + const onEnter = vi.fn(); + const { result } = setup(targetEl, { + onExit, + onEnter, + pageFullscreen: { + className: PAGE_FULLSCREEN_CLASS_NAME, + zIndex: PAGE_FULLSCREEN_Z_INDEX, + }, + }); + const { toggleFullscreen } = result.current[1]; + const getStyleEl = () => targetEl.querySelector('style'); + + act(() => toggleFullscreen()); + expect(result.current[0]).toBe(true); + expect(onEnter).toBeCalled(); + expect(targetEl.classList.contains(PAGE_FULLSCREEN_CLASS_NAME)).toBeTruthy(); + expect(getStyleEl()).not.toBeNull(); + expect(getStyleEl()?.textContent).toContain(`z-index: ${PAGE_FULLSCREEN_Z_INDEX}`); + expect(getStyleEl()?.getAttribute('id')).toBe(PAGE_FULLSCREEN_CLASS_NAME); + + act(() => toggleFullscreen()); + expect(result.current[0]).toBe(false); + expect(onExit).toBeCalled(); + expect(targetEl.classList.contains(PAGE_FULLSCREEN_CLASS_NAME)).toBeFalsy(); + expect(getStyleEl()).toBeNull(); + expect(getStyleEl()?.textContent).toBeUndefined(); + expect(getStyleEl()?.getAttribute('id')).toBeUndefined(); + }); + + test('enterFullscreen should not work when target is not element', () => { + const onEnter = vi.fn(); + const { result } = setup(null, { onEnter }); + const { enterFullscreen } = result.current[1]; + enterFullscreen(); + expect(mockScreenfull.request).not.toBeCalled(); + expect(onEnter).not.toBeCalled(); + }); + + test('should remove event listener when unmount', () => { + const { unmount } = setup(targetEl); + expect(mockScreenfull.on).toBeCalledWith('change', expect.any(Function)); + + unmount(); + expect(mockScreenfull.off).toBeCalledWith('change', expect.any(Function)); + }); + + test('`isFullscreen` should be false when use `document.exitFullscreen`', () => { + const { result } = setup(targetEl); + const { enterFullscreen } = result.current[1]; + + enterFullscreen(); + act(() => { + if (changeCallback) changeCallback(); + }); + expect(result.current[0]).toBe(true); + + // Simulate external exit fullscreen + mockScreenfull.element = null; + act(() => { + if (changeCallback) changeCallback(); + }); + expect(result.current[0]).toBe(false); + }); + + test('mutli element full screen should be correct', () => { + const targetEl2 = document.createElement('p'); + document.body.appendChild(targetEl2); + + // Store separate change callbacks for each hook + let changeCallback1: any = null; + let changeCallback2: any = null; + + // Override mock to track multiple callbacks + mockScreenfull.on.mockImplementation((event: string, callback: any) => { + if (event === 'change') { + if (!changeCallback1) { + changeCallback1 = callback; + } else if (!changeCallback2) { + changeCallback2 = callback; + } + } + }); + + const hook = setup(targetEl); + const hook2 = setup(targetEl2); + + // target1 full screen + hook.result.current[1].enterFullscreen(); + expect(mockScreenfull.element).toBe(targetEl); + act(() => { + if (changeCallback1) changeCallback1(); + if (changeCallback2) changeCallback2(); + }); + expect(hook.result.current[0]).toBe(true); + + // target2 full screen (this should make target1 not fullscreen) + hook2.result.current[1].enterFullscreen(); + expect(mockScreenfull.element).toBe(targetEl2); + act(() => { + if (changeCallback1) changeCallback1(); + if (changeCallback2) changeCallback2(); + }); + expect(hook.result.current[0]).toBe(false); + expect(hook2.result.current[0]).toBe(true); + + // target2 exit full screen (no element is fullscreen now) + hook2.result.current[1].exitFullscreen(); + expect(mockScreenfull.element).toBe(null); + act(() => { + if (changeCallback1) changeCallback1(); + if (changeCallback2) changeCallback2(); + }); + expect(hook.result.current[0]).toBe(false); + expect(hook2.result.current[0]).toBe(false); + + document.body.removeChild(targetEl2); + }); +}); diff --git a/packages/hooks/src/useFullscreen/__tests__/index.test.ts b/packages/hooks/src/useFullscreen/__tests__/index.test.ts deleted file mode 100644 index ce67de4b4a..0000000000 --- a/packages/hooks/src/useFullscreen/__tests__/index.test.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useFullscreen, { Options } from '../index'; -import type { BasicTarget } from '../../utils/domTarget'; - -const targetEl = document.createElement('div'); -const events = { - fullscreenchange: new Set(), - fullscreenerror: new Set(), -}; - -const setup = (target: BasicTarget, options?: Options) => - renderHook(() => useFullscreen(target, options)); - -describe('useFullscreen', () => { - beforeAll(() => { - jest.spyOn(HTMLElement.prototype, 'requestFullscreen').mockImplementation(() => { - Object.defineProperty(document, 'fullscreenElement', { - value: targetEl, - }); - return Promise.resolve(); - }); - jest.spyOn(document, 'exitFullscreen').mockImplementation(() => { - Object.defineProperty(document, 'fullscreenElement', { - value: null, - }); - return Promise.resolve(); - }); - jest.spyOn(document, 'addEventListener').mockImplementation((eventName, callback) => { - if (events[eventName]) { - events[eventName].add(callback); - } - }); - jest.spyOn(document, 'removeEventListener').mockImplementation((eventName, callback) => { - if (events[eventName]) { - events[eventName].delete(callback); - } - }); - }); - - afterEach(() => { - events.fullscreenchange.clear(); - }); - - afterAll(() => { - jest.resetAllMocks(); - }); - - it('enterFullscreen/exitFullscreen should be work', () => { - const { result } = setup(targetEl); - const { enterFullscreen, exitFullscreen } = result.current[1]; - enterFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(result.current[0]).toBeTruthy(); - - exitFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(result.current[0]).toBeFalsy(); - }); - - it('toggleFullscreen should be work', () => { - const { result } = setup(targetEl); - const { toggleFullscreen } = result.current[1]; - toggleFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(result.current[0]).toBeTruthy(); - - toggleFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(result.current[0]).toBeFalsy(); - }); - - it('onExit/onEnter should be called', () => { - const onExit = jest.fn(); - const onEnter = jest.fn(); - const { result } = setup(targetEl, { - onExit, - onEnter, - }); - const { toggleFullscreen } = result.current[1]; - toggleFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(onEnter).toBeCalled(); - - toggleFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(onExit).toBeCalled(); - }); - - it('enterFullscreen should not work when target is not element', () => { - const { result } = setup(null); - const { enterFullscreen } = result.current[1]; - enterFullscreen(); - expect(events.fullscreenchange.size).toBe(0); - }); - - it('exitFullscreen should not work when not in full screen', () => { - const onExit = jest.fn(); - const { result } = setup(targetEl, { onExit }); - const { exitFullscreen } = result.current[1]; - exitFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(onExit).not.toBeCalled(); - }); - - it('should remove event listener when unmount', () => { - const { result, unmount } = setup(targetEl); - const { enterFullscreen } = result.current[1]; - enterFullscreen(); - const size = events.fullscreenchange.size; - unmount(); - expect(events.fullscreenchange.size).toBe(size - 1); - }); - - it('`isFullscreen` should be false when use `document.exitFullscreen`', () => { - const { result } = setup(targetEl); - const { enterFullscreen } = result.current[1]; - enterFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(result.current[0]).toBeTruthy(); - - document.exitFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(result.current[0]).toBeFalsy(); - }); - - it('mutli element full screen should be correct', () => { - const targetEl2 = document.createElement('p'); - const hook = setup(targetEl); - const hook2 = setup(targetEl2); - - // target1 full screen - hook.result.current[1].enterFullscreen(); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(hook.result.current[0]).toBeTruthy(); - - // target2 full screen - hook2.result.current[1].enterFullscreen(); - Object.defineProperty(document, 'fullscreenElement', { - value: targetEl2, - }); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(hook.result.current[0]).toBeFalsy(); - expect(hook2.result.current[0]).toBeTruthy(); - - // target2 exit full screen - hook2.result.current[1].exitFullscreen(); - Object.defineProperty(document, 'fullscreenElement', { - value: targetEl, - }); - act(() => { - events['fullscreenchange'].forEach((fn: any) => fn()); - }); - expect(hook.result.current[0]).toBeTruthy(); - expect(hook2.result.current[0]).toBeFalsy(); - }); -}); diff --git a/packages/hooks/src/useFullscreen/demo/demo1.tsx b/packages/hooks/src/useFullscreen/demo/demo1.tsx index e16de570da..b7b539d349 100644 --- a/packages/hooks/src/useFullscreen/demo/demo1.tsx +++ b/packages/hooks/src/useFullscreen/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 使用 ref 设置需要全屏的元素 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useFullscreen } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useFullscreen/demo/demo2.tsx b/packages/hooks/src/useFullscreen/demo/demo2.tsx index a2ab3cc76a..398b9badd7 100644 --- a/packages/hooks/src/useFullscreen/demo/demo2.tsx +++ b/packages/hooks/src/useFullscreen/demo/demo2.tsx @@ -4,8 +4,8 @@ * title.zh-CN: 图片全屏 */ -import React from 'react'; import { useFullscreen } from 'ahooks'; +// @ts-ignore - Image import import img from './react-hooks.jpg'; export default () => { diff --git a/packages/hooks/src/useFullscreen/demo/demo3.tsx b/packages/hooks/src/useFullscreen/demo/demo3.tsx new file mode 100644 index 0000000000..d759d1b9b6 --- /dev/null +++ b/packages/hooks/src/useFullscreen/demo/demo3.tsx @@ -0,0 +1,32 @@ +/** + * title: Page full screen + * + * title.zh-CN: 页面全屏 + */ + +import { useRef } from 'react'; +import { useFullscreen } from 'ahooks'; + +export default () => { + const ref = useRef(null); + const [isFullscreen, { toggleFullscreen, enterFullscreen, exitFullscreen }] = useFullscreen(ref, { + pageFullscreen: true, + }); + + return ( +
+
+
{isFullscreen ? 'Fullscreen' : 'Not fullscreen'}
+ + + +
+
+ ); +}; diff --git a/packages/hooks/src/useFullscreen/demo/demo4.tsx b/packages/hooks/src/useFullscreen/demo/demo4.tsx new file mode 100644 index 0000000000..15e661d206 --- /dev/null +++ b/packages/hooks/src/useFullscreen/demo/demo4.tsx @@ -0,0 +1,39 @@ +/** + * title: Coexist with other full screen operations + * desc: The element's full screen may be modified by other scripts, don't worry, ahooks can work with them. + * + * title.zh-CN: 与其它全屏操作共存 + * desc.zh-CN: 元素的全屏情况可能被其它脚本修改,不用担心,ahooks 可以与它们共存。 + */ + +import { useRef } from 'react'; +import { useFullscreen } from 'ahooks'; + +function vanillaToggleFullscreen(element: HTMLElement) { + const isFullscreen = !!document.fullscreenElement; + + if (isFullscreen) { + document.exitFullscreen(); + } else { + element.requestFullscreen(); + } +} + +export default () => { + const ref = useRef(null); + const [isFullscreen, { toggleFullscreen }] = useFullscreen(ref); + + return ( +
+
{isFullscreen ? 'Fullscreen' : 'Not fullscreen'}
+
+ + +
+
+ ); +}; diff --git a/packages/hooks/src/useFullscreen/index.en-US.md b/packages/hooks/src/useFullscreen/index.en-US.md index e406f23a47..b7d03bc517 100644 --- a/packages/hooks/src/useFullscreen/index.en-US.md +++ b/packages/hooks/src/useFullscreen/index.en-US.md @@ -17,20 +17,26 @@ manages DOM full screen. +### Page full screen + + + +### Coexist with other full screen operations + + + ## API ```typescript -const [ - isFullscreen, - { - enterFullscreen, - exitFullscreen, - toggleFullscreen, - isEnabled, - }] = useFullScreen( - target, - options?: Options - ); +const [isFullscreen, { + enterFullscreen, + exitFullscreen, + toggleFullscreen, + isEnabled, +}] = useFullScreen( + target, + options?: Options +); ``` ### Params @@ -42,10 +48,11 @@ const [ ### Options -| Property | Description | Type | Default | -| -------- | ------------------------- | ------------ | ------- | -| onExit | Exit full screen trigger | `() => void` | - | -| onEnter | Enter full screen trigger | `() => void` | - | +| Property | Description | Type | Default | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ------- | +| onExit | Exit full screen trigger | `() => void` | - | +| onEnter | Enter full screen trigger | `() => void` | - | +| pageFullscreen | Whether to enable full screen of page. If its type is object, it can set `className` and `z-index` of the full screen element | `boolean` \| `{ className?: string, zIndex?: number }` | `false` | ### Result diff --git a/packages/hooks/src/useFullscreen/index.ts b/packages/hooks/src/useFullscreen/index.ts index 43a76974e3..3220ca8fb1 100644 --- a/packages/hooks/src/useFullscreen/index.ts +++ b/packages/hooks/src/useFullscreen/index.ts @@ -1,42 +1,97 @@ -import { useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; import screenfull from 'screenfull'; import useLatest from '../useLatest'; import useMemoizedFn from '../useMemoizedFn'; -import useUnmount from '../useUnmount'; import type { BasicTarget } from '../utils/domTarget'; import { getTargetElement } from '../utils/domTarget'; +import { isBoolean } from '../utils'; + +export interface PageFullscreenOptions { + className?: string; + zIndex?: number; +} export interface Options { onExit?: () => void; onEnter?: () => void; + pageFullscreen?: boolean | PageFullscreenOptions; } const useFullscreen = (target: BasicTarget, options?: Options) => { - const { onExit, onEnter } = options || {}; + const { onExit, onEnter, pageFullscreen = false } = options || {}; + const { className = 'ahooks-page-fullscreen', zIndex = 999999 } = + isBoolean(pageFullscreen) || !pageFullscreen ? {} : pageFullscreen; const onExitRef = useLatest(onExit); const onEnterRef = useLatest(onEnter); - const [state, setState] = useState(false); + // The state of full screen may be changed by other scripts/components, + // so the initial value needs to be computed dynamically. + const [state, setState] = useState(getIsFullscreen); + const stateRef = useRef(getIsFullscreen()); - const onChange = () => { - if (screenfull.isEnabled) { - const el = getTargetElement(target); - - if (!screenfull.element) { - onExitRef.current?.(); - setState(false); - screenfull.off('change', onChange); - } else { - const isFullscreen = screenfull.element === el; - if (isFullscreen) { - onEnterRef.current?.(); - } else { - onExitRef.current?.(); - } - setState(isFullscreen); + function getIsFullscreen() { + return ( + screenfull.isEnabled && + !!screenfull.element && + screenfull.element === getTargetElement(target) + ); + } + + const invokeCallback = (fullscreen: boolean) => { + if (fullscreen) { + onEnterRef.current?.(); + } else { + onExitRef.current?.(); + } + }; + + const updateFullscreenState = (fullscreen: boolean) => { + // Prevent repeated calls when the state is not changed. + if (stateRef.current !== fullscreen) { + invokeCallback(fullscreen); + setState(fullscreen); + stateRef.current = fullscreen; + } + }; + + const onScreenfullChange = () => { + const fullscreen = getIsFullscreen(); + + updateFullscreenState(fullscreen); + }; + + const togglePageFullscreen = (fullscreen: boolean) => { + const el = getTargetElement(target); + if (!el) { + return; + } + + let styleElem = document.getElementById(className); + + if (fullscreen) { + el.classList.add(className); + + if (!styleElem) { + styleElem = document.createElement('style'); + styleElem.setAttribute('id', className); + styleElem.textContent = ` + .${className} { + position: fixed; left: 0; top: 0; right: 0; bottom: 0; + width: 100% !important; height: 100% !important; + z-index: ${zIndex}; + }`; + el.appendChild(styleElem); + } + } else { + el.classList.remove(className); + + if (styleElem) { + styleElem.remove(); } } + + updateFullscreenState(fullscreen); }; const enterFullscreen = () => { @@ -45,10 +100,13 @@ const useFullscreen = (target: BasicTarget, options?: Options) => { return; } + if (pageFullscreen) { + togglePageFullscreen(true); + return; + } if (screenfull.isEnabled) { try { screenfull.request(el); - screenfull.on('change', onChange); } catch (error) { console.error(error); } @@ -57,6 +115,14 @@ const useFullscreen = (target: BasicTarget, options?: Options) => { const exitFullscreen = () => { const el = getTargetElement(target); + if (!el) { + return; + } + + if (pageFullscreen) { + togglePageFullscreen(false); + return; + } if (screenfull.isEnabled && screenfull.element === el) { screenfull.exit(); } @@ -70,11 +136,17 @@ const useFullscreen = (target: BasicTarget, options?: Options) => { } }; - useUnmount(() => { - if (screenfull.isEnabled) { - screenfull.off('change', onChange); + useEffect(() => { + if (!screenfull.isEnabled || pageFullscreen) { + return; } - }); + + screenfull.on('change', onScreenfullChange); + + return () => { + screenfull.off('change', onScreenfullChange); + }; + }, []); return [ state, diff --git a/packages/hooks/src/useFullscreen/index.zh-CN.md b/packages/hooks/src/useFullscreen/index.zh-CN.md index 18ed441f6b..8b05a00766 100644 --- a/packages/hooks/src/useFullscreen/index.zh-CN.md +++ b/packages/hooks/src/useFullscreen/index.zh-CN.md @@ -17,20 +17,26 @@ nav: +### 页面全屏 + + + +### 与其它全屏操作共存 + + + ## API ```typescript -const [ - isFullscreen, - { - enterFullscreen, - exitFullscreen, - toggleFullscreen, - isEnabled, - }] = useFullScreen( - target, - options?: Options - ); +const [isFullscreen, { + enterFullscreen, + exitFullscreen, + toggleFullscreen, + isEnabled, +}] = useFullscreen( + target, + options?: Options +); ``` ### Params @@ -42,10 +48,11 @@ const [ ### Options -| 参数 | 说明 | 类型 | 默认值 | -| ------- | ------------ | ------------ | ------ | -| onExit | 退出全屏触发 | `() => void` | - | -| onEnter | 全屏触发 | `() => void` | - | +| 参数 | 说明 | 类型 | 默认值 | +| -------------- | ---------------------------------------------------------------------- | ------------------------------------------------------ | ------- | +| onExit | 退出全屏触发 | `() => void` | - | +| onEnter | 全屏触发 | `() => void` | - | +| pageFullscreen | 是否是页面全屏。当参数类型为对象时,可以设置全屏元素的类名和 `z-index` | `boolean` \| `{ className?: string, zIndex?: number }` | `false` | ### Result diff --git a/packages/hooks/src/useFusionTable/__tests__/index.test.ts b/packages/hooks/src/useFusionTable/__tests__/index.spec.ts similarity index 65% rename from packages/hooks/src/useFusionTable/__tests__/index.test.ts rename to packages/hooks/src/useFusionTable/__tests__/index.spec.ts index 74bc56f579..d47687c025 100644 --- a/packages/hooks/src/useFusionTable/__tests__/index.test.ts +++ b/packages/hooks/src/useFusionTable/__tests__/index.spec.ts @@ -1,6 +1,7 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useFusionTable from '../index'; +import { act, renderHook } from '@testing-library/react'; +import { afterAll, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; import { sleep } from '../../utils/testingHelpers'; +import useFusionTable from '../index'; type Result = { total: number; @@ -9,7 +10,13 @@ type Result = { let count = 0; const total = 40; -const getTableData = async ({ current, pageSize }): Promise => { +const getTableData = async ({ + current, + pageSize, +}: { + current: number; + pageSize: number; +}): Promise => { if (count * current >= total) { return { total, @@ -37,7 +44,7 @@ const mockField = { getNames() { return []; }, - setValues(v) { + setValues(v: any) { values = v; }, getValues() { @@ -46,12 +53,13 @@ const mockField = { resetToDefault() { values = {}; }, - validate(names, callback) { + validate(names: any, callback: (err: any, values: any) => void) { callback(null, values); }, }; -const setup = (service, options = {}) => renderHook(() => useFusionTable(service, options)); +const setup = (service: any, options: any = {}) => + renderHook(() => useFusionTable(service, options)); describe('useFusionTable', () => { beforeEach(() => { @@ -60,48 +68,48 @@ describe('useFusionTable', () => { }); beforeAll(() => { - jest.useFakeTimers(); + vi.useFakeTimers(); }); afterAll(() => { - jest.useRealTimers(); + vi.useRealTimers(); }); - it('should get table & pagination props', async () => { + test('should get table & pagination props', async () => { const { result } = setup(getTableData); await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); - expect(result.current.tableProps.loading).toBeTruthy(); + expect(result.current.tableProps.loading).toBe(true); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); - expect(result.current.tableProps.loading).toBeFalsy(); + expect(result.current.tableProps.loading).toBe(false); expect(result.current.tableProps.dataSource).toHaveLength(10); expect(result.current.paginationProps.current).toBe(1); expect(result.current.paginationProps.total).toBe(total); }); - it('should get table data when page change', async () => { + test('should get table data when page change', async () => { const { result } = setup(getTableData); const current = 2; await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); act(() => { result.current.paginationProps.onChange(current); }); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current.paginationProps.current).toBe(current); expect(result.current.paginationProps.total).toBe(total); }); - it('search should work when set field instance', async () => { + test('search should work when set field instance', async () => { const { result } = setup(getTableData, { field: mockField }); mockField.setValues({ name: 'ahooks', @@ -109,42 +117,42 @@ describe('useFusionTable', () => { result.current.search.submit(); await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); - expect(result.current.loading).toBeTruthy(); + expect(result.current.loading).toBe(true); expect(result.current.params[1]).toMatchObject({ name: 'ahooks' }); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); - expect(result.current.loading).toBeFalsy(); + expect(result.current.loading).toBe(false); result.current.search.reset(); expect(result.current.params[1]).toMatchObject({}); await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); - expect(result.current.loading).toBeTruthy(); + expect(result.current.loading).toBe(true); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); - expect(result.current.loading).toBeFalsy(); + expect(result.current.loading).toBe(false); }); - it('defaultParams should be work', async () => { + test('defaultParams should be work', async () => { const { result } = setup(getTableData, { defaultParams: [{ current: 2, pageSize: 20 }], }); await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(result.current.tableProps.dataSource).toHaveLength(20); expect(result.current.paginationProps.current).toBe(2); }); - it('cache should be work', async () => { + test('cache should be work', async () => { const options = { field: mockField, cacheKey: 'cache', @@ -158,34 +166,34 @@ describe('useFusionTable', () => { }; const hook = setup(getTableData, options); await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); await act(async () => { - jest.advanceTimersByTime(1000); + vi.advanceTimersByTime(1000); }); expect(hook.result.current.tableProps.dataSource).toHaveLength(5); - expect(hook.result.current.loading).toBeFalsy(); + expect(hook.result.current.loading).toBe(false); hook.unmount(); const hook2 = setup(getTableData, options); await act(async () => { - jest.runAllTimers(); + vi.runAllTimers(); }); - expect(hook2.result.current.loading).toBeFalsy(); + expect(hook2.result.current.loading).toBe(false); expect(hook2.result.current.tableProps.dataSource).toHaveLength(5); }); - it('onSort should be work', async () => { + test('onSort should be work', async () => { const { result } = setup(getTableData); act(() => { result.current.tableProps.onSort('dataIndex', 'asc'); }); - expect(result.current.loading).toBeTruthy(); + expect(result.current.loading).toBe(true); expect(result.current.params[0]?.sorter).toMatchObject({ field: 'dataIndex', order: 'asc' }); }); - it('onFilter should be work', async () => { + test('onFilter should be work', async () => { const { result } = setup(getTableData); const filterParams = { version: 3, @@ -193,7 +201,7 @@ describe('useFusionTable', () => { act(() => { result.current.tableProps.onFilter(filterParams); }); - expect(result.current.loading).toBeTruthy(); + expect(result.current.loading).toBe(true); expect(result.current.params[0]?.filters).toMatchObject(filterParams); }); }); diff --git a/packages/hooks/src/useFusionTable/demo/cache.tsx b/packages/hooks/src/useFusionTable/demo/cache.tsx index aa69b6cced..2163f4aa43 100644 --- a/packages/hooks/src/useFusionTable/demo/cache.tsx +++ b/packages/hooks/src/useFusionTable/demo/cache.tsx @@ -1,6 +1,7 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Table, Pagination, Field, Form, Input, Button } from '@alifd/next'; import { useFusionTable } from 'ahooks'; +import ReactJson from 'react-json-view'; interface Item { name: { @@ -16,8 +17,13 @@ interface Result { list: Item[]; } -const getTableData = ( - { current, pageSize, filters, sorter }, +const getTableData = async ( + { + current, + pageSize, + filters, + sorter, + }: { current: number; pageSize: number; filters: any; sorter: any }, formData: Object, ): Promise => { console.log(sorter, filters); @@ -38,7 +44,7 @@ const getTableData = ( }; const AppList = () => { - const field = Field.useField([]); + const field = Field.useField({} as any); const { tableProps, paginationProps, params, search } = useFusionTable(getTableData, { defaultPageSize: 5, @@ -108,8 +114,10 @@ const AppList = () => {
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useFusionTable/demo/form.tsx b/packages/hooks/src/useFusionTable/demo/form.tsx index 2f2c066c70..a2717b4082 100644 --- a/packages/hooks/src/useFusionTable/demo/form.tsx +++ b/packages/hooks/src/useFusionTable/demo/form.tsx @@ -1,6 +1,6 @@ -import React from 'react'; -import { Table, Pagination, Field, Form, Input, Button, Select, Icon } from '@alifd/next'; +import { Table, Pagination, Field, Form, Input, Button, Icon } from '@alifd/next'; import { useFusionTable } from 'ahooks'; +import ReactJson from 'react-json-view'; interface Item { name: { @@ -16,7 +16,10 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { current, pageSize }: { current: number; pageSize: number }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -33,7 +36,7 @@ const getTableData = ({ current, pageSize }, formData: Object): Promise }; const AppList = () => { - const field = Field.useField([]); + const field = Field.useField({} as any); const { paginationProps, tableProps, search, loading, params } = useFusionTable(getTableData, { field, }); @@ -43,7 +46,11 @@ const AppList = () => {
@@ -79,17 +86,13 @@ const AppList = () => {
- - - - {
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useFusionTable/demo/init.tsx b/packages/hooks/src/useFusionTable/demo/init.tsx index 43b8fc52e8..ccbd2499fd 100644 --- a/packages/hooks/src/useFusionTable/demo/init.tsx +++ b/packages/hooks/src/useFusionTable/demo/init.tsx @@ -1,6 +1,6 @@ import { Button, Field, Form, Icon, Input, Pagination, Select, Table } from '@alifd/next'; -import React from 'react'; import { useFusionTable } from 'ahooks'; +import ReactJson from 'react-json-view'; interface Item { name: { @@ -16,7 +16,10 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { current, pageSize }: { current: number; pageSize: number }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -33,7 +36,7 @@ const getTableData = ({ current, pageSize }, formData: Object): Promise }; const AppList = () => { - const field = Field.useField([]); + const field = Field.useField({} as any); const { paginationProps, tableProps, search, loading, params } = useFusionTable(getTableData, { field, defaultParams: [ @@ -124,8 +127,10 @@ const AppList = () => {
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useFusionTable/demo/table.tsx b/packages/hooks/src/useFusionTable/demo/table.tsx index de53a66f08..92f5f8388e 100644 --- a/packages/hooks/src/useFusionTable/demo/table.tsx +++ b/packages/hooks/src/useFusionTable/demo/table.tsx @@ -1,5 +1,4 @@ import { Pagination, Table } from '@alifd/next'; -import React from 'react'; import { useFusionTable } from 'ahooks'; interface Item { @@ -16,7 +15,13 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }): Promise => { +const getTableData = ({ + current, + pageSize, +}: { + current: number; + pageSize: number; +}): Promise => { const query = `page=${current}&size=${pageSize}`; return fetch(`https://randomuser.me/api?results=${pageSize}&${query}`) diff --git a/packages/hooks/src/useFusionTable/demo/validate.tsx b/packages/hooks/src/useFusionTable/demo/validate.tsx index 0ee1fefe0d..f729cd4283 100644 --- a/packages/hooks/src/useFusionTable/demo/validate.tsx +++ b/packages/hooks/src/useFusionTable/demo/validate.tsx @@ -1,6 +1,6 @@ -import React from 'react'; -import { Table, Pagination, Field, Form, Input, Select, Icon } from '@alifd/next'; +import { Table, Pagination, Field, Form, Input, Icon } from '@alifd/next'; import { useFusionTable } from 'ahooks'; +import ReactJson from 'react-json-view'; interface Item { name: { @@ -16,7 +16,10 @@ interface Result { list: Item[]; } -const getTableData = ({ current, pageSize }, formData: Object): Promise => { +const getTableData = ( + { current, pageSize }: { current: number; pageSize: number }, + formData: Object, +): Promise => { let query = `page=${current}&size=${pageSize}`; Object.entries(formData).forEach(([key, value]) => { if (value) { @@ -33,7 +36,7 @@ const getTableData = ({ current, pageSize }, formData: Object): Promise }; const AppList = () => { - const field = Field.useField([]); + const field = Field.useField({} as any); const { paginationProps, tableProps, search, params } = useFusionTable(getTableData, { field, defaultParams: [{ current: 1, pageSize: 10 }, { name: 'hello' }], @@ -71,8 +74,10 @@ const AppList = () => {
-

Current Table: {JSON.stringify(params[0])}

-

Current Form: {JSON.stringify(params[1])}

+

Current Table:

+ +

Current Form:

+
); diff --git a/packages/hooks/src/useFusionTable/fusionAdapter.ts b/packages/hooks/src/useFusionTable/fusionAdapter.ts index 47b9291558..73f456bb08 100644 --- a/packages/hooks/src/useFusionTable/fusionAdapter.ts +++ b/packages/hooks/src/useFusionTable/fusionAdapter.ts @@ -10,7 +10,7 @@ export const fieldAdapter = (field: Field) => validateFields: (fields, callback) => { field.validate(fields, callback); }, - } as AntdFormUtils); + }) as AntdFormUtils; export const resultAdapter = (result: any) => { const tableProps = { @@ -26,7 +26,7 @@ export const resultAdapter = (result: any) => { }, ); }, - onFilter: (filterParams: Object) => { + onFilter: (filterParams: Record) => { result.tableProps.onChange( { current: result.pagination.current, pageSize: result.pagination.pageSize }, filterParams, diff --git a/packages/hooks/src/useFusionTable/types.ts b/packages/hooks/src/useFusionTable/types.ts index d10c656608..e3df65b247 100644 --- a/packages/hooks/src/useFusionTable/types.ts +++ b/packages/hooks/src/useFusionTable/types.ts @@ -1,11 +1,11 @@ import type { AntdTableOptions, AntdTableResult, Data, Params } from '../useAntdTable/types'; export interface Field { - getFieldInstance?: (name: string) => {}; + getFieldInstance?: (name: string) => Record; setValues: (value: Record) => void; getValues: (...args: any) => Record; reset: (...args: any) => void; - validate: (fields: any, callback: (errors, values) => void) => void; + validate: (fields: any, callback: (errors: any, values: any) => void) => void; [key: string]: any; } diff --git a/packages/hooks/src/useGetState/__tests__/index.test.ts b/packages/hooks/src/useGetState/__tests__/index.spec.ts similarity index 59% rename from packages/hooks/src/useGetState/__tests__/index.test.ts rename to packages/hooks/src/useGetState/__tests__/index.spec.ts index bf8dce4371..697ee8d4a1 100644 --- a/packages/hooks/src/useGetState/__tests__/index.test.ts +++ b/packages/hooks/src/useGetState/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useGetState from '../index'; describe('useGetState', () => { @@ -12,25 +13,25 @@ describe('useGetState', () => { } as const; }); - it('should support initialValue', () => { + test('should support initialValue', () => { const hook = setUp(() => 0); - expect(hook.result.current.state).toEqual(0); + expect(hook.result.current.state).toBe(0); }); - it('should support update', () => { + test('should support update', () => { const hook = setUp(0); act(() => { hook.result.current.setState(1); }); - expect(hook.result.current.getState()).toEqual(1); + expect(hook.result.current.getState()).toBe(1); }); - it('should getState frozen', () => { + test('should getState frozen', () => { const hook = setUp(0); const prevGetState = hook.result.current.getState; act(() => { hook.result.current.setState(1); }); - expect(hook.result.current.getState).toEqual(prevGetState); + expect(hook.result.current.getState).toBe(prevGetState); }); }); diff --git a/packages/hooks/src/useGetState/demo/demo1.tsx b/packages/hooks/src/useGetState/demo/demo1.tsx index 119712b36e..2046fb982f 100644 --- a/packages/hooks/src/useGetState/demo/demo1.tsx +++ b/packages/hooks/src/useGetState/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 计数器每 3 秒打印一次值 */ -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; import { useGetState } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useGetState/index.ts b/packages/hooks/src/useGetState/index.ts index 51f76c61aa..f1799ac031 100644 --- a/packages/hooks/src/useGetState/index.ts +++ b/packages/hooks/src/useGetState/index.ts @@ -1,5 +1,6 @@ import type { Dispatch, SetStateAction } from 'react'; -import { useState, useRef, useCallback } from 'react'; +import { useState, useCallback } from 'react'; +import useLatest from '../useLatest'; type GetStateAction = () => S; @@ -13,8 +14,7 @@ function useGetState(): [ ]; function useGetState(initialState?: S) { const [state, setState] = useState(initialState); - const stateRef = useRef(state); - stateRef.current = state; + const stateRef = useLatest(state); const getState = useCallback(() => stateRef.current, []); diff --git a/packages/hooks/src/useHistoryTravel/__tests__/index.test.ts b/packages/hooks/src/useHistoryTravel/__tests__/index.spec.ts similarity index 51% rename from packages/hooks/src/useHistoryTravel/__tests__/index.test.ts rename to packages/hooks/src/useHistoryTravel/__tests__/index.spec.ts index 041701f0c5..e0601fef2b 100644 --- a/packages/hooks/src/useHistoryTravel/__tests__/index.test.ts +++ b/packages/hooks/src/useHistoryTravel/__tests__/index.spec.ts @@ -1,61 +1,62 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useHistoryTravel from '../index'; describe('useHistoryTravel', () => { - it('should work without initial value', async () => { + test('should work without initial value', async () => { const hook = renderHook(() => useHistoryTravel()); - expect(hook.result.current.value).toEqual(undefined); + expect(hook.result.current.value).toBeUndefined(); act(() => { hook.result.current.setValue('test'); }); - expect(hook.result.current.value).toEqual('test'); + expect(hook.result.current.value).toBe('test'); }); - it('should work with null and undefined without initial value', async () => { + test('should work with null and undefined without initial value', async () => { const nullHook = renderHook(() => useHistoryTravel()); - expect(nullHook.result.current.value).toEqual(undefined); + expect(nullHook.result.current.value).toBeUndefined(); act(() => { nullHook.result.current.setValue(null); }); - expect(nullHook.result.current.value).toEqual(null); + expect(nullHook.result.current.value).toBeNull(); const undefHook = renderHook(() => useHistoryTravel()); - expect(undefHook.result.current.value).toEqual(undefined); + expect(undefHook.result.current.value).toBeUndefined(); act(() => { undefHook.result.current.setValue('def'); }); act(() => { undefHook.result.current.setValue(undefined); }); - expect(undefHook.result.current.value).toEqual(undefined); - expect(undefHook.result.current.backLength).toEqual(2); + expect(undefHook.result.current.value).toBeUndefined(); + expect(undefHook.result.current.backLength).toBe(2); }); - it('should work with initial value', async () => { + test('should work with initial value', async () => { const hook = renderHook(() => useHistoryTravel('abc')); - expect(hook.result.current.value).toEqual('abc'); + expect(hook.result.current.value).toBe('abc'); act(() => { hook.result.current.setValue('def'); }); - expect(hook.result.current.value).toEqual('def'); + expect(hook.result.current.value).toBe('def'); }); - it('should work with null and undefined with initial value', async () => { + test('should work with null and undefined with initial value', async () => { const nullHook = renderHook(() => useHistoryTravel('abc')); act(() => { nullHook.result.current.setValue(null); }); - expect(nullHook.result.current.value).toEqual(null); + expect(nullHook.result.current.value).toBeNull(); const undefHook = renderHook(() => useHistoryTravel('abc')); act(() => { undefHook.result.current.setValue(undefined); }); - expect(undefHook.result.current.value).toEqual(undefined); - expect(undefHook.result.current.backLength).toEqual(1); + expect(undefHook.result.current.value).toBeUndefined(); + expect(undefHook.result.current.backLength).toBe(1); }); - it('back and forward should work', () => { + test('back and forward should work', () => { const hook = renderHook(() => useHistoryTravel()); act(() => { hook.result.current.setValue('ddd'); @@ -63,22 +64,22 @@ describe('useHistoryTravel', () => { act(() => { hook.result.current.setValue('abc'); }); - expect(hook.result.current.value).toEqual('abc'); + expect(hook.result.current.value).toBe('abc'); act(() => { hook.result.current.setValue('def'); }); - expect(hook.result.current.value).toEqual('def'); + expect(hook.result.current.value).toBe('def'); act(() => { hook.result.current.back(); }); - expect(hook.result.current.value).toEqual('abc'); + expect(hook.result.current.value).toBe('abc'); act(() => { hook.result.current.forward(); }); - expect(hook.result.current.value).toEqual('def'); + expect(hook.result.current.value).toBe('def'); }); - it('go should work for negative step', () => { + test('go should work for negative step', () => { const hook = renderHook(() => useHistoryTravel('init')); act(() => { hook.result.current.setValue('abc'); @@ -92,14 +93,14 @@ describe('useHistoryTravel', () => { act(() => { hook.result.current.go(-2); }); - expect(hook.result.current.value).toEqual('abc'); + expect(hook.result.current.value).toBe('abc'); act(() => { hook.result.current.go(-100); }); - expect(hook.result.current.value).toEqual('init'); + expect(hook.result.current.value).toBe('init'); }); - it('go should work for positive step', () => { + test('go should work for positive step', () => { const hook = renderHook(() => useHistoryTravel('init')); act(() => { hook.result.current.setValue('abc'); @@ -113,18 +114,18 @@ describe('useHistoryTravel', () => { act(() => { hook.result.current.go(-3); }); - expect(hook.result.current.value).toEqual('init'); + expect(hook.result.current.value).toBe('init'); act(() => { hook.result.current.go(2); }); - expect(hook.result.current.value).toEqual('def'); + expect(hook.result.current.value).toBe('def'); act(() => { hook.result.current.go(100); }); - expect(hook.result.current.value).toEqual('hij'); + expect(hook.result.current.value).toBe('hij'); }); - it('reset should reset state to initial by default', () => { + test('reset should reset state to initial by default', () => { const hook = renderHook(() => useHistoryTravel('init')); act(() => { hook.result.current.setValue('abc'); @@ -138,17 +139,17 @@ describe('useHistoryTravel', () => { act(() => { hook.result.current.go(-1); }); - expect(hook.result.current.backLength).toEqual(2); - expect(hook.result.current.forwardLength).toEqual(1); + expect(hook.result.current.backLength).toBe(2); + expect(hook.result.current.forwardLength).toBe(1); act(() => { hook.result.current.reset(); }); - expect(hook.result.current.value).toEqual('init'); - expect(hook.result.current.backLength).toEqual(0); - expect(hook.result.current.forwardLength).toEqual(0); + expect(hook.result.current.value).toBe('init'); + expect(hook.result.current.backLength).toBe(0); + expect(hook.result.current.forwardLength).toBe(0); }); - it('reset should reset state to new initial if provided', () => { + test('reset should reset state to new initial if provided', () => { const hook = renderHook(() => useHistoryTravel('init')); act(() => { hook.result.current.setValue('abc'); @@ -162,17 +163,17 @@ describe('useHistoryTravel', () => { act(() => { hook.result.current.go(-1); }); - expect(hook.result.current.backLength).toEqual(2); - expect(hook.result.current.forwardLength).toEqual(1); + expect(hook.result.current.backLength).toBe(2); + expect(hook.result.current.forwardLength).toBe(1); act(() => { hook.result.current.reset('new init'); }); - expect(hook.result.current.value).toEqual('new init'); - expect(hook.result.current.backLength).toEqual(0); - expect(hook.result.current.forwardLength).toEqual(0); + expect(hook.result.current.value).toBe('new init'); + expect(hook.result.current.backLength).toBe(0); + expect(hook.result.current.forwardLength).toBe(0); }); - it('reset new initial value should work with undefined', () => { + test('reset new initial value should work with undefined', () => { const hook = renderHook(() => useHistoryTravel('init')); act(() => { hook.result.current.setValue('abc'); @@ -186,60 +187,60 @@ describe('useHistoryTravel', () => { act(() => { hook.result.current.go(-1); }); - expect(hook.result.current.backLength).toEqual(2); - expect(hook.result.current.forwardLength).toEqual(1); + expect(hook.result.current.backLength).toBe(2); + expect(hook.result.current.forwardLength).toBe(1); act(() => { hook.result.current.reset(undefined); }); - expect(hook.result.current.value).toEqual(undefined); - expect(hook.result.current.backLength).toEqual(0); - expect(hook.result.current.forwardLength).toEqual(0); + expect(hook.result.current.value).toBeUndefined(); + expect(hook.result.current.backLength).toBe(0); + expect(hook.result.current.forwardLength).toBe(0); }); - it('should work without max length', async () => { + test('should work without max length', async () => { const hook = renderHook(() => useHistoryTravel()); - expect(hook.result.current.backLength).toEqual(0); + expect(hook.result.current.backLength).toBe(0); for (let i = 1; i <= 100; i++) { act(() => { hook.result.current.setValue(i); }); } - expect(hook.result.current.forwardLength).toEqual(0); - expect(hook.result.current.backLength).toEqual(100); - expect(hook.result.current.value).toEqual(100); + expect(hook.result.current.forwardLength).toBe(0); + expect(hook.result.current.backLength).toBe(100); + expect(hook.result.current.value).toBe(100); }); - it('should work with max length', async () => { + test('should work with max length', async () => { const hook = renderHook(() => useHistoryTravel(0, 10)); - expect(hook.result.current.backLength).toEqual(0); + expect(hook.result.current.backLength).toBe(0); for (let i = 1; i <= 100; i++) { act(() => { hook.result.current.setValue(i); }); } - expect(hook.result.current.forwardLength).toEqual(0); - expect(hook.result.current.backLength).toEqual(10); - expect(hook.result.current.value).toEqual(100); + expect(hook.result.current.forwardLength).toBe(0); + expect(hook.result.current.backLength).toBe(10); + expect(hook.result.current.value).toBe(100); act(() => { hook.result.current.go(-5); }); - expect(hook.result.current.forwardLength).toEqual(5); - expect(hook.result.current.backLength).toEqual(5); - expect(hook.result.current.value).toEqual(95); + expect(hook.result.current.forwardLength).toBe(5); + expect(hook.result.current.backLength).toBe(5); + expect(hook.result.current.value).toBe(95); act(() => { hook.result.current.go(5); }); - expect(hook.result.current.forwardLength).toEqual(0); - expect(hook.result.current.backLength).toEqual(10); - expect(hook.result.current.value).toEqual(100); + expect(hook.result.current.forwardLength).toBe(0); + expect(hook.result.current.backLength).toBe(10); + expect(hook.result.current.value).toBe(100); act(() => { hook.result.current.go(-50); }); - expect(hook.result.current.forwardLength).toEqual(10); - expect(hook.result.current.backLength).toEqual(0); - expect(hook.result.current.value).toEqual(90); + expect(hook.result.current.forwardLength).toBe(10); + expect(hook.result.current.backLength).toBe(0); + expect(hook.result.current.value).toBe(90); }); }); diff --git a/packages/hooks/src/useHistoryTravel/demo/demo1.tsx b/packages/hooks/src/useHistoryTravel/demo/demo1.tsx index 7a9b7dea93..88399fadc2 100644 --- a/packages/hooks/src/useHistoryTravel/demo/demo1.tsx +++ b/packages/hooks/src/useHistoryTravel/demo/demo1.tsx @@ -7,8 +7,6 @@ */ import { useHistoryTravel } from 'ahooks'; -import React from 'react'; - export default () => { const { value, setValue, backLength, forwardLength, back, forward } = useHistoryTravel(); diff --git a/packages/hooks/src/useHistoryTravel/demo/demo2.tsx b/packages/hooks/src/useHistoryTravel/demo/demo2.tsx index 060d7a0d3a..4c1e5bc5a6 100644 --- a/packages/hooks/src/useHistoryTravel/demo/demo2.tsx +++ b/packages/hooks/src/useHistoryTravel/demo/demo2.tsx @@ -7,7 +7,7 @@ */ import { useHistoryTravel } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const { diff --git a/packages/hooks/src/useHistoryTravel/demo/demo3.tsx b/packages/hooks/src/useHistoryTravel/demo/demo3.tsx index 2a62778d56..582dcdb28e 100644 --- a/packages/hooks/src/useHistoryTravel/demo/demo3.tsx +++ b/packages/hooks/src/useHistoryTravel/demo/demo3.tsx @@ -7,8 +7,6 @@ */ import { useHistoryTravel } from 'ahooks'; -import React from 'react'; - export default () => { const maxLength = 3; const { value, setValue, backLength, forwardLength, back, forward } = useHistoryTravel( diff --git a/packages/hooks/src/useHover/__tests__/index.spec.tsx b/packages/hooks/src/useHover/__tests__/index.spec.tsx new file mode 100644 index 0000000000..d4db08d330 --- /dev/null +++ b/packages/hooks/src/useHover/__tests__/index.spec.tsx @@ -0,0 +1,30 @@ +import { act, fireEvent, render, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import useHover from '../index'; + +describe('useHover', () => { + test('should work', () => { + const { getByText } = render(); + let trigger = 0; + const { result } = renderHook(() => + useHover(getByText('Hover'), { + onEnter: () => { + trigger++; + }, + onLeave: () => { + trigger++; + }, + }), + ); + + expect(result.current).toBe(false); + + act(() => void fireEvent.mouseEnter(getByText('Hover'))); + expect(result.current).toBe(true); + expect(trigger).toBe(1); + + act(() => void fireEvent.mouseLeave(getByText('Hover'))); + expect(result.current).toBe(false); + expect(trigger).toBe(2); + }); +}); diff --git a/packages/hooks/src/useHover/__tests__/index.test.tsx b/packages/hooks/src/useHover/__tests__/index.test.tsx deleted file mode 100644 index 2da79b60d6..0000000000 --- a/packages/hooks/src/useHover/__tests__/index.test.tsx +++ /dev/null @@ -1,38 +0,0 @@ -// write your test cases here -import React from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; -import { render, fireEvent } from '@testing-library/react'; -import useHover from '../index'; - -describe('useHover', () => { - it('should work', () => { - const { getByText } = render(); - let trigger = 0; - const { result } = renderHook(() => - useHover(getByText('Hover'), { - onEnter: () => { - trigger++; - }, - onLeave: () => { - trigger++; - }, - }), - ); - - expect(result.current).toBe(false); - - act(() => { - fireEvent.mouseOver(getByText('Hover'), () => { - expect(result.current).toBe(true); - expect(trigger).toBe(1); - }); - }); - - act(() => { - fireEvent.mouseLeave(getByText('Hover'), () => { - expect(result.current).toBe(false); - expect(trigger).toBe(2); - }); - }); - }); -}); diff --git a/packages/hooks/src/useHover/demo/demo1.tsx b/packages/hooks/src/useHover/demo/demo1.tsx index 36ffb0fb4d..3a8cc7f8e0 100644 --- a/packages/hooks/src/useHover/demo/demo1.tsx +++ b/packages/hooks/src/useHover/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 使用 ref 设置需要监听的元素。 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useHover } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useHover/demo/demo2.tsx b/packages/hooks/src/useHover/demo/demo2.tsx index 3d86c391ca..daf05bc0ba 100644 --- a/packages/hooks/src/useHover/demo/demo2.tsx +++ b/packages/hooks/src/useHover/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 传入 function 并返回一个 dom 元素。 */ -import React from 'react'; import { useHover } from 'ahooks'; export default () => { @@ -17,7 +16,7 @@ export default () => { onLeave: () => { console.log('onLeave'); }, - onChange: isHover => { + onChange: (isHover) => { console.log('onChange', isHover); }, }); diff --git a/packages/hooks/src/useInViewport/__tests__/index.spec.ts b/packages/hooks/src/useInViewport/__tests__/index.spec.ts new file mode 100644 index 0000000000..6cb8799681 --- /dev/null +++ b/packages/hooks/src/useInViewport/__tests__/index.spec.ts @@ -0,0 +1,87 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; + +import useInViewport from '../index'; + +const targetEl = document.createElement('div'); +document.body.appendChild(targetEl); + +const observe = vi.fn(); +const disconnect = vi.fn(); + +const mockIntersectionObserver = vi.fn().mockReturnValue({ + observe, + disconnect, +}); + +window.IntersectionObserver = mockIntersectionObserver; + +describe('useInViewport', () => { + test('should work when target is in viewport', async () => { + const { result } = renderHook(() => useInViewport(targetEl)); + const calls = mockIntersectionObserver.mock.calls; + const [onChange] = calls[calls.length - 1]; + + act(() => { + onChange([ + { + targetEl, + isIntersecting: true, + intersectionRatio: 0.5, + }, + ]); + }); + + const [inViewport, ratio] = result.current; + expect(inViewport).toBeTruthy(); + expect(ratio).toBe(0.5); + }); + + test('should work when target array is in viewport and has a callback', async () => { + const targetEls: HTMLDivElement[] = []; + const callback = vi.fn(); + for (let i = 0; i < 2; i++) { + const target = document.createElement('div'); + document.body.appendChild(target); + targetEls.push(target); + } + + const getValue = (isIntersecting: any, intersectionRatio: any) => ({ + isIntersecting, + intersectionRatio, + }); + + const { result } = renderHook(() => useInViewport(targetEls, { callback })); + const calls = mockIntersectionObserver.mock.calls; + const [observerCallback] = calls[calls.length - 1]; + + const target = getValue(false, 0); + act(() => observerCallback([target])); + expect(callback).toHaveBeenCalledWith(target); + expect(result.current[0]).toBe(false); + expect(result.current[1]).toBe(0); + + const target1 = getValue(true, 0.5); + act(() => observerCallback([target1])); + expect(callback).toHaveBeenCalledWith(target1); + expect(result.current[0]).toBe(true); + expect(result.current[1]).toBe(0.5); + }); + + test('should not work when target is null', async () => { + const previousCallsLength = mockIntersectionObserver.mock.calls.length; + renderHook(() => useInViewport(null)); + const currentCallsLength = mockIntersectionObserver.mock.calls.length; + expect(currentCallsLength).toBe(previousCallsLength); + }); + + test('should disconnect when unmount', async () => { + mockIntersectionObserver.mockReturnValue({ + observe: () => null, + disconnect, + }); + const { unmount } = renderHook(() => useInViewport(targetEl)); + unmount(); + expect(disconnect).toBeCalled(); + }); +}); diff --git a/packages/hooks/src/useInViewport/__tests__/index.test.ts b/packages/hooks/src/useInViewport/__tests__/index.test.ts deleted file mode 100644 index 51ba4bcdeb..0000000000 --- a/packages/hooks/src/useInViewport/__tests__/index.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import useInViewport from '../index'; -import { renderHook, act } from '@testing-library/react-hooks'; - -const targetEl = document.createElement('div'); -document.body.appendChild(targetEl); - -const mockIntersectionObserver = jest.fn().mockReturnValue({ - observe: () => null, - disconnect: () => null, -}); - -window.IntersectionObserver = mockIntersectionObserver; - -describe('useInViewport', () => { - it('should work when target is in viewport', async () => { - const { result } = renderHook(() => useInViewport(targetEl)); - const calls = mockIntersectionObserver.mock.calls; - const [onChange] = calls[calls.length - 1]; - - act(() => { - onChange([ - { - targetEl, - isIntersecting: true, - intersectionRatio: 0.5, - }, - ]); - }); - - const [inViewport, ratio] = result.current; - expect(inViewport).toBeTruthy(); - expect(ratio).toBe(0.5); - }); - - it('should not work when target is null', async () => { - renderHook(() => useInViewport(null)); - const calls = mockIntersectionObserver.mock.calls; - expect(calls[calls.length - 1]).toBeUndefined(); - }); - - it('should disconnect when unmount', async () => { - const disconnect = jest.fn(); - mockIntersectionObserver.mockReturnValue({ - observe: () => null, - disconnect, - }); - const { unmount } = renderHook(() => useInViewport(targetEl)); - unmount(); - expect(disconnect).toBeCalled(); - }); -}); diff --git a/packages/hooks/src/useInViewport/demo/demo1.tsx b/packages/hooks/src/useInViewport/demo/demo1.tsx index fc518cf312..89cb774bd2 100644 --- a/packages/hooks/src/useInViewport/demo/demo1.tsx +++ b/packages/hooks/src/useInViewport/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 监听元素是否在可见区域内 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useInViewport } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useInViewport/demo/demo2.tsx b/packages/hooks/src/useInViewport/demo/demo2.tsx index 47787ccde6..ec5b3c35f1 100644 --- a/packages/hooks/src/useInViewport/demo/demo2.tsx +++ b/packages/hooks/src/useInViewport/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 传入 `options.threshold`, 可以控制在可见区域达到该比例时触发 ratio 更新。
`options.root` 可以控制相对父级元素,在这个例子中,不会相对浏览器视窗变化。 */ -import React from 'react'; import { useInViewport } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useInViewport/demo/demo3.tsx b/packages/hooks/src/useInViewport/demo/demo3.tsx new file mode 100644 index 0000000000..fdb837b7ac --- /dev/null +++ b/packages/hooks/src/useInViewport/demo/demo3.tsx @@ -0,0 +1,92 @@ +/** + * title: Listening content scrolling selection menu + * desc: Pass the `callback` that is triggered when the callback of `IntersectionObserver` is called, so you can do some customization. + * + * title.zh-CN: 监听内容滚动选中菜单 + * desc.zh-CN: 传入 `callback`, 使得 `IntersectionObserver` 的回调被调用时,用户可以做一些自定义操作。 + */ +import { useInViewport, useMemoizedFn } from 'ahooks'; +import { useRef, useState } from 'react'; + +const menus = ['menu-1', 'menu-2', 'menu-3']; +const content = { + 'menu-1': 'Content for menus 1', + 'menu-2': 'Content for menus 2', + 'menu-3': 'Content for menus 3', +}; + +export default () => { + const menuRef = useRef([]); + + const [activeMenu, setActiveMenu] = useState(menus[0]); + + const callback = useMemoizedFn((entry) => { + if (entry.isIntersecting) { + const active = entry.target.getAttribute('id') || ''; + setActiveMenu(active); + } + }); + + const handleMenuClick = (index: number) => { + const contentEl = document.getElementById('content-scroll'); + const top = menuRef.current[index]?.offsetTop; + + contentEl?.scrollTo({ + top, + behavior: 'smooth', + }); + }; + + useInViewport(menuRef.current, { + callback, + root: () => document.getElementById('parent-scroll'), + rootMargin: '-50% 0px -50% 0px', + }); + + return ( + + ); +}; diff --git a/packages/hooks/src/useInViewport/index.en-US.md b/packages/hooks/src/useInViewport/index.en-US.md index 6024dd8e1b..0c2d4ae8d5 100644 --- a/packages/hooks/src/useInViewport/index.en-US.md +++ b/packages/hooks/src/useInViewport/index.en-US.md @@ -17,21 +17,27 @@ Observe whether the element is in the visible area, and the visible area ratio o +### Listening content scrolling selection menu + + + ## API ```typescript +type Target = Element | (() => Element) | React.MutableRefObject; + const [inViewport, ratio] = useInViewport( - target, + target: Target | Target[], options?: Options ); ``` ### Params -| Property | Description | Type | Default | -| -------- | ------------------ | ----------------------------------------------------------- | ------- | -| target | DOM element or ref | `Element` \| `() => Element` \| `MutableRefObject` | - | -| options | Setting | `Options` | - | +| Property | Description | Type | Default | +| -------- | ---------------------------------- | ------------------------ | ------- | +| target | DOM elements or Ref, support array | `Target` \| `Target[]` | - | +| options | Setting | `Options` \| `undefined` | - | ### Options @@ -42,6 +48,7 @@ More information refer to [Intersection Observer API](https://developer.mozilla. | threshold | Either a single number or an array of numbers which indicate at what percentage of the target's visibility the ratio should be executed | `number` \| `number[]` | - | | rootMargin | Margin around the root | `string` | - | | root | The element that is used as the viewport for checking visibility of the target. Must be the ancestor of the target. Defaults to the browser viewport if not specified or if null. | `Element` \| `Document` \| `() => (Element/Document)` \| `MutableRefObject` | - | +| callback | Triggered when the callback of `IntersectionObserver` is called | `(entry: IntersectionObserverEntry) => void` | - | ### Result diff --git a/packages/hooks/src/useInViewport/index.ts b/packages/hooks/src/useInViewport/index.ts index d00930aed5..dbddf13688 100644 --- a/packages/hooks/src/useInViewport/index.ts +++ b/packages/hooks/src/useInViewport/index.ts @@ -4,20 +4,27 @@ import type { BasicTarget } from '../utils/domTarget'; import { getTargetElement } from '../utils/domTarget'; import useEffectWithTarget from '../utils/useEffectWithTarget'; +type CallbackType = (entry: IntersectionObserverEntry) => void; + export interface Options { rootMargin?: string; threshold?: number | number[]; root?: BasicTarget; + callback?: CallbackType; } -function useInViewport(target: BasicTarget, options?: Options) { +function useInViewport(target: BasicTarget | BasicTarget[], options?: Options) { + const { callback, ...option } = options || {}; + const [state, setState] = useState(); const [ratio, setRatio] = useState(); useEffectWithTarget( () => { - const el = getTargetElement(target); - if (!el) { + const targets = Array.isArray(target) ? target : [target]; + const els = targets.map((element) => getTargetElement(element)).filter(Boolean); + + if (!els.length) { return; } @@ -26,21 +33,22 @@ function useInViewport(target: BasicTarget, options?: Options) { for (const entry of entries) { setRatio(entry.intersectionRatio); setState(entry.isIntersecting); + callback?.(entry); } }, { - ...options, + ...option, root: getTargetElement(options?.root), }, ); - observer.observe(el); + els.forEach((el) => observer.observe(el!)); return () => { observer.disconnect(); }; }, - [], + [options?.rootMargin, options?.threshold, callback], target, ); diff --git a/packages/hooks/src/useInViewport/index.zh-CN.md b/packages/hooks/src/useInViewport/index.zh-CN.md index bc06a6992b..3ed14dc2c1 100644 --- a/packages/hooks/src/useInViewport/index.zh-CN.md +++ b/packages/hooks/src/useInViewport/index.zh-CN.md @@ -17,21 +17,27 @@ nav: +### 监听内容滚动选中菜单 + + + ## API ```typescript +type Target = Element | (() => Element) | React.MutableRefObject; + const [inViewport, ratio] = useInViewport( - target, + target: Target | Target[], options?: Options ); ``` ### Params -| 参数 | 说明 | 类型 | 默认值 | -| ------- | ---------------- | ----------------------------------------------------------- | ------ | -| target | DOM 节点或者 ref | `Element` \| `() => Element` \| `MutableRefObject` | - | -| options | 设置 | `Options` | - | +| 参数 | 说明 | 类型 | 默认值 | +| ------- | -------------------------- | ------------------------ | ------ | +| target | DOM 节点或者 Ref,支持数组 | `Target` \| `Target[]` | - | +| options | 设置 | `Options` \| `undefined` | - | ### Options @@ -42,6 +48,7 @@ const [inViewport, ratio] = useInViewport( | threshold | 可以是单一的 number 也可以是 number 数组,target 元素和 root 元素相交程度达到该值的时候 ratio 会被更新 | `number` \| `number[]` | - | | rootMargin | 根(root)元素的外边距 | `string` | - | | root | 指定根(root)元素,用于检查目标的可见性。必须是目标元素的父级元素,如果未指定或者为 null,则默认为浏览器视窗。 | `Element` \| `Document` \| `() => (Element/Document)` \| `MutableRefObject` | - | +| callback | `IntersectionObserver` 的回调被调用时触发 | `(entry: IntersectionObserverEntry) => void` | - | ### Result diff --git a/packages/hooks/src/useInfiniteScroll/__tests__/index.spec.ts b/packages/hooks/src/useInfiniteScroll/__tests__/index.spec.ts new file mode 100644 index 0000000000..cbbb3903dc --- /dev/null +++ b/packages/hooks/src/useInfiniteScroll/__tests__/index.spec.ts @@ -0,0 +1,535 @@ +import { act, renderHook } from '@testing-library/react'; +import { useState } from 'react'; +import { afterAll, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; +import { sleep } from '../../utils/testingHelpers'; +import useInfiniteScroll from '..'; +import type { Data, InfiniteScrollOptions, Service } from '../types'; + +let count = 0; +export async function mockRequest() { + await sleep(1000); + if (count >= 1) { + return { list: [4, 5, 6] }; + } + count++; + return { + list: [1, 2, 3], + nextId: count, + }; +} + +const targetEl = document.createElement('div'); + +// set target property +function setTargetInfo(key: 'scrollTop', value: any) { + Object.defineProperty(targetEl, key, { + value, + configurable: true, + }); +} + +const setup = (service: Service, options?: InfiniteScrollOptions) => + renderHook(() => useInfiniteScroll(service, options)); + +describe('useInfiniteScroll', () => { + let mockRaf: ReturnType; + + beforeEach(() => { + count = 0; + }); + + beforeAll(() => { + vi.useFakeTimers(); + // Mock requestAnimationFrame to execute callbacks immediately + mockRaf = vi + .spyOn(window, 'requestAnimationFrame') + .mockImplementation((cb: FrameRequestCallback) => { + cb(0); + return 0; + }) as ReturnType; + }); + + afterAll(() => { + mockRaf.mockRestore(); + vi.useRealTimers(); + }); + + test('should auto load', async () => { + const { result } = setup(mockRequest); + expect(result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loading).toBe(false); + }); + + test('loadMore should be work', async () => { + const { result } = setup(mockRequest, { manual: true }); + const { loadMore, loading } = result.current; + expect(loading).toBe(false); + act(() => { + loadMore(); + }); + expect(result.current.loadingMore).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loadingMore).toBe(false); + }); + + test('noMore should be true when isNoMore is true', async () => { + const { result } = setup(mockRequest, { + isNoMore: (d) => d?.nextId === undefined, + }); + const { loadMore } = result.current; + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.noMore).toBe(false); + act(() => loadMore()); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.noMore).toBe(true); + }); + + test('should auto load when scroll to bottom', async () => { + const events: Record = {}; + const mockAddEventListener = vi + .spyOn(targetEl, 'addEventListener') + .mockImplementation((eventName: string, callback: any) => { + events[eventName] = callback; + }); + const { result } = setup(mockRequest, { + target: targetEl, + isNoMore: (d) => d?.nextId === undefined, + }); + // not work when loading + expect(result.current.loading).toBe(true); + events['scroll'](); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loading).toBe(false); + const scrollHeightSpy = vi.spyOn(targetEl, 'scrollHeight', 'get').mockImplementation(() => 150); + const clientHeightSpy = vi.spyOn(targetEl, 'clientHeight', 'get').mockImplementation(() => 300); + setTargetInfo('scrollTop', 100); + act(() => { + events['scroll'](); + }); + expect(result.current.loadingMore).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loadingMore).toBe(false); + + // not work when no more + expect(result.current.noMore).toBe(true); + act(() => { + events['scroll'](); + }); + expect(result.current.loadingMore).toBe(false); + // get list by order + expect(result.current.data?.list).toMatchObject([1, 2, 3, 4, 5, 6]); + + mockAddEventListener.mockRestore(); + scrollHeightSpy.mockRestore(); + clientHeightSpy.mockRestore(); + }); + + test('should auto load when scroll to top', async () => { + const events: Record = {}; + const mockAddEventListener = vi + .spyOn(targetEl, 'addEventListener') + .mockImplementation((eventName: string, callback: any) => { + events[eventName] = callback; + }); + // Mock scrollTo using Object.defineProperty + Object.defineProperty(targetEl, 'scrollTo', { + value: (x: number, y: number) => { + setTargetInfo('scrollTop', y); + }, + writable: true, + }); + + const { result } = setup(mockRequest, { + target: targetEl, + direction: 'top', + isNoMore: (d) => d?.nextId === undefined, + }); + // not work when loading + expect(result.current.loading).toBe(true); + events['scroll'](); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loading).toBe(false); + + // mock first scroll + const scrollHeightSpy = vi.spyOn(targetEl, 'scrollHeight', 'get').mockImplementation(() => 150); + const clientHeightSpy = vi.spyOn(targetEl, 'clientHeight', 'get').mockImplementation(() => 500); + setTargetInfo('scrollTop', 300); + + act(() => { + events['scroll'](); + }); + // mock scroll upward + setTargetInfo('scrollTop', 50); + + act(() => { + events['scroll'](); + }); + + expect(result.current.loadingMore).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.loadingMore).toBe(false); + //reverse order + expect(result.current.data?.list).toMatchObject([4, 5, 6, 1, 2, 3]); + + // not work when no more + expect(result.current.noMore).toBe(true); + act(() => { + events['scroll'](); + }); + expect(result.current.loadingMore).toBe(false); + + mockAddEventListener.mockRestore(); + scrollHeightSpy.mockRestore(); + clientHeightSpy.mockRestore(); + }); + + test('reload should be work', async () => { + const fn = vi.fn(() => Promise.resolve({ list: [] })); + const { result } = setup(fn); + const { reload } = result.current; + expect(fn).toBeCalledTimes(1); + act(() => reload()); + expect(fn).toBeCalledTimes(2); + await act(async () => { + Promise.resolve(); + }); + }); + + test('reload should be triggered when reloadDeps change', async () => { + const fn = vi.fn(() => Promise.resolve({ list: [] })); + const { result } = renderHook(() => { + const [value, setValue] = useState(''); + const res = useInfiniteScroll(fn, { + reloadDeps: [value], + }); + return { + ...res, + setValue, + }; + }); + expect(fn).toBeCalledTimes(1); + act(() => { + result.current.setValue('ahooks'); + }); + expect(fn).toBeCalledTimes(2); + await act(async () => { + Promise.resolve(); + }); + }); + + test('reload data should be latest', async () => { + let listCount = 5; + const mockRequestFn = async () => { + await sleep(1000); + return { + list: Array.from({ + length: listCount, + }).map((_, index) => index + 1), + nextId: listCount, + hasMore: listCount > 2, + }; + }; + + const { result } = setup(mockRequestFn); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.data).toMatchObject({ list: [1, 2, 3, 4, 5], nextId: 5 }); + + listCount = 3; + await act(async () => { + result.current.reload(); + vi.advanceTimersByTime(1000); + }); + + expect(result.current.data).toMatchObject({ list: [1, 2, 3], nextId: 3 }); + }); + + test('mutate should be work', async () => { + const { result } = setup(mockRequest); + const { mutate } = result.current; + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.data).toMatchObject({ list: [1, 2, 3], nextId: 1 }); + const newData = { + list: [1, 2], + nextId: 1, + }; + act(() => mutate(newData)); + expect(result.current.data).toMatchObject(newData); + }); + + test('cancel should be work', () => { + const onSuccess = vi.fn(); + const { result } = setup(mockRequest, { + onSuccess, + }); + const { cancel } = result.current; + expect(result.current.loading).toBe(true); + act(() => cancel()); + expect(result.current.loading).toBe(false); + expect(onSuccess).not.toBeCalled(); + }); + + test('onBefore/onSuccess/onFinally should be called', async () => { + const onBefore = vi.fn(); + const onSuccess = vi.fn(); + const onFinally = vi.fn(); + setup(mockRequest, { + onBefore, + onSuccess, + onFinally, + }); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(onBefore).toBeCalled(); + expect(onSuccess).toBeCalled(); + expect(onFinally).toBeCalled(); + }); + + test('onError should be called when throw error', async () => { + const onError = vi.fn(); + const mockRequestError = () => { + return Promise.reject('error'); + }; + setup(mockRequestError, { + onError, + }); + await act(async () => { + Promise.resolve(); + }); + expect(onError).toBeCalled(); + }); + + test('loadMoreAsync should be work', async () => { + const { result } = setup(mockRequest, { + manual: true, + }); + const { loadMoreAsync } = result.current; + act(() => { + loadMoreAsync().then((res) => { + expect(res).toMatchObject({ list: [1, 2, 3], nextId: 1 }); + expect(result.current.loading).toBe(false); + }); + }); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + }); + + test('reloadAsync should be work', async () => { + const fn = vi.fn(() => Promise.resolve({ list: [] })); + const { result } = setup(fn); + const { reloadAsync } = result.current; + expect(fn).toBeCalledTimes(1); + + act(() => { + reloadAsync().then(() => { + expect(fn).toBeCalledTimes(2); + }); + }); + await act(async () => { + Promise.resolve(); + }); + }); + + test('loading should be true when reload after loadMore', async () => { + const { result } = setup(mockRequest); + expect(result.current.loading).toBeTruthy(); + const { reload, loadMore } = result.current; + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.loading).toBeFalsy(); + + act(() => { + loadMore(); + reload(); + }); + expect(result.current.loading).toBeTruthy(); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.loading).toBeFalsy(); + }); + + test('loading should be true when reloadAsync after loadMore', async () => { + const { result } = setup(mockRequest); + expect(result.current.loading).toBeTruthy(); + const { reloadAsync, loadMore } = result.current; + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.loading).toBeFalsy(); + + act(() => { + loadMore(); + reloadAsync(); + }); + expect(result.current.loading).toBeTruthy(); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.loading).toBeFalsy(); + }); + + test('list can be null or undefined', async () => { + // @ts-ignore + const { result } = setup(async () => { + await sleep(1000); + count++; + return { + list: Math.random() < 0.5 ? null : undefined, + nextId: count, + }; + }); + + expect(result.current.loading).toBeTruthy(); + + const { loadMore } = result.current; + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.loading).toBeFalsy(); + + act(() => { + loadMore(); + }); + }); + + test('error result', async () => { + const { result } = setup(async () => { + throw new Error('error message'); + }); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.error?.message).toBe('error message'); + }); + + test('reloadAsync should reset data and restart from page=1', async () => { + const PAGE_SIZE = 2; + + // Vitest 的 mock + const getLoadMoreListMock = vi.fn((page: number, pageSize: number) => { + const start = (page - 1) * pageSize + 1; + const list = Array.from({ length: pageSize }, (_, i) => start + i); + return Promise.resolve({ list }); + }); + + const { result } = renderHook(() => + useInfiniteScroll((d) => { + const page = d ? Math.ceil(d.list.length / PAGE_SIZE) + 1 : 1; + return getLoadMoreListMock(page, PAGE_SIZE); + }), + ); + + await act(async () => { + await result.current.loadMoreAsync(); + }); + expect(getLoadMoreListMock).toHaveBeenLastCalledWith(1, PAGE_SIZE); + expect(result.current.data?.list.length).toBe(2); + + await act(async () => { + await result.current.loadMoreAsync(); + }); + expect(getLoadMoreListMock).toHaveBeenLastCalledWith(2, PAGE_SIZE); + expect(result.current.data?.list.length).toBe(4); + + await act(async () => { + await result.current.reloadAsync(); + }); + expect(getLoadMoreListMock).toHaveBeenLastCalledWith(1, PAGE_SIZE); + expect(result.current.data?.list.length).toBe(2); + expect(result.current.data?.list).toEqual([1, 2]); + }); + + test('service should be called only once when scrolling to bottom multiple times quickly', async () => { + const mockService = vi.fn(async () => { + await sleep(1000); + return { list: [1, 2, 3], nextId: 1 }; + }); + + const events: Record = {}; + const mockAddEventListener = vi + .spyOn(targetEl, 'addEventListener') + .mockImplementation((eventName: string, callback: any) => { + events[eventName] = callback; + }); + + const scrollHeightSpy = vi.spyOn(targetEl, 'scrollHeight', 'get').mockImplementation(() => 150); + const clientHeightSpy = vi.spyOn(targetEl, 'clientHeight', 'get').mockImplementation(() => 100); + + const { result } = setup(mockService, { + target: targetEl, + isNoMore: (d) => d?.nextId === undefined, + }); + + // Wait for initial load to complete + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loading).toBe(false); + expect(mockService).toHaveBeenCalledTimes(1); + + // Set scroll position to bottom (scrollHeight - scrollTop <= clientHeight + threshold) + // 150 - 50 = 100 <= 100 + 100 = 200, so it should trigger loadMore + setTargetInfo('scrollTop', 50); + + // Trigger scroll event multiple times quickly (before first request completes) + act(() => { + events['scroll'](); + }); + + // Service should be called once more (total 2 times: initial + loadMore) + expect(mockService).toHaveBeenCalledTimes(2); + + // Trigger more scroll events while loading + act(() => { + events['scroll'](); + }); + act(() => { + events['scroll'](); + }); + act(() => { + events['scroll'](); + }); + + // Service should still only be called twice (no additional calls during loading) + expect(mockService).toHaveBeenCalledTimes(2); + + mockAddEventListener.mockRestore(); + scrollHeightSpy.mockRestore(); + clientHeightSpy.mockRestore(); + }); +}); diff --git a/packages/hooks/src/useInfiniteScroll/__tests__/index.test.ts b/packages/hooks/src/useInfiniteScroll/__tests__/index.test.ts deleted file mode 100644 index 5eabca5264..0000000000 --- a/packages/hooks/src/useInfiniteScroll/__tests__/index.test.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { useState } from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; -import useInfiniteScroll from '..'; -import type { Data, Service, InfiniteScrollOptions } from '../types'; -import { sleep } from '../../utils/testingHelpers'; - -let count = 0; -export async function mockRequest() { - await sleep(1000); - if (count >= 1) { - return { list: [] }; - } - count++; - return { - list: [1, 2, 3], - nextId: count, - }; -} - -const targetEl = document.createElement('div'); - -const setup = (service: Service, options?: InfiniteScrollOptions) => - renderHook(() => useInfiniteScroll(service, options)); - -describe('useInfiniteScroll', () => { - beforeEach(() => { - count = 0; - }); - - beforeAll(() => { - jest.useFakeTimers(); - }); - - afterAll(() => { - jest.useRealTimers(); - }); - - it('should auto load', async () => { - const { result } = setup(mockRequest); - expect(result.current.loading).toBeTruthy(); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.loading).toBeFalsy(); - }); - - it('loadMore should be work', async () => { - const { result } = setup(mockRequest, { manual: true }); - const { loadMore, loading } = result.current; - expect(loading).toBeFalsy(); - act(() => { - loadMore(); - }); - expect(result.current.loadingMore).toBeTruthy(); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.loadingMore).toBeFalsy(); - }); - - it('noMore should be true when isNoMore is true', async () => { - const { result } = setup(mockRequest, { - isNoMore: (d) => d?.nextId === undefined, - }); - const { loadMore } = result.current; - await act(async () => { - jest.advanceTimersByTime(1000); - }); - - expect(result.current.noMore).toBeFalsy(); - act(() => loadMore()); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.noMore).toBeTruthy(); - }); - - it('should auto load when scroll to bottom', async () => { - const events = {}; - const mockAddEventListener = jest - .spyOn(targetEl, 'addEventListener') - .mockImplementation((eventName, callback) => { - events[eventName] = callback; - }); - const { result } = setup(mockRequest, { - target: targetEl, - isNoMore: (d) => d?.nextId === undefined, - }); - // not work when loading - expect(result.current.loading).toBeTruthy(); - events['scroll'](); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.loading).toBeFalsy(); - - // mock scroll - Object.defineProperties(targetEl, { - clientHeight: { - value: 150, - }, - scrollHeight: { - value: 300, - }, - scrollTop: { - value: 100, - }, - }); - act(() => { - events['scroll'](); - }); - expect(result.current.loadingMore).toBeTruthy(); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.loadingMore).toBeFalsy(); - - // not work when no more - expect(result.current.noMore).toBeTruthy(); - act(() => { - events['scroll'](); - }); - expect(result.current.loadingMore).toBeFalsy(); - - mockAddEventListener.mockRestore(); - }); - - it('reload should be work', async () => { - const fn = jest.fn(() => Promise.resolve({ list: [] })); - const { result } = setup(fn); - const { reload } = result.current; - expect(fn).toBeCalledTimes(1); - act(() => reload()); - expect(fn).toBeCalledTimes(2); - await act(async () => { - Promise.resolve(); - }); - }); - - it('reload should be triggered when reloadDeps change', async () => { - const fn = jest.fn(() => Promise.resolve({ list: [] })); - const { result } = renderHook(() => { - const [value, setValue] = useState(''); - const res = useInfiniteScroll(fn, { - reloadDeps: [value], - }); - return { - ...res, - setValue, - }; - }); - expect(fn).toBeCalledTimes(1); - act(() => { - result.current.setValue('ahooks'); - }); - expect(fn).toBeCalledTimes(2); - await act(async () => { - Promise.resolve(); - }); - }); - - it('mutate should be work', async () => { - const { result } = setup(mockRequest); - const { mutate } = result.current; - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.data).toMatchObject({ list: [1, 2, 3], nextId: 1 }); - const newData = { - list: [1, 2], - nextId: 1, - }; - act(() => mutate(newData)); - expect(result.current.data).toMatchObject(newData); - }); - - it('cancel should be work', () => { - const onSuccess = jest.fn(); - const { result } = setup(mockRequest, { - onSuccess, - }); - const { cancel } = result.current; - expect(result.current.loading).toBeTruthy(); - act(() => cancel()); - expect(result.current.loading).toBeFalsy(); - expect(onSuccess).not.toBeCalled(); - }); - - it('onBefore/onSuccess/onFinally should be called', async () => { - const onBefore = jest.fn(); - const onSuccess = jest.fn(); - const onFinally = jest.fn(); - const { result } = setup(mockRequest, { - onBefore, - onSuccess, - onFinally, - }); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(onBefore).toBeCalled(); - expect(onSuccess).toBeCalled(); - expect(onFinally).toBeCalled(); - }); - - it('onError should be called when throw error', async () => { - const onError = jest.fn(); - const mockRequestError = () => { - return Promise.reject('error'); - }; - setup(mockRequestError, { - onError, - }); - await act(async () => { - Promise.resolve(); - }); - expect(onError).toBeCalled(); - }); - - it('loadMoreAsync should be work', async () => { - const { result } = setup(mockRequest, { - manual: true, - }); - const { loadMoreAsync } = result.current; - act(() => { - loadMoreAsync().then((res) => { - expect(res).toMatchObject({ list: [1, 2, 3], nextId: 1 }); - expect(result.current.loading).toBeFalsy(); - }); - }); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - }); - - it('reloadAsync should be work', async () => { - const fn = jest.fn(() => Promise.resolve({ list: [] })); - const { result } = setup(fn); - const { reloadAsync } = result.current; - expect(fn).toBeCalledTimes(1); - - act(() => { - reloadAsync().then(() => { - expect(fn).toBeCalledTimes(2); - }); - }); - await act(async () => { - Promise.resolve(); - }); - }); -}); diff --git a/packages/hooks/src/useInfiniteScroll/demo/default.tsx b/packages/hooks/src/useInfiniteScroll/demo/default.tsx index e25257d5a3..424555d457 100644 --- a/packages/hooks/src/useInfiniteScroll/demo/default.tsx +++ b/packages/hooks/src/useInfiniteScroll/demo/default.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useInfiniteScroll } from 'ahooks'; interface Result { diff --git a/packages/hooks/src/useInfiniteScroll/demo/mutate.tsx b/packages/hooks/src/useInfiniteScroll/demo/mutate.tsx index 73c6c97d70..476923d2c6 100644 --- a/packages/hooks/src/useInfiniteScroll/demo/mutate.tsx +++ b/packages/hooks/src/useInfiniteScroll/demo/mutate.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useInfiniteScroll, useRequest } from 'ahooks'; interface Result { diff --git a/packages/hooks/src/useInfiniteScroll/demo/pagination.tsx b/packages/hooks/src/useInfiniteScroll/demo/pagination.tsx index 747a2f8c6a..d7f583f786 100644 --- a/packages/hooks/src/useInfiniteScroll/demo/pagination.tsx +++ b/packages/hooks/src/useInfiniteScroll/demo/pagination.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useInfiniteScroll } from 'ahooks'; interface Result { diff --git a/packages/hooks/src/useInfiniteScroll/demo/reload.tsx b/packages/hooks/src/useInfiniteScroll/demo/reload.tsx index d78c3de18e..d850dfd666 100644 --- a/packages/hooks/src/useInfiniteScroll/demo/reload.tsx +++ b/packages/hooks/src/useInfiniteScroll/demo/reload.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useInfiniteScroll } from 'ahooks'; interface Result { diff --git a/packages/hooks/src/useInfiniteScroll/demo/scroll.tsx b/packages/hooks/src/useInfiniteScroll/demo/scroll.tsx index d0a04643e8..aa1681eddb 100644 --- a/packages/hooks/src/useInfiniteScroll/demo/scroll.tsx +++ b/packages/hooks/src/useInfiniteScroll/demo/scroll.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useInfiniteScroll } from 'ahooks'; interface Result { diff --git a/packages/hooks/src/useInfiniteScroll/demo/scrollTop.tsx b/packages/hooks/src/useInfiniteScroll/demo/scrollTop.tsx new file mode 100644 index 0000000000..000e85ebc8 --- /dev/null +++ b/packages/hooks/src/useInfiniteScroll/demo/scrollTop.tsx @@ -0,0 +1,95 @@ +import { useRef } from 'react'; +import { useInfiniteScroll } from 'ahooks'; + +interface Result { + list: string[]; + nextId: string | undefined; +} + +const resultData = [ + '15', + '14', + '13', + '12', + '11', + '10', + '9', + '8', + '7', + '6', + '5', + '4', + '3', + '2', + '1', + '0', +]; + +function getLoadMoreList(nextId: string | undefined, limit: number): Promise { + let start = 0; + if (nextId) { + start = resultData.findIndex((i) => i === nextId); + } + const end = start + limit; + const list = resultData.slice(start, end).reverse(); + const nId = resultData.length >= end ? resultData[end] : undefined; + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + list, + nextId: nId, + }); + }, 1000); + }); +} + +export default () => { + const ref = useRef(null); + const isFirstIn = useRef(true); + + const { data, loading, loadMore, loadingMore, noMore } = useInfiniteScroll( + (d) => getLoadMoreList(d?.nextId, 5), + { + target: ref, + direction: 'top', + threshold: 0, + isNoMore: (d) => d?.nextId === undefined, + onSuccess() { + if (isFirstIn.current) { + isFirstIn.current = false; + setTimeout(() => { + const el = ref.current; + if (el) { + el.scrollTo(0, 999999); + } + }); + } + }, + }, + ); + + return ( +
+ {loading ? ( +

loading

+ ) : ( +
+
+ {!noMore && ( + + )} + + {noMore && No more data} +
+ {data?.list?.map((item) => ( +
+ item-{item} +
+ ))} +
+ )} +
+ ); +}; diff --git a/packages/hooks/src/useInfiniteScroll/index.en-US.md b/packages/hooks/src/useInfiniteScroll/index.en-US.md index f5bbdd1a99..9d3a58fd33 100644 --- a/packages/hooks/src/useInfiniteScroll/index.en-US.md +++ b/packages/hooks/src/useInfiniteScroll/index.en-US.md @@ -36,9 +36,14 @@ In the infinite scrolling scenario, the most common case is to automatically loa - `options.target` specifies the parent element, The parent element needs to set a fixed height and support internal scrolling - `options.isNoMore` determines if there is no more data +- `options.direction` determines the direction of scrolling, the default is `bottom` +the scroll to bottom demo +the scroll to top demo + + ## Data reset The data can be reset by `reload`. The following example shows that after the `filter` changes, the data is reset to the first page. @@ -69,6 +74,7 @@ const { data: TData; loading: boolean; loadingMore: boolean; + error?: Error; noMore: boolean; loadMore: () => void; loadMoreAsync: () => Promise; @@ -100,6 +106,7 @@ const { | loading | Is the first request in progress | `boolean` | | loadingMore | Is more data request in progress | `boolean` | | noMore | Whether there is no more data, it will take effect after configuring `options.isNoMore` | `boolean` | +| error | Request error message | `Error` | | loadMore | Load more data, it will automatically catch the exception, and handle it through `options.onError` | `() => void` | | loadMoreAsync | Load more data, which is consistent with the behavior of `loadMore`, but returns Promise, so you need to handle the exception yourself | `() => Promise` | | reload | Load the first page of data, it will automatically catch the exception, and handle it through `options.onError` | `() => void` | @@ -109,14 +116,15 @@ const { ### Options -| Property | Description | Type | Default | -| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------- | -| target | specifies the parent element. If it exists, it will trigger the `loadMore` when scrolling to the bottom. Needs to work with `isNoMore` to know when there is no more data to load | `() => Element` \| `Element` \| `MutableRefObject` | - | -| isNoMore | determines if there is no more data, the input parameter is the latest merged `data` | `(data?: TData) => boolean` | - | -| threshold | The pixel threshold to the bottom for the scrolling to load | `number` | `100` | -| reloadDeps | When the content of the array changes, `reload` will be triggered | `any[]` | - | -| manual |
  • The default is `false`. That is, the service is automatically executed during initialization.
  • If set to `true`, you need to manually call `run` or `runAsync` to trigger execution
| `boolean` | `false` | -| onBefore | Triggered before service execution | `() => void` | - | -| onSuccess | Triggered when service resolve | `(data: TData) => void` | - | -| onError | Triggered when service reject | `(e: Error) => void` | - | -| onFinally | Triggered when service execution is complete | `(data?: TData, e?: Error) => void` | - | +| Property | Description | Type | Default | +| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -------- | +| target | specifies the parent element. If it exists, it will trigger the `loadMore` when scrolling to the bottom. Needs to work with `isNoMore` to know when there is no more data to load. **when target is document, it is defined as the entire viewport** | `() => Element` \| `Element` \| `MutableRefObject` | - | +| isNoMore | determines if there is no more data, the input parameter is the latest merged `data` | `(data?: TData) => boolean` | - | +| threshold | The pixel threshold to the bottom for the scrolling to load | `number` | `100` | +| direction | The direction of the scrolling | `bottom` \|`top` | `bottom` | +| reloadDeps | When the content of the array changes, `reload` will be triggered | `any[]` | - | +| manual |
  • The default is `false`. That is, the service is automatically executed during initialization.
  • If set to `true`, you need to manually call `run` or `runAsync` to trigger execution
| `boolean` | `false` | +| onBefore | Triggered before service execution | `() => void` | - | +| onSuccess | Triggered when service resolve | `(data: TData) => void` | - | +| onError | Triggered when service reject | `(e: Error) => void` | - | +| onFinally | Triggered when service execution is complete | `(data?: TData, e?: Error) => void` | - | diff --git a/packages/hooks/src/useInfiniteScroll/index.tsx b/packages/hooks/src/useInfiniteScroll/index.tsx index abc0735dd5..ba74035b7e 100644 --- a/packages/hooks/src/useInfiniteScroll/index.tsx +++ b/packages/hooks/src/useInfiniteScroll/index.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react'; +import { useMemo, useRef, useState } from 'react'; import useEventListener from '../useEventListener'; import useMemoizedFn from '../useMemoizedFn'; import useRequest from '../useRequest'; @@ -15,6 +15,7 @@ const useInfiniteScroll = ( target, isNoMore, threshold = 100, + direction = 'bottom', reloadDeps = [], manual, onBefore, @@ -25,58 +26,99 @@ const useInfiniteScroll = ( const [finalData, setFinalData] = useState(); const [loadingMore, setLoadingMore] = useState(false); + const isScrollToTop = direction === 'top'; + // lastScrollTop is used to determine whether the scroll direction is up or down + const lastScrollTop = useRef(undefined); + // scrollBottom is used to record the distance from the bottom of the scroll bar + const scrollBottom = useRef(0); const noMore = useMemo(() => { - if (!isNoMore) return false; + if (!isNoMore) { + return false; + } return isNoMore(finalData); }, [finalData]); - const { loading, run, runAsync, cancel } = useRequest( + const { loading, error, run, runAsync, cancel } = useRequest( async (lastData?: TData) => { const currentData = await service(lastData); - if (!lastData) { - setFinalData(currentData); - } else { - setFinalData({ - ...currentData, - // @ts-ignore - list: [...lastData.list, ...currentData.list], - }); - } - return currentData; + return { currentData, lastData }; }, { manual, onFinally: (_, d, e) => { setLoadingMore(false); - onFinally?.(d, e); + onFinally?.(d?.currentData, e); }, onBefore: () => onBefore?.(), onSuccess: (d) => { + if (!d.lastData) { + setFinalData({ + ...d.currentData, + list: [...(d.currentData.list ?? [])], + }); + } else { + setFinalData({ + ...d.currentData, + list: isScrollToTop + ? [...d.currentData.list, ...(d.lastData.list ?? [])] + : [...(d.lastData.list ?? []), ...d.currentData.list], + }); + } + setTimeout(() => { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - scrollMethod(); + // use requestAnimationFrame to ensure the scroll position is updated (To ensure compatibility react 19) + requestAnimationFrame(() => { + if (isScrollToTop) { + let el = getTargetElement(target); + el = el === document ? document.documentElement : el; + if (el) { + const scrollHeight = getScrollHeight(el); + (el as Element).scrollTo(0, scrollHeight - scrollBottom.current); + } + } else { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + scrollMethod(); + } + }); }); - onSuccess?.(d); + + onSuccess?.(d.currentData); }, onError: (e) => onError?.(e), }, ); - const loadMore = () => { - if (noMore) return; + const loadMore = useMemoizedFn(() => { + if (noMore) { + return; + } setLoadingMore(true); run(finalData); + }); + + const runAsyncForCurrent = async (data?: TData) => { + const res = await runAsync(data); + return res.currentData; }; - const loadMoreAsync = () => { - if (noMore) return Promise.reject(); + const loadMoreAsync = useMemoizedFn(() => { + if (noMore) { + return Promise.reject(); + } setLoadingMore(true); - return runAsync(finalData); + return runAsyncForCurrent(finalData); + }); + + const reload = () => { + setLoadingMore(false); + return run(); }; - const reload = () => run(); - const reloadAsync = () => runAsync(); + const reloadAsync = () => { + setLoadingMore(false); + return runAsyncForCurrent(); + }; const scrollMethod = () => { const el = getTargetElement(target); @@ -84,11 +126,22 @@ const useInfiniteScroll = ( return; } - const scrollTop = getScrollTop(el); - const scrollHeight = getScrollHeight(el); - const clientHeight = getClientHeight(el); + const targetEl = el === document ? document.documentElement : el; + const scrollTop = getScrollTop(targetEl); + const scrollHeight = getScrollHeight(targetEl); + const clientHeight = getClientHeight(targetEl); - if (scrollHeight - scrollTop <= clientHeight + threshold) { + if (isScrollToTop) { + if ( + lastScrollTop.current !== undefined && + lastScrollTop.current > scrollTop && + scrollTop <= threshold + ) { + loadMore(); + } + lastScrollTop.current = scrollTop; + scrollBottom.current = scrollHeight - scrollTop; + } else if (scrollHeight - scrollTop <= clientHeight + threshold) { loadMore(); } }; @@ -111,11 +164,12 @@ const useInfiniteScroll = ( return { data: finalData, loading: !loadingMore && loading, + error, loadingMore, noMore, - loadMore: useMemoizedFn(loadMore), - loadMoreAsync: useMemoizedFn(loadMoreAsync), + loadMore, + loadMoreAsync, reload: useMemoizedFn(reload), reloadAsync: useMemoizedFn(reloadAsync), mutate: setFinalData, diff --git a/packages/hooks/src/useInfiniteScroll/index.zh-CN.md b/packages/hooks/src/useInfiniteScroll/index.zh-CN.md index b84350e409..e60dcc2a83 100644 --- a/packages/hooks/src/useInfiniteScroll/index.zh-CN.md +++ b/packages/hooks/src/useInfiniteScroll/index.zh-CN.md @@ -16,7 +16,7 @@ useInfiniteScroll 的第一个参数 `service` 是一个异步函数,对这个 1. `service` 返回的数据必须包含 `list` 数组,类型为 `{ list: any[], ...rest }` 2. `service` 的入参为整合后的最新 `data` -假如第一次请求返回数据为 `{ list: [1, 2, 3], nextId: 4 }`, 第二次返回的数据为 `{ list: [4, 5, 6], nextId: 7 }`, 则我们会自动合并 `list`,整合后的的 `data` 为 `{ list: [1, 2, 3, 4, 5, 6], nextId: 7 }`。 +假如第一次请求返回数据为 `{ list: [1, 2, 3], nextId: 4 }`, 第二次返回的数据为 `{ list: [4, 5, 6], nextId: 7 }`, 则我们会自动合并 `list`,整合后的 `data` 为 `{ list: [1, 2, 3, 4, 5, 6], nextId: 7 }`。 ## 基础用法 @@ -36,9 +36,14 @@ useInfiniteScroll 的第一个参数 `service` 是一个异步函数,对这个 - `options.target` 指定父级元素(父级元素需设置固定高度,且支持内部滚动) - `options.isNoMore` 判断是不是没有更多数据了 +- `options.direction` 滚动的方向,默认为向下滚动 +向下滚动示例 +向上滚动示例 + + ## 数据重置 通过 `reload` 即可实现数据重置,下面示例我们演示在 `filter` 变化后,重置数据到第一页。 @@ -69,6 +74,7 @@ const { data: TData; loading: boolean; loadingMore: boolean; + error?: Error; noMore: boolean; loadMore: () => void; loadMoreAsync: () => Promise; @@ -100,6 +106,7 @@ const { | loading | 是否正在进行首次请求 | `boolean` | | loadingMore | 是否正在进行更多数据请求 | `boolean` | | noMore | 是否没有更多数据了,配置 `options.isNoMore` 后生效 | `boolean` | +| error | 请求错误消息 | `Error` | | loadMore | 加载更多数据,会自动捕获异常,通过 `options.onError` 处理 | `() => void` | | loadMoreAsync | 加载更多数据,与 `loadMore` 行为一致,但返回的是 Promise,需要自行处理异常 | `() => Promise` | | reload | 加载第一页数据,会自动捕获异常,通过 `options.onError` 处理 | `() => void` | @@ -109,14 +116,15 @@ const { ### Options -| 参数 | 说明 | 类型 | 默认值 | -| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ------- | -| target | 父级容器,如果存在,则在滚动到底部时,自动触发 `loadMore`。需要配合 `isNoMore` 使用,以便知道什么时候到最后一页了。 | `() => Element` \| `Element` \| `MutableRefObject` | - | -| isNoMore | 是否有最后一页的判断逻辑,入参为当前聚合后的 `data` | `(data?: TData) => boolean` | - | -| threshold | 下拉自动加载,距离底部距离阈值 | `number` | `100` | -| reloadDeps | 变化后,会自动触发 `reload` | `any[]` | - | -| manual |
  • 默认 `false`。 即在初始化时自动执行 service。
  • 如果设置为 `true`,则需要手动调用 `reload` 或 `reloadAsync` 触发执行。
| `boolean` | `false` | -| onBefore | service 执行前触发 | `() => void` | - | -| onSuccess | service resolve 时触发 | `(data: TData) => void` | - | -| onError | service reject 时触发 | `(e: Error) => void` | - | -| onFinally | service 执行完成时触发 | `(data?: TData, e?: Error) => void` | - | +| 参数 | 说明 | 类型 | 默认值 | +| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -------- | +| target | 父级容器,如果存在,则在滚动到底部时,自动触发 `loadMore`。需要配合 `isNoMore` 使用,以便知道什么时候到最后一页了。 **当 target 为 document 时,定义为整个视口** | `() => Element` \| `Element` \| `MutableRefObject` | - | +| isNoMore | 是否有最后一页的判断逻辑,入参为当前聚合后的 `data` | `(data?: TData) => boolean` | - | +| threshold | 下拉自动加载,距离底部距离阈值 | `number` | `100` | +| direction | 滚动的方向 | `bottom` \| `top` | `bottom` | +| reloadDeps | 变化后,会自动触发 `reload` | `any[]` | - | +| manual |
  • 默认 `false`。 即在初始化时自动执行 service。
  • 如果设置为 `true`,则需要手动调用 `reload` 或 `reloadAsync` 触发执行。
| `boolean` | `false` | +| onBefore | service 执行前触发 | `() => void` | - | +| onSuccess | service resolve 时触发 | `(data: TData) => void` | - | +| onError | service reject 时触发 | `(e: Error) => void` | - | +| onFinally | service 执行完成时触发 | `(data?: TData, e?: Error) => void` | - | diff --git a/packages/hooks/src/useInfiniteScroll/types.ts b/packages/hooks/src/useInfiniteScroll/types.ts index 18e5b9da3a..251e81130c 100644 --- a/packages/hooks/src/useInfiniteScroll/types.ts +++ b/packages/hooks/src/useInfiniteScroll/types.ts @@ -3,12 +3,13 @@ import type { BasicTarget } from '../utils/domTarget'; export type Data = { list: any[]; [key: string]: any }; -export type Service = (currentData?: Data) => Promise; +export type Service = (currentData?: TData) => Promise; export interface InfiniteScrollResult { data: TData; loading: boolean; loadingMore: boolean; + error?: Error; noMore: boolean; loadMore: () => void; @@ -23,6 +24,7 @@ export interface InfiniteScrollOptions { target?: BasicTarget; isNoMore?: (data?: TData) => boolean; threshold?: number; + direction?: 'bottom' | 'top'; manual?: boolean; reloadDeps?: DependencyList; diff --git a/packages/hooks/src/useInterval/__tests__/index.test.ts b/packages/hooks/src/useInterval/__tests__/index.spec.ts similarity index 63% rename from packages/hooks/src/useInterval/__tests__/index.test.ts rename to packages/hooks/src/useInterval/__tests__/index.spec.ts index 4797e1733d..64745c8437 100644 --- a/packages/hooks/src/useInterval/__tests__/index.test.ts +++ b/packages/hooks/src/useInterval/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; import useInterval from '../index'; interface ParamsObj { @@ -11,46 +12,46 @@ const setUp = ({ fn, delay, options }: ParamsObj) => renderHook(() => useInterval(fn, delay, options)); describe('useInterval', () => { - jest.useFakeTimers(); - jest.spyOn(global, 'clearInterval'); + vi.useFakeTimers(); + vi.spyOn(global, 'clearInterval'); - it('interval should work', () => { - const callback = jest.fn(); + test('interval should work', () => { + const callback = vi.fn(); setUp({ fn: callback, delay: 20 }); expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(70); + vi.advanceTimersByTime(70); expect(callback).toHaveBeenCalledTimes(3); }); - it('interval should stop', () => { - const callback = jest.fn(); + test('interval should stop', () => { + const callback = vi.fn(); setUp({ fn: callback, delay: undefined }); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); expect(callback).toHaveBeenCalledTimes(0); setUp({ fn: callback, delay: -2 }); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); expect(callback).toHaveBeenCalledTimes(0); }); - it('immediate in options should work', () => { - const callback = jest.fn(); + test('immediate in options should work', () => { + const callback = vi.fn(); setUp({ fn: callback, delay: 20, options: { immediate: true } }); expect(callback).toBeCalled(); expect(callback).toHaveBeenCalledTimes(1); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); expect(callback).toHaveBeenCalledTimes(3); }); - it('interval should be clear', () => { - const callback = jest.fn(); + test('interval should be clear', () => { + const callback = vi.fn(); const hook = setUp({ fn: callback, delay: 20 }); expect(callback).not.toBeCalled(); hook.result.current(); - jest.advanceTimersByTime(70); + vi.advanceTimersByTime(70); // not to be called expect(callback).toHaveBeenCalledTimes(0); expect(clearInterval).toHaveBeenCalledTimes(1); diff --git a/packages/hooks/src/useInterval/demo/demo1.tsx b/packages/hooks/src/useInterval/demo/demo1.tsx index c680ba8524..d45a346772 100644 --- a/packages/hooks/src/useInterval/demo/demo1.tsx +++ b/packages/hooks/src/useInterval/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 每1000ms,执行一次 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useInterval } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useInterval/demo/demo2.tsx b/packages/hooks/src/useInterval/demo/demo2.tsx index a311c1deb3..cb528341c9 100644 --- a/packages/hooks/src/useInterval/demo/demo2.tsx +++ b/packages/hooks/src/useInterval/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 动态修改 delay 以实现定时器间隔变化与暂停。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useInterval } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useInterval/index.ts b/packages/hooks/src/useInterval/index.ts index 3c96b9f183..2b3c0cc6f7 100644 --- a/packages/hooks/src/useInterval/index.ts +++ b/packages/hooks/src/useInterval/index.ts @@ -1,43 +1,29 @@ import { useCallback, useEffect, useRef } from 'react'; -import useLatest from '../useLatest'; +import useMemoizedFn from '../useMemoizedFn'; import { isNumber } from '../utils'; -function useInterval( - fn: () => void, - delay: number | undefined, - options: { - immediate?: boolean; - } = {}, -) { - const { immediate } = options; +const useInterval = (fn: () => void, delay?: number, options: { immediate?: boolean } = {}) => { + const timerCallback = useMemoizedFn(fn); + const timerRef = useRef | null>(null); - const fnRef = useLatest(fn); - const timerRef = useRef(null); + const clear = useCallback(() => { + if (timerRef.current) { + clearInterval(timerRef.current); + } + }, []); useEffect(() => { if (!isNumber(delay) || delay < 0) { return; } - if (immediate) { - fnRef.current(); + if (options.immediate) { + timerCallback(); } - timerRef.current = setInterval(() => { - fnRef.current(); - }, delay); - return () => { - if (timerRef.current) { - clearInterval(timerRef.current); - } - }; - }, [delay]); - - const clear = useCallback(() => { - if (timerRef.current) { - clearInterval(timerRef.current); - } - }, []); + timerRef.current = setInterval(timerCallback, delay); + return clear; + }, [delay, options.immediate]); return clear; -} +}; export default useInterval; diff --git a/packages/hooks/src/useIsomorphicLayoutEffect/__tests__/index.spec.ts b/packages/hooks/src/useIsomorphicLayoutEffect/__tests__/index.spec.ts new file mode 100644 index 0000000000..219e2e5408 --- /dev/null +++ b/packages/hooks/src/useIsomorphicLayoutEffect/__tests__/index.spec.ts @@ -0,0 +1,12 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import useIsomorphicLayoutEffect from '../index'; + +describe('useIsomorphicLayoutEffect', () => { + const callback = vi.fn(); + const { result } = renderHook(() => useIsomorphicLayoutEffect(callback)); + + test('cheak return value', () => { + expect(result.current).toBeUndefined(); + }); +}); diff --git a/packages/hooks/src/useIsomorphicLayoutEffect/__tests__/index.test.ts b/packages/hooks/src/useIsomorphicLayoutEffect/__tests__/index.test.ts deleted file mode 100644 index dc2ceffda5..0000000000 --- a/packages/hooks/src/useIsomorphicLayoutEffect/__tests__/index.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useIsomorphicLayoutEffect from '../index'; - -describe('useIsomorphicLayoutEffect', () => { - const callback = jest.fn(); - const { result } = renderHook(() => useIsomorphicLayoutEffect(callback)); - - it('cheak return value', () => { - expect(result.current).toBe(undefined); - }); -}); diff --git a/packages/hooks/src/useIsomorphicLayoutEffect/index.en-US.md b/packages/hooks/src/useIsomorphicLayoutEffect/index.en-US.md index caaafbc920..c3b0c83e1e 100644 --- a/packages/hooks/src/useIsomorphicLayoutEffect/index.en-US.md +++ b/packages/hooks/src/useIsomorphicLayoutEffect/index.en-US.md @@ -14,9 +14,9 @@ To avoid this warning, useIsomorphicLayoutEffect can be used instead of useLayou The source code of useIsomorphicLayoutEffect is: ```javascript -const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect; +const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : noop; ``` -Return useLayoutEffect for browser environment and useEffect for other environments. +Return useLayoutEffect for browser environment and a no-op in non-browser environments to avoid SSR warnings. For more information, please refer to [useLayoutEffect and SSR](https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a) diff --git a/packages/hooks/src/useIsomorphicLayoutEffect/index.ts b/packages/hooks/src/useIsomorphicLayoutEffect/index.ts index ae83221c1f..183f9306f7 100644 --- a/packages/hooks/src/useIsomorphicLayoutEffect/index.ts +++ b/packages/hooks/src/useIsomorphicLayoutEffect/index.ts @@ -1,6 +1,7 @@ -import { useEffect, useLayoutEffect } from 'react'; +import { useLayoutEffect } from 'react'; import isBrowser from '../utils/isBrowser'; +import noop from '../utils/noop'; -const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect; +const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : noop; export default useIsomorphicLayoutEffect; diff --git a/packages/hooks/src/useIsomorphicLayoutEffect/index.zh-CN.md b/packages/hooks/src/useIsomorphicLayoutEffect/index.zh-CN.md index 784f597218..57a1eec536 100644 --- a/packages/hooks/src/useIsomorphicLayoutEffect/index.zh-CN.md +++ b/packages/hooks/src/useIsomorphicLayoutEffect/index.zh-CN.md @@ -14,9 +14,9 @@ nav: useIsomorphicLayoutEffect 源码如下: ```js -const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect; +const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : noop; ``` -在非浏览器环境返回 useEffect,在浏览器环境返回 useLayoutEffect。 +在浏览器环境返回 useLayoutEffect,在非浏览器环境返回空函数以避免 SSR 警告。 更多信息可以参考 [useLayoutEffect and SSR](https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a) diff --git a/packages/hooks/src/useKeyPress/__tests__/index.spec.tsx b/packages/hooks/src/useKeyPress/__tests__/index.spec.tsx new file mode 100644 index 0000000000..4f2a300f20 --- /dev/null +++ b/packages/hooks/src/useKeyPress/__tests__/index.spec.tsx @@ -0,0 +1,179 @@ +import { fireEvent, renderHook } from '@testing-library/react'; +import { afterEach, describe, expect, test, vi } from 'vitest'; +import useKeyPress from '../index'; + +const callback = vi.fn(); + +afterEach(() => { + callback.mockClear(); +}); + +describe('useKeyPress ', () => { + test('test single key', async () => { + const { unmount } = renderHook(() => useKeyPress(['c'], callback)); + fireEvent.keyDown(document, { key: 'c', keyCode: 67 }); + expect(callback.mock.calls.length).toBe(1); + unmount(); + }); + + test('test standard key aliases', async () => { + const { unmount } = renderHook(() => useKeyPress(['arrowleft', 'escape'], callback)); + fireEvent.keyDown(document, { key: 'ArrowLeft', keyCode: 37 }); + fireEvent.keyDown(document, { key: 'Escape', keyCode: 27 }); + expect(callback.mock.calls.length).toBe(2); + unmount(); + }); + + test('test standard vs legacy key aliases', async () => { + const aliasCallback = vi.fn(); + const { unmount } = renderHook(() => + useKeyPress( + [ + 'control', + 'ctrl', + 'escape', + 'esc', + 'arrowleft', + 'leftarrow', + 'spacebar', + 'space', + 'contextmenu', + 'selectkey', + 'pause', + 'pausebreak', + ], + aliasCallback, + ), + ); + + fireEvent.keyDown(document, { key: 'Control', keyCode: 17, ctrlKey: true }); + fireEvent.keyDown(document, { key: 'Escape', keyCode: 27 }); + fireEvent.keyDown(document, { key: 'ArrowLeft', keyCode: 37 }); + fireEvent.keyDown(document, { key: ' ', keyCode: 32 }); + fireEvent.keyDown(document, { key: 'ContextMenu', keyCode: 93 }); + fireEvent.keyDown(document, { key: 'Pause', keyCode: 19 }); + + // each event should match once (first alias hit) + expect(aliasCallback.mock.calls.length).toBe(6); + unmount(); + }); + + test('test modifier key', async () => { + const { unmount } = renderHook(() => useKeyPress(['ctrl'], callback)); + fireEvent.keyDown(document, { key: 'ctrl', keyCode: 17, ctrlKey: true }); + expect(callback.mock.calls.length).toBe(1); + unmount(); + }); + + test('test combination keys', async () => { + const hook1 = renderHook(() => useKeyPress(['shift.c'], callback)); + const hook2 = renderHook(() => useKeyPress(['shift'], callback)); + const hook3 = renderHook(() => useKeyPress(['c'], callback)); + + fireEvent.keyDown(document, { key: 'c', shiftKey: true, keyCode: 67 }); + + expect(callback.mock.calls.length).toBe(3); + hook1.unmount(); + hook2.unmount(); + hook3.unmount(); + }); + + test('test combination keys by exact match', async () => { + const callbackShift = vi.fn(); + const callbackC = vi.fn(); + const callbackMulti = vi.fn(); + const hook1 = renderHook(() => useKeyPress(['shift.c'], callback, { exactMatch: true })); + const hook2 = renderHook(() => useKeyPress(['shift'], callbackShift, { exactMatch: true })); + const hook3 = renderHook(() => useKeyPress(['c'], callbackC, { exactMatch: true })); + const hook4 = renderHook(() => useKeyPress(['ctrl.shift.c'], callbackMulti)); + + fireEvent.keyDown(document, { key: 'c', shiftKey: true, keyCode: 67 }); + /** + * 只有 shift.c 才会触发,shift 和 c 都不应该触发 + */ + expect(callback.mock.calls.length).toBe(1); + expect(callbackShift.mock.calls.length).toBe(0); + expect(callbackC.mock.calls.length).toBe(0); + + callback.mockClear(); + fireEvent.keyDown(document, { key: 'c', ctrlKey: true, shiftKey: true, keyCode: 67 }); + expect(callbackMulti.mock.calls.length).toBe(1); + expect(callback.mock.calls.length).toBe(0); + expect(callbackC.mock.calls.length).toBe(0); + + hook1.unmount(); + hook2.unmount(); + hook3.unmount(); + hook4.unmount(); + }); + + test('test multiple keys', async () => { + const { unmount } = renderHook(() => useKeyPress(['0', 65], callback)); + fireEvent.keyDown(document, { key: '0', keyCode: 48 }); + fireEvent.keyDown(document, { key: 'a', keyCode: 65 }); + expect(callback.mock.calls.length).toBe(2); + unmount(); + }); + + test('meta key should be work in keyup event', async () => { + renderHook(() => + useKeyPress(['meta'], callback, { + events: ['keyup'], + }), + ); + + fireEvent.keyUp(document, { key: 'meta', keyCode: 91, metaKey: false }); + expect(callback).toBeCalled(); + }); + + test('test `keyFilter` function parameter', async () => { + const callback1 = vi.fn(); + const callback2 = vi.fn(); + + // all keys can trigger callback + const hook1 = renderHook(() => useKeyPress(() => true, callback1)); + fireEvent.keyDown(document, { key: '0', keyCode: 48 }); + fireEvent.keyDown(document, { key: 'a', keyCode: 65 }); + expect(callback1.mock.calls.length).toBe(2); + + // only some keys can trigger callback + const hook2 = renderHook(() => useKeyPress((e) => ['0', 'meta'].includes(e.key), callback2)); + fireEvent.keyDown(document, { key: '0', keyCode: 48 }); + fireEvent.keyDown(document, { key: '1', keyCode: 49 }); + fireEvent.keyDown(document, { key: 'ctrl', keyCode: 17, ctrlKey: true }); + fireEvent.keyDown(document, { key: 'meta', keyCode: 91, metaKey: true }); + expect(callback2.mock.calls.length).toBe(2); + + hook1.unmount(); + hook2.unmount(); + }); + + test('test key in `eventHandler` parameter', async () => { + let pressedKey; + const KEYS = ['c', 'shift.c', 'shift.ctrl.c']; + const callbackKey = (e: any, key: any) => { + pressedKey = key; + }; + + // test `exactMatch: true` props + const hook1 = renderHook(() => useKeyPress(KEYS, callbackKey, { exactMatch: true })); + fireEvent.keyDown(document, { key: 'c', keyCode: 67 }); + expect(pressedKey).toBe('c'); + fireEvent.keyDown(document, { key: 'c', keyCode: 67, shiftKey: true }); + expect(pressedKey).toBe('shift.c'); + fireEvent.keyDown(document, { key: 'c', keyCode: 67, shiftKey: true, ctrlKey: true }); + expect(pressedKey).toBe('shift.ctrl.c'); + + // test `exactMatch: false`(default) props + const hook2 = renderHook(() => useKeyPress(KEYS, callbackKey)); + fireEvent.keyDown(document, { key: 'c', keyCode: 67 }); + expect(pressedKey).toBe('c'); + fireEvent.keyDown(document, { key: 'c', keyCode: 67, shiftKey: true }); + expect(pressedKey).toBe('c'); + fireEvent.keyDown(document, { key: 'c', keyCode: 67, shiftKey: true, ctrlKey: true }); + expect(pressedKey).toBe('c'); + + hook2.unmount(); + hook1.unmount(); + }); +}); diff --git a/packages/hooks/src/useKeyPress/__tests__/index.test.tsx b/packages/hooks/src/useKeyPress/__tests__/index.test.tsx deleted file mode 100644 index ca973c86a9..0000000000 --- a/packages/hooks/src/useKeyPress/__tests__/index.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import { fireEvent } from '@testing-library/react'; -import useKeyPress from '../index'; - -const callback = jest.fn(); - -afterEach(() => { - callback.mockClear(); -}); - -describe('useKeyPress ', () => { - it('test single key', async () => { - const { unmount } = renderHook(() => useKeyPress(['c'], callback)); - fireEvent.keyDown(document, { key: 'c', keyCode: 67 }); - expect(callback.mock.calls.length).toBe(1); - unmount(); - }); - - it('test modifier key', async () => { - const { unmount } = renderHook(() => useKeyPress(['ctrl'], callback)); - fireEvent.keyDown(document, { key: 'ctrl', keyCode: 17, ctrlKey: true }); - expect(callback.mock.calls.length).toBe(1); - unmount(); - }); - - it('test combination keys', async () => { - const hook1 = renderHook(() => useKeyPress(['shift.c'], callback)); - const hook2 = renderHook(() => useKeyPress(['shift'], callback)); - const hook3 = renderHook(() => useKeyPress(['c'], callback)); - - fireEvent.keyDown(document, { key: 'c', shiftKey: true, keyCode: 67 }); - - expect(callback.mock.calls.length).toBe(3); - hook1.unmount(); - hook2.unmount(); - hook3.unmount(); - }); - - it('test combination keys by exact match', async () => { - const callbackShift = jest.fn(); - const callbackC = jest.fn(); - const callbackMulti = jest.fn(); - const hook1 = renderHook(() => useKeyPress(['shift.c'], callback, { exactMatch: true })); - const hook2 = renderHook(() => useKeyPress(['shift'], callbackShift, { exactMatch: true })); - const hook3 = renderHook(() => useKeyPress(['c'], callbackC, { exactMatch: true })); - const hook4 = renderHook(() => useKeyPress(['ctrl.shift.c'], callbackMulti)); - - fireEvent.keyDown(document, { key: 'c', shiftKey: true, keyCode: 67 }); - /** - * 只有 shift.c 才会触发,shift 和 c 都不应该触发 - */ - expect(callback.mock.calls.length).toBe(1); - expect(callbackShift.mock.calls.length).toBe(0); - expect(callbackC.mock.calls.length).toBe(0); - - callback.mockClear(); - fireEvent.keyDown(document, { key: 'c', ctrlKey: true, shiftKey: true, keyCode: 67 }); - expect(callbackMulti.mock.calls.length).toBe(1); - expect(callback.mock.calls.length).toBe(0); - expect(callbackC.mock.calls.length).toBe(0); - - hook1.unmount(); - hook2.unmount(); - hook3.unmount(); - hook4.unmount(); - }); - - it('test multiple keys', async () => { - const { unmount } = renderHook(() => useKeyPress(['0', 65], callback)); - fireEvent.keyDown(document, { key: '0', keyCode: 48 }); - fireEvent.keyDown(document, { key: 'a', keyCode: 65 }); - expect(callback.mock.calls.length).toBe(2); - unmount(); - }); -}); diff --git a/packages/hooks/src/useKeyPress/demo/demo1.tsx b/packages/hooks/src/useKeyPress/demo/demo1.tsx index d727152f57..5b1496aff6 100644 --- a/packages/hooks/src/useKeyPress/demo/demo1.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 支持键盘事件中的 keyCode 和别名,请按 ArrowUp 或 ArrowDown 键进行演示。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useKeyPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useKeyPress/demo/demo2.tsx b/packages/hooks/src/useKeyPress/demo/demo2.tsx index c602c2dd6e..9f7db4bc07 100644 --- a/packages/hooks/src/useKeyPress/demo/demo2.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 支持使用别名,更多内容请[查看备注](#remarks)。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useKeyPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useKeyPress/demo/demo3.tsx b/packages/hooks/src/useKeyPress/demo/demo3.tsx index c5ee6a30c7..c05de05561 100644 --- a/packages/hooks/src/useKeyPress/demo/demo3.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo3.tsx @@ -1,5 +1,5 @@ import { useKeyPress } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [num, setNum] = useState(); diff --git a/packages/hooks/src/useKeyPress/demo/demo4.tsx b/packages/hooks/src/useKeyPress/demo/demo4.tsx index e727afbc2c..b6bfc07315 100644 --- a/packages/hooks/src/useKeyPress/demo/demo4.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo4.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 支持接收一个返回 boolean 的回调函数,自己处理逻辑。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useKeyPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useKeyPress/demo/demo5.tsx b/packages/hooks/src/useKeyPress/demo/demo5.tsx index 6fc5536a75..2eafb9b6c9 100644 --- a/packages/hooks/src/useKeyPress/demo/demo5.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo5.tsx @@ -9,7 +9,7 @@ * 如常见的监听输入框事件,支持多种 DOM 指定方式。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useKeyPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useKeyPress/demo/demo6.tsx b/packages/hooks/src/useKeyPress/demo/demo6.tsx index 65a7dc2fb4..cb656d6206 100644 --- a/packages/hooks/src/useKeyPress/demo/demo6.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo6.tsx @@ -1,6 +1,6 @@ import { CheckOutlined } from '@ant-design/icons'; import { useKeyPress } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [state, setState] = useState(); diff --git a/packages/hooks/src/useKeyPress/demo/demo7.tsx b/packages/hooks/src/useKeyPress/demo/demo7.tsx index d107a3203e..bdec1e853a 100644 --- a/packages/hooks/src/useKeyPress/demo/demo7.tsx +++ b/packages/hooks/src/useKeyPress/demo/demo7.tsx @@ -8,7 +8,7 @@ import { CheckOutlined } from '@ant-design/icons'; import { useKeyPress } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [state, setState] = useState(); diff --git a/packages/hooks/src/useKeyPress/demo/demo8.tsx b/packages/hooks/src/useKeyPress/demo/demo8.tsx new file mode 100644 index 0000000000..c1d04df71c --- /dev/null +++ b/packages/hooks/src/useKeyPress/demo/demo8.tsx @@ -0,0 +1,42 @@ +/** + * title: Get the trigger key + * desc: Multiple shortcuts are registered by a hook, each corresponding to a different logic. + * + * title.zh-CN: 获取触发的按键 + * desc.zh-CN: 单个 hook 注册多个快捷键,每个快捷键对应不同逻辑。 + */ + +import { useState } from 'react'; +import { useKeyPress } from 'ahooks'; + +export default () => { + const [count, setCount] = useState(0); + + const keyCallbackMap = { + w: () => { + setCount((prev) => prev + 1); + }, + s: () => { + setCount((prev) => prev - 1); + }, + 'shift.c': () => { + setCount(0); + }, + }; + + useKeyPress(['w', 's', 'shift.c'], (e, key) => { + keyCallbackMap[key as keyof typeof keyCallbackMap](); + }); + + return ( +
+

Try pressing the following:

+
1. Press [w] to increase
+
2. Press [s] to decrease
+
3. Press [shift.c] to reset
+

+ counter: {count} +

+
+ ); +}; diff --git a/packages/hooks/src/useKeyPress/index.en-US.md b/packages/hooks/src/useKeyPress/index.en-US.md index ed9297c0dd..a3a7c6372b 100644 --- a/packages/hooks/src/useKeyPress/index.en-US.md +++ b/packages/hooks/src/useKeyPress/index.en-US.md @@ -25,6 +25,10 @@ Listen for the keyboard press, support key combinations, and support alias. +### Get the trigger key + + + ### Custom method @@ -36,12 +40,12 @@ Listen for the keyboard press, support key combinations, and support alias. ## API ```typescript -type keyType = number | string; -type KeyFilter = keyType | keyType[] | ((event: KeyboardEvent) => boolean); +type KeyType = number | string; +type KeyFilter = KeyType | KeyType[] | ((event: KeyboardEvent) => boolean); useKeyPress( keyFilter: KeyFilter, - eventHandler: EventHandler, + eventHandler: (event: KeyboardEvent, key: KeyType) => void, options?: Options ); ``` @@ -50,23 +54,22 @@ useKeyPress( | Property | Description | Type | Default | | ------------ | ---------------------------------------------------------------- | --------------------------------------------------------------- | ------- | -| keyFilter | Support keyCode、alias、combination keys、array、custom function | `keyType` \| `keyType[]` \| `(event: KeyboardEvent) => boolean` | - | -| eventHandler | Callback function | `(event: KeyboardEvent) => void` | - | -| options | advanced options | `Options` | - | +| keyFilter | Support keyCode、alias、combination keys、array、custom function | `KeyType` \| `KeyType[]` \| `(event: KeyboardEvent) => boolean` | - | +| eventHandler | Callback function | `(event: KeyboardEvent, key: KeyType) => void` | - | +| options | Advanced options | `Options` | - | ### Options -| Property | Description | Type | Default | -| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------- | -| events | Trigger Events | `('keydown' \| 'keyup')[]` | `['keydown']` | -| target | DOM element or ref | `() => Element` \| `Element` \| `MutableRefObject` | - | -| exactMatch | Exact match. If set `true`, the event will only be trigger when the keys match exactly. For example, pressing [shif + c] will not trigger [c] | `boolean` | `false` | -| useCapture | to block events bubbling | `boolean` | `false` | +| Property | Description | Type | Default | +| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------- | +| events | Trigger Events | `('keydown' \| 'keyup')[]` | `['keydown']` | +| target | DOM element or ref | `() => Element` \| `Element` \| `MutableRefObject` | - | +| exactMatch | Exact match. If set `true`, the event will only be trigger when the keys match exactly. For example, pressing [shift + c] will not trigger [c] | `boolean` | `false` | +| useCapture | to block events bubbling | `boolean` | `false` | ## Remarks -1. All key alias refer to [code](https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useKeyPress/index.ts#L21) - +1. Supports part of standard browser key values. Reference: [MDN keyboard key values](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values). Full alias list refers to [code](https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useKeyPress/index.ts#L21) 2. Modifier keys ```text diff --git a/packages/hooks/src/useKeyPress/index.ts b/packages/hooks/src/useKeyPress/index.ts index 486546fb14..e0adca0faf 100644 --- a/packages/hooks/src/useKeyPress/index.ts +++ b/packages/hooks/src/useKeyPress/index.ts @@ -3,11 +3,11 @@ import { isFunction, isNumber, isString } from '../utils'; import type { BasicTarget } from '../utils/domTarget'; import { getTargetElement } from '../utils/domTarget'; import useDeepCompareEffectWithTarget from '../utils/useDeepCompareWithTarget'; +import isAppleDevice from '../utils/isAppleDevice'; -export type KeyPredicate = (event: KeyboardEvent) => boolean; -export type keyType = number | string; -export type KeyFilter = keyType | keyType[] | ((event: KeyboardEvent) => boolean); -export type EventHandler = (event: KeyboardEvent) => void; +export type KeyType = number | string; +export type KeyPredicate = (event: KeyboardEvent) => KeyType | boolean | undefined; +export type KeyFilter = KeyType | KeyType[] | ((event: KeyboardEvent) => boolean); export type KeyEvent = 'keydown' | 'keyup'; export type Target = BasicTarget; @@ -35,20 +35,33 @@ const aliasKeyCodeMap = { tab: 9, enter: 13, shift: 16, + // Legacy alias kept for compatibility; standard name is "control". ctrl: 17, + control: 17, alt: 18, + // Legacy alias kept for compatibility; standard name is "pause". pausebreak: 19, + pause: 19, capslock: 20, + // Legacy alias kept for compatibility; standard name is "escape". esc: 27, + escape: 27, + // Legacy alias kept for compatibility; standard name is "spacebar" (non-standard but widely used). space: 32, + spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36, + // Legacy aliases kept for compatibility; standard names are "arrowleft/arrowup/arrowright/arrowdown". leftarrow: 37, + arrowleft: 37, uparrow: 38, + arrowup: 38, rightarrow: 39, + arrowright: 39, downarrow: 40, + arrowdown: 40, insert: 45, delete: 46, a: 65, @@ -79,7 +92,10 @@ const aliasKeyCodeMap = { z: 90, leftwindowkey: 91, rightwindowkey: 92, + meta: isAppleDevice ? [91, 93] : [91, 92], + // Legacy alias kept for compatibility; standard name is "contextmenu". selectkey: 93, + contextmenu: 93, numpad0: 96, numpad1: 97, numpad2: 98, @@ -127,13 +143,23 @@ const modifierKey = { ctrl: (event: KeyboardEvent) => event.ctrlKey, shift: (event: KeyboardEvent) => event.shiftKey, alt: (event: KeyboardEvent) => event.altKey, - meta: (event: KeyboardEvent) => event.metaKey, + meta: (event: KeyboardEvent) => { + if (event.type === 'keyup') { + return aliasKeyCodeMap.meta.includes(event.keyCode); + } + return event.metaKey; + }, }; +// 判断合法的按键类型 +function isValidKeyType(value: unknown): value is string | number { + return isString(value) || isNumber(value); +} + // 根据 event 计算激活键数量 function countKeyByEvent(event: KeyboardEvent) { const countOfModifier = Object.keys(modifierKey).reduce((total, key) => { - if (modifierKey[key](event)) { + if ((modifierKey as any)[key](event)) { return total + 1; } @@ -148,9 +174,9 @@ function countKeyByEvent(event: KeyboardEvent) { * 判断按键是否激活 * @param [event: KeyboardEvent]键盘事件 * @param [keyFilter: any] 当前键 - * @returns Boolean + * @returns string | number | boolean */ -function genFilterKey(event: KeyboardEvent, keyFilter: keyType, exactMatch: boolean) { +function genFilterKey(event: KeyboardEvent, keyFilter: KeyType, exactMatch: boolean) { // 浏览器自动补全 input 的时候,会触发 keyDown、keyUp 事件,但此时 event.key 等为空 if (!event.key) { return false; @@ -158,7 +184,7 @@ function genFilterKey(event: KeyboardEvent, keyFilter: keyType, exactMatch: bool // 数字类型直接匹配事件的 keyCode if (isNumber(keyFilter)) { - return event.keyCode === keyFilter; + return event.keyCode === keyFilter ? keyFilter : false; } // 字符串依次判断是否有组合键 @@ -167,9 +193,9 @@ function genFilterKey(event: KeyboardEvent, keyFilter: keyType, exactMatch: bool for (const key of genArr) { // 组合键 - const genModifier = modifierKey[key]; + const genModifier = (modifierKey as any)[key]; // keyCode 别名 - const aliasKeyCode = aliasKeyCodeMap[key.toLowerCase()]; + const aliasKeyCode: number | number[] = (aliasKeyCodeMap as any)[key.toLowerCase()]; if ((genModifier && genModifier(event)) || (aliasKeyCode && aliasKeyCode === event.keyCode)) { genLen++; @@ -183,9 +209,9 @@ function genFilterKey(event: KeyboardEvent, keyFilter: keyType, exactMatch: bool * 主要用来防止按组合键其子集也会触发的情况,例如监听 ctrl+a 会触发监听 ctrl 和 a 两个键的事件。 */ if (exactMatch) { - return genLen === genArr.length && countKeyByEvent(event) === genArr.length; + return genLen === genArr.length && countKeyByEvent(event) === genArr.length ? keyFilter : false; } - return genLen === genArr.length; + return genLen === genArr.length ? keyFilter : false; } /** @@ -197,19 +223,23 @@ function genKeyFormatter(keyFilter: KeyFilter, exactMatch: boolean): KeyPredicat if (isFunction(keyFilter)) { return keyFilter; } - if (isString(keyFilter) || isNumber(keyFilter)) { + if (isValidKeyType(keyFilter)) { return (event: KeyboardEvent) => genFilterKey(event, keyFilter, exactMatch); } if (Array.isArray(keyFilter)) { return (event: KeyboardEvent) => - keyFilter.some((item) => genFilterKey(event, item, exactMatch)); + keyFilter.find((item) => genFilterKey(event, item, exactMatch)); } return () => Boolean(keyFilter); } const defaultEvents: KeyEvent[] = ['keydown']; -function useKeyPress(keyFilter: KeyFilter, eventHandler: EventHandler, option?: Options) { +function useKeyPress( + keyFilter: KeyFilter, + eventHandler: (event: KeyboardEvent, key: KeyType) => void, + option?: Options, +) { const { events = defaultEvents, target, exactMatch = false, useCapture = false } = option || {}; const eventHandlerRef = useLatest(eventHandler); const keyFilterRef = useLatest(keyFilter); @@ -221,10 +251,14 @@ function useKeyPress(keyFilter: KeyFilter, eventHandler: EventHandler, option?: return; } - const callbackHandler = (event: KeyboardEvent) => { - const genGuard: KeyPredicate = genKeyFormatter(keyFilterRef.current, exactMatch); - if (genGuard(event)) { - return eventHandlerRef.current?.(event); + const callbackHandler = (event: Event) => { + const keyEvent = event as KeyboardEvent; + const genGuard = genKeyFormatter(keyFilterRef.current, exactMatch); + const keyGuard = genGuard(keyEvent); + const firedKey = isValidKeyType(keyGuard) ? keyGuard : keyEvent.key; + + if (keyGuard) { + return eventHandlerRef.current?.(keyEvent, firedKey); } }; diff --git a/packages/hooks/src/useKeyPress/index.zh-CN.md b/packages/hooks/src/useKeyPress/index.zh-CN.md index c754ae8306..945104943b 100644 --- a/packages/hooks/src/useKeyPress/index.zh-CN.md +++ b/packages/hooks/src/useKeyPress/index.zh-CN.md @@ -19,12 +19,16 @@ nav: ### 精确匹配 - + ### 监听多个按键 +### 获取触发的按键 + + + ### 自定义监听方式 @@ -36,12 +40,12 @@ nav: ## API ```typescript -type keyType = number | string; -type KeyFilter = keyType | keyType[] | ((event: KeyboardEvent) => boolean); +type KeyType = number | string; +type KeyFilter = KeyType | KeyType[] | ((event: KeyboardEvent) => boolean); useKeyPress( keyFilter: KeyFilter, - eventHandler: EventHandler, + eventHandler: (event: KeyboardEvent, key: KeyType) => void, options?: Options ); ``` @@ -50,23 +54,22 @@ useKeyPress( | 参数 | 说明 | 类型 | 默认值 | | ------------ | -------------------------------------------- | --------------------------------------------------------------- | ------ | -| keyFilter | 支持 keyCode、别名、组合键、数组,自定义函数 | `keyType` \| `keyType[]` \| `(event: KeyboardEvent) => boolean` | - | -| eventHandler | 回调函数 | `(event: KeyboardEvent) => void` | - | +| keyFilter | 支持 keyCode、别名、组合键、数组、自定义函数 | `KeyType` \| `KeyType[]` \| `(event: KeyboardEvent) => boolean` | - | +| eventHandler | 回调函数 | `(event: KeyboardEvent, key: KeyType) => void` | - | | options | 可选配置项 | `Options` | - | ### Options -| 参数 | 说明 | 类型 | 默认值 | -| ---------- | ------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ------------- | -| events | 触发事件 | `('keydown' \| 'keyup')[]` | `['keydown']` | -| target | DOM 节点或者 ref | `() => Element` \| `Element` \| `MutableRefObject` | - | -| exactMatch | 精确匹配。如果开启,则只有在按键完全匹配的情况下触发事件。比如按键 [shif + c] 不会触发 [c] | `boolean` | `false` | -| useCapture | 是否阻止事件冒泡 | `boolean` | `false` | +| 参数 | 说明 | 类型 | 默认值 | +| ---------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------- | +| events | 触发事件 | `('keydown' \| 'keyup')[]` | `['keydown']` | +| target | DOM 节点或者 ref | `() => Element` \| `Element` \| `MutableRefObject` | - | +| exactMatch | 精确匹配。如果开启,则只有在按键完全匹配的情况下触发事件。比如按键 [shift + c] 不会触发 [c] | `boolean` | `false` | +| useCapture | 是否阻止事件冒泡 | `boolean` | `false` | ## Remarks -1. 按键别名见 [代码](https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useKeyPress/index.ts#L21) - +1. 支持部分浏览器标准按键值。参考文档:[MDN 键值表](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values)。完整列表见 [代码](https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useKeyPress/index.ts#L21) 2. 修饰键 ```text diff --git a/packages/hooks/src/useLatest/__tests__/index.spec.ts b/packages/hooks/src/useLatest/__tests__/index.spec.ts new file mode 100644 index 0000000000..3ac331a901 --- /dev/null +++ b/packages/hooks/src/useLatest/__tests__/index.spec.ts @@ -0,0 +1,31 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import useLatest from '../index'; + +const setUp = (val: any) => renderHook((state) => useLatest(state), { initialProps: val }); + +describe('useLatest', () => { + test('useLatest with basic variable should work', async () => { + const { result, rerender } = setUp(0); + + rerender(1); + expect(result.current.current).toBe(1); + + rerender(2); + expect(result.current.current).toBe(2); + + rerender(3); + expect(result.current.current).toBe(3); + }); + + test('useLatest with reference variable should work', async () => { + const val1 = {}; + const { result, rerender } = setUp(val1); + + expect(result.current.current).toBe(val1); + + const val2: any[] = []; + rerender(val2); + expect(result.current.current).toBe(val2); + }); +}); diff --git a/packages/hooks/src/useLatest/__tests__/index.test.ts b/packages/hooks/src/useLatest/__tests__/index.test.ts deleted file mode 100644 index af2e1ba719..0000000000 --- a/packages/hooks/src/useLatest/__tests__/index.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useLatest from '../index'; - -const setUp = (val) => renderHook((state) => useLatest(state), { initialProps: val }); - -describe('useLatest', () => { - it('useLatest with basic variable should work', async () => { - const { result, rerender } = setUp(0); - - rerender(1); - expect(result.current.current).toEqual(1); - - rerender(2); - expect(result.current.current).toEqual(2); - - rerender(3); - expect(result.current.current).toEqual(3); - }); - - it('useLatest with reference variable should work', async () => { - const { result, rerender } = setUp({}); - - expect(result.current.current).toEqual({}); - - rerender([]); - expect(result.current.current).toEqual([]); - }); -}); diff --git a/packages/hooks/src/useLatest/demo/demo1.tsx b/packages/hooks/src/useLatest/demo/demo1.tsx index 1d9f6ed2a3..81aecb79df 100644 --- a/packages/hooks/src/useLatest/demo/demo1.tsx +++ b/packages/hooks/src/useLatest/demo/demo1.tsx @@ -6,11 +6,12 @@ * desc.zh-CN: useLatest 返回的永远是最新值 */ -import React, { useState, useEffect } from 'react'; +import { useState, useEffect } from 'react'; import { useLatest } from 'ahooks'; export default () => { const [count, setCount] = useState(0); + const [count2, setCount2] = useState(0); const latestCountRef = useLatest(count); @@ -21,9 +22,17 @@ export default () => { return () => clearInterval(interval); }, []); + useEffect(() => { + const interval = setInterval(() => { + setCount2(count2 + 1); + }, 1000); + return () => clearInterval(interval); + }, []); + return ( <> -

count: {count}

+

count(useLatest): {count}

+

count(default): {count2}

); }; diff --git a/packages/hooks/src/useLocalStorageState/__tests__/index.spec.ts b/packages/hooks/src/useLocalStorageState/__tests__/index.spec.ts new file mode 100644 index 0000000000..9a0d86df1a --- /dev/null +++ b/packages/hooks/src/useLocalStorageState/__tests__/index.spec.ts @@ -0,0 +1,165 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import type { Options } from '../../createUseStorageState'; +import useLocalStorageState from '../index'; + +describe('useLocalStorageState', () => { + const setUp = (key: string, value: T, options?: Options) => + renderHook(() => { + const [state, setState] = useLocalStorageState(key, { + defaultValue: value, + ...options, + }); + return { + state, + setState, + } as const; + }); + + test('getKey should work', () => { + const LOCAL_STORAGE_KEY = 'test-key'; + const hook = setUp(LOCAL_STORAGE_KEY, 'A'); + expect(hook.result.current.state).toBe('A'); + act(() => { + hook.result.current.setState('B'); + }); + expect(hook.result.current.state).toBe('B'); + const anotherHook = setUp(LOCAL_STORAGE_KEY, 'A'); + expect(anotherHook.result.current.state).toBe('B'); + act(() => { + anotherHook.result.current.setState('C'); + }); + expect(anotherHook.result.current.state).toBe('C'); + expect(hook.result.current.state).toBe('B'); + }); + + test('should support object', () => { + const LOCAL_STORAGE_KEY = 'test-object-key'; + const hook = setUp<{ name: string }>(LOCAL_STORAGE_KEY, { + name: 'A', + }); + expect(hook.result.current.state).toEqual({ name: 'A' }); + act(() => { + hook.result.current.setState({ name: 'B' }); + }); + expect(hook.result.current.state).toEqual({ name: 'B' }); + const anotherHook = setUp(LOCAL_STORAGE_KEY, { + name: 'C', + }); + expect(anotherHook.result.current.state).toEqual({ name: 'B' }); + act(() => { + anotherHook.result.current.setState({ + name: 'C', + }); + }); + expect(anotherHook.result.current.state).toEqual({ name: 'C' }); + expect(hook.result.current.state).toEqual({ name: 'B' }); + }); + + test('should support number', () => { + const LOCAL_STORAGE_KEY = 'test-number-key'; + const hook = setUp(LOCAL_STORAGE_KEY, 1); + expect(hook.result.current.state).toBe(1); + act(() => { + hook.result.current.setState(2); + }); + expect(hook.result.current.state).toBe(2); + const anotherHook = setUp(LOCAL_STORAGE_KEY, 3); + expect(anotherHook.result.current.state).toBe(2); + act(() => { + anotherHook.result.current.setState(3); + }); + expect(anotherHook.result.current.state).toBe(3); + expect(hook.result.current.state).toBe(2); + }); + + test('should support boolean', () => { + const LOCAL_STORAGE_KEY = 'test-boolean-key'; + const hook = setUp(LOCAL_STORAGE_KEY, true); + expect(hook.result.current.state).toBe(true); + act(() => { + hook.result.current.setState(false); + }); + expect(hook.result.current.state).toBe(false); + const anotherHook = setUp(LOCAL_STORAGE_KEY, true); + expect(anotherHook.result.current.state).toBe(false); + act(() => { + anotherHook.result.current.setState(true); + }); + expect(anotherHook.result.current.state).toBe(true); + expect(hook.result.current.state).toBe(false); + }); + + test('should support null', () => { + const LOCAL_STORAGE_KEY = 'test-boolean-key-with-null'; + const hook = setUp(LOCAL_STORAGE_KEY, false); + expect(hook.result.current.state).toBe(false); + act(() => { + hook.result.current.setState(null); + }); + expect(hook.result.current.state).toBeNull(); + const anotherHook = setUp(LOCAL_STORAGE_KEY, false); + expect(anotherHook.result.current.state).toBeNull(); + }); + + test('should support function updater', () => { + const LOCAL_STORAGE_KEY = 'test-func-updater'; + const hook = setUp(LOCAL_STORAGE_KEY, 'hello world'); + expect(hook.result.current.state).toBe('hello world'); + act(() => { + hook.result.current.setState((state) => `${state}, zhangsan`); + }); + expect(hook.result.current.state).toBe('hello world, zhangsan'); + }); + + test('should sync state when changes', async () => { + const LOCAL_STORAGE_KEY = 'test-sync-state'; + const hook = setUp(LOCAL_STORAGE_KEY, 'foo', { listenStorageChange: true }); + const anotherHook = setUp(LOCAL_STORAGE_KEY, 'bar', { + listenStorageChange: true, + }); + + expect(hook.result.current.state).toBe('foo'); + expect(anotherHook.result.current.state).toBe('bar'); + + act(() => hook.result.current.setState('baz')); + expect(hook.result.current.state).toBe('baz'); + expect(anotherHook.result.current.state).toBe('baz'); + + act(() => anotherHook.result.current.setState('qux')); + expect(hook.result.current.state).toBe('qux'); + expect(anotherHook.result.current.state).toBe('qux'); + }); + + test('should not rerender when setting the same reference', () => { + const LOCAL_STORAGE_KEY = 'test-same-reference'; + const value = { + name: 'A', + }; + let renderCount = 0; + + const hook = renderHook(() => { + renderCount += 1; + const [state, setState] = useLocalStorageState(LOCAL_STORAGE_KEY, { + defaultValue: value, + listenStorageChange: true, + }); + + return { + state, + setState, + } as const; + }); + + expect(renderCount).toBe(1); + expect(hook.result.current.state).toBe(value); + + act(() => { + hook.result.current.setState((prev) => prev!); + }); + + expect(renderCount).toBe(1); + expect(hook.result.current.state).toBe(value); + expect(localStorage.getItem(LOCAL_STORAGE_KEY)).toBeNull(); + }); +}); diff --git a/packages/hooks/src/useLocalStorageState/__tests__/index.test.ts b/packages/hooks/src/useLocalStorageState/__tests__/index.test.ts deleted file mode 100644 index 88871b9745..0000000000 --- a/packages/hooks/src/useLocalStorageState/__tests__/index.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useLocalStorageState from '../index'; - -describe('useLocalStorageState', () => { - const setUp = (key: string, value: T) => - renderHook(() => { - const [state, setState] = useLocalStorageState(key, { defaultValue: value }); - return { - state, - setState, - } as const; - }); - - it('getKey should work', () => { - const LOCAL_STORAGE_KEY = 'test-key'; - const hook = setUp(LOCAL_STORAGE_KEY, 'A'); - expect(hook.result.current.state).toEqual('A'); - act(() => { - hook.result.current.setState('B'); - }); - expect(hook.result.current.state).toEqual('B'); - const anotherHook = setUp(LOCAL_STORAGE_KEY, 'A'); - expect(anotherHook.result.current.state).toEqual('B'); - act(() => { - anotherHook.result.current.setState('C'); - }); - expect(anotherHook.result.current.state).toEqual('C'); - expect(hook.result.current.state).toEqual('B'); - }); - - it('should support object', () => { - const LOCAL_STORAGE_KEY = 'test-object-key'; - const hook = setUp<{ name: string }>(LOCAL_STORAGE_KEY, { - name: 'A', - }); - expect(hook.result.current.state).toEqual({ name: 'A' }); - act(() => { - hook.result.current.setState({ name: 'B' }); - }); - expect(hook.result.current.state).toEqual({ name: 'B' }); - const anotherHook = setUp(LOCAL_STORAGE_KEY, { - name: 'C', - }); - expect(anotherHook.result.current.state).toEqual({ name: 'B' }); - act(() => { - anotherHook.result.current.setState({ - name: 'C', - }); - }); - expect(anotherHook.result.current.state).toEqual({ name: 'C' }); - expect(hook.result.current.state).toEqual({ name: 'B' }); - }); - - it('should support number', () => { - const LOCAL_STORAGE_KEY = 'test-number-key'; - const hook = setUp(LOCAL_STORAGE_KEY, 1); - expect(hook.result.current.state).toEqual(1); - act(() => { - hook.result.current.setState(2); - }); - expect(hook.result.current.state).toEqual(2); - const anotherHook = setUp(LOCAL_STORAGE_KEY, 3); - expect(anotherHook.result.current.state).toEqual(2); - act(() => { - anotherHook.result.current.setState(3); - }); - expect(anotherHook.result.current.state).toEqual(3); - expect(hook.result.current.state).toEqual(2); - }); - - it('should support boolean', () => { - const LOCAL_STORAGE_KEY = 'test-boolean-key'; - const hook = setUp(LOCAL_STORAGE_KEY, true); - expect(hook.result.current.state).toEqual(true); - act(() => { - hook.result.current.setState(false); - }); - expect(hook.result.current.state).toEqual(false); - const anotherHook = setUp(LOCAL_STORAGE_KEY, true); - expect(anotherHook.result.current.state).toEqual(false); - act(() => { - anotherHook.result.current.setState(true); - }); - expect(anotherHook.result.current.state).toEqual(true); - expect(hook.result.current.state).toEqual(false); - }); - - it('should support null', () => { - const LOCAL_STORAGE_KEY = 'test-boolean-key-with-null'; - const hook = setUp(LOCAL_STORAGE_KEY, false); - expect(hook.result.current.state).toEqual(false); - act(() => { - hook.result.current.setState(null); - }); - expect(hook.result.current.state).toEqual(null); - const anotherHook = setUp(LOCAL_STORAGE_KEY, false); - expect(anotherHook.result.current.state).toEqual(null); - }); - - it('should support function updater', () => { - const LOCAL_STORAGE_KEY = 'test-func-updater'; - const hook = setUp(LOCAL_STORAGE_KEY, 'hello world'); - expect(hook.result.current.state).toEqual('hello world'); - act(() => { - hook.result.current.setState((state) => `${state}, zhangsan`); - }); - expect(hook.result.current.state).toEqual('hello world, zhangsan'); - }); -}); diff --git a/packages/hooks/src/useLocalStorageState/demo/demo1.tsx b/packages/hooks/src/useLocalStorageState/demo/demo1.tsx index 832650cfc6..91774b8c6b 100644 --- a/packages/hooks/src/useLocalStorageState/demo/demo1.tsx +++ b/packages/hooks/src/useLocalStorageState/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 刷新页面后,可以看到输入框中的内容被从 localStorage 中恢复了。 */ -import React from 'react'; import { useLocalStorageState } from 'ahooks'; export default function () { diff --git a/packages/hooks/src/useLocalStorageState/demo/demo2.tsx b/packages/hooks/src/useLocalStorageState/demo/demo2.tsx index b6842032ee..a529a4b809 100644 --- a/packages/hooks/src/useLocalStorageState/demo/demo2.tsx +++ b/packages/hooks/src/useLocalStorageState/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: useLocalStorageState 会自动处理序列化和反序列化的操作。 */ -import React from 'react'; import { useLocalStorageState } from 'ahooks'; const defaultArray = ['a', 'e', 'i', 'o', 'u']; diff --git a/packages/hooks/src/useLocalStorageState/demo/demo3.tsx b/packages/hooks/src/useLocalStorageState/demo/demo3.tsx index c57e2c86ff..f9afa23a75 100644 --- a/packages/hooks/src/useLocalStorageState/demo/demo3.tsx +++ b/packages/hooks/src/useLocalStorageState/demo/demo3.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 对于普通的字符串,可能你不需要默认的 `JSON.stringify/JSON.parse` 来序列化。 */ -import React from 'react'; import { useLocalStorageState } from 'ahooks'; export default function () { diff --git a/packages/hooks/src/useLocalStorageState/demo/demo4.tsx b/packages/hooks/src/useLocalStorageState/demo/demo4.tsx new file mode 100644 index 0000000000..5fd7a530c3 --- /dev/null +++ b/packages/hooks/src/useLocalStorageState/demo/demo4.tsx @@ -0,0 +1,34 @@ +/** + * title: Sync state with localStorage + * desc: When the stored value changes, all `useLocalStorageState` with the same `key` will synchronize their states, including different tabs of the same browser (try to open two tabs of this page, clicking a button on one page will automatically update the "count" on the other page). + * + * title.zh-CN: 将 state 与 localStorage 保持同步 + * desc.zh-CN: 存储值变化时,所有 `key` 相同的 `useLocalStorageState` 会同步状态,包括同一浏览器不同 tab 之间(尝试打开两个此页面,点击其中一个页面的按钮,另一个页面的 count 会自动更新) + */ + +import { useLocalStorageState } from 'ahooks'; + +export default function () { + return ( + <> + + + + ); +} + +function Counter() { + const [count, setCount] = useLocalStorageState('use-local-storage-state-demo4', { + defaultValue: 0, + listenStorageChange: true, + }); + + return ( +
+ + +
+ ); +} diff --git a/packages/hooks/src/useLocalStorageState/index.en-US.md b/packages/hooks/src/useLocalStorageState/index.en-US.md index 15bd992e5c..3a02582cdc 100644 --- a/packages/hooks/src/useLocalStorageState/index.en-US.md +++ b/packages/hooks/src/useLocalStorageState/index.en-US.md @@ -21,30 +21,49 @@ A Hook that store state into localStorage. +### Sync state with localStorage + + + ## API If you want to delete this record from localStorage, you can use `setState()` or `setState(undefined)`. ```typescript +type SetState = S | ((prevState?: S) => S); + interface Options { defaultValue?: T | (() => T); + getInitialValueInEffect?: boolean; + listenStorageChange?: boolean; serializer?: (value: T) => string; deserializer?: (value: string) => T; + onError?: (error: unknown) => void; } const [state, setState] = useLocalStorageState( key: string, options: Options -): [T?, (value?: T | ((previousState: T) => T)) => void]; +): [T?, (value?: SetState) => void]; ``` +### Result + +| Property | Description | Type | +| -------- | --------------------------- | ------------------------------- | +| state | Local `localStorage` value | `T` | +| setState | Update `localStorage` value | `(value?: SetState) => void` | + ### Options -| Property | Description | Type | Default | -| ------------ | ----------------------------- | ------------------------ | ---------------- | -| defaultValue | Default value | `any \| (() => any)` | - | -| serializer | Custom serialization method | `(value: any) => string` | `JSON.stringify` | -| deserializer | Custom deserialization method | `(value: string) => any` | `JSON.parse` | +| Property | Description | Type | Default | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ----------------------------- | +| defaultValue | Default value | `any \| (() => any)` | - | +| getInitialValueInEffect | Whether to read localStorage in an effect after mount, useful to avoid SSR hydration mismatch | `boolean` | `false` | +| listenStorageChange | Whether to listen storage changes. If `true`, when the stored value changes, all `useLocalStorageState` with the same `key` will synchronize their states, including different tabs of the same browser | `boolean` | `false` | +| serializer | Custom serialization method | `(value: any) => string` | `JSON.stringify` | +| deserializer | Custom deserialization method | `(value: string) => any` | `JSON.parse` | +| onError | On error callback | `(error: unknown) => void` | `(e) => { console.error(e) }` | ## Remark diff --git a/packages/hooks/src/useLocalStorageState/index.zh-CN.md b/packages/hooks/src/useLocalStorageState/index.zh-CN.md index a1159a0797..25d193c444 100644 --- a/packages/hooks/src/useLocalStorageState/index.zh-CN.md +++ b/packages/hooks/src/useLocalStorageState/index.zh-CN.md @@ -21,30 +21,49 @@ nav: +### 将 state 与 localStorage 保持同步 + + + ## API 如果想从 localStorage 中删除这条数据,可以使用 `setState()` 或 `setState(undefined)` 。 ```typescript +type SetState = S | ((prevState?: S) => S); + interface Options { defaultValue?: T | (() => T); + getInitialValueInEffect?: boolean; + listenStorageChange?: boolean; serializer?: (value: T) => string; deserializer?: (value: string) => T; + onError?: (error: unknown) => void; } const [state, setState] = useLocalStorageState( key: string, options: Options -): [T?, (value?: T | ((previousState: T) => T)) => void]; +): [T?, (value?: SetState) => void]; ``` +### Result + +| 参数 | 说明 | 类型 | +| -------- | ---------------------- | ------------------------------- | +| state | 本地 `localStorage` 值 | `T` | +| setState | 设置 `localStorage` 值 | `(value?: SetState) => void` | + ### Options -| 参数 | 说明 | 类型 | 默认值 | -| ------------ | ------------------ | ------------------------ | ---------------- | -| defaultValue | 默认值 | `any \| (() => any)` | - | -| serializer | 自定义序列化方法 | `(value: any) => string` | `JSON.stringify` | -| deserializer | 自定义反序列化方法 | `(value: string) => any` | `JSON.parse` | +| 参数 | 说明 | 类型 | 默认值 | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ----------------------------- | +| defaultValue | 默认值 | `any \| (() => any)` | - | +| getInitialValueInEffect | 是否在挂载后通过 effect 读取 localStorage,可用于避免 SSR hydration 不一致 | `boolean` | `false` | +| listenStorageChange | 是否监听存储变化。如果是 `true`,当存储值变化时,所有 `key` 相同的 `useLocalStorageState` 会同步状态,包括同一浏览器不同 tab 之间 | `boolean` | `false` | +| serializer | 自定义序列化方法 | `(value: any) => string` | `JSON.stringify` | +| deserializer | 自定义反序列化方法 | `(value: string) => any` | `JSON.parse` | +| onError | 错误回调函数 | `(error: unknown) => void` | `(e) => { console.error(e) }` | ## 备注 diff --git a/packages/hooks/src/useLockFn/__tests__/index.test.ts b/packages/hooks/src/useLockFn/__tests__/index.spec.ts similarity index 84% rename from packages/hooks/src/useLockFn/__tests__/index.test.ts rename to packages/hooks/src/useLockFn/__tests__/index.spec.ts index 164020c1d2..2a8631ae1a 100644 --- a/packages/hooks/src/useLockFn/__tests__/index.test.ts +++ b/packages/hooks/src/useLockFn/__tests__/index.spec.ts @@ -1,7 +1,8 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import { useRef, useCallback, useState } from 'react'; -import useLockFn from '../index'; +import { act, renderHook } from '@testing-library/react'; +import { useCallback, useRef, useState } from 'react'; +import { describe, expect, test } from 'vitest'; import { sleep } from '../../utils/testingHelpers'; +import useLockFn from '../index'; describe('useLockFn', () => { const setUp = (): any => @@ -24,7 +25,7 @@ describe('useLockFn', () => { }; }); - it('should work', async () => { + test('should work', async () => { const hook = setUp(); const { locked, countRef } = hook.result.current; locked(1); @@ -41,7 +42,7 @@ describe('useLockFn', () => { expect(countRef.current).toBe(5); }); - it('should same', () => { + test('should same', () => { const hook = setUp(); const preLocked = hook.result.current.locked; hook.rerender(); diff --git a/packages/hooks/src/useLockFn/demo/demo1.tsx b/packages/hooks/src/useLockFn/demo/demo1.tsx index dd35e021f4..2d82e373f0 100644 --- a/packages/hooks/src/useLockFn/demo/demo1.tsx +++ b/packages/hooks/src/useLockFn/demo/demo1.tsx @@ -8,7 +8,7 @@ import { useLockFn } from 'ahooks'; import { message } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; function mockApiRequest() { return new Promise((resolve) => { diff --git a/packages/hooks/src/useLockFn/index.en-US.md b/packages/hooks/src/useLockFn/index.en-US.md index c570cc4d72..2275287de3 100644 --- a/packages/hooks/src/useLockFn/index.en-US.md +++ b/packages/hooks/src/useLockFn/index.en-US.md @@ -16,7 +16,7 @@ Add lock to an async function to prevent parallel executions. ## API ```typescript -function useLockFn

( +function useLockFn

( fn: (...args: P) => Promise ): fn: (...args: P) => Promise; ``` diff --git a/packages/hooks/src/useLockFn/index.ts b/packages/hooks/src/useLockFn/index.ts index 5ce96fba40..07de338273 100644 --- a/packages/hooks/src/useLockFn/index.ts +++ b/packages/hooks/src/useLockFn/index.ts @@ -1,19 +1,21 @@ import { useRef, useCallback } from 'react'; -function useLockFn

(fn: (...args: P) => Promise) { +function useLockFn

(fn: (...args: P) => Promise) { const lockRef = useRef(false); return useCallback( async (...args: P) => { - if (lockRef.current) return; + if (lockRef.current) { + return; + } lockRef.current = true; try { const ret = await fn(...args); - lockRef.current = false; return ret; } catch (e) { - lockRef.current = false; throw e; + } finally { + lockRef.current = false; } }, [fn], diff --git a/packages/hooks/src/useLockFn/index.zh-CN.md b/packages/hooks/src/useLockFn/index.zh-CN.md index 61ace21a64..60c48f2759 100644 --- a/packages/hooks/src/useLockFn/index.zh-CN.md +++ b/packages/hooks/src/useLockFn/index.zh-CN.md @@ -16,7 +16,7 @@ nav: ## API ```typescript -function useLockFn

( +function useLockFn

( fn: (...args: P) => Promise ): fn: (...args: P) => Promise; ``` diff --git a/packages/hooks/src/useLongPress/__tests__/index.test.ts b/packages/hooks/src/useLongPress/__tests__/index.spec.ts similarity index 71% rename from packages/hooks/src/useLongPress/__tests__/index.test.ts rename to packages/hooks/src/useLongPress/__tests__/index.spec.ts index 52d88e5aef..1232a051ec 100644 --- a/packages/hooks/src/useLongPress/__tests__/index.test.ts +++ b/packages/hooks/src/useLongPress/__tests__/index.spec.ts @@ -1,49 +1,52 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useLongPress from '../index'; +import { renderHook } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import type { Options } from '../index'; +import useLongPress from '../index'; -const mockCallback = jest.fn(); -const mockClickCallback = jest.fn(); -const mockLongPressEndCallback = jest.fn(); +const mockCallback = vi.fn(); +const mockClickCallback = vi.fn(); +const mockLongPressEndCallback = vi.fn(); -let events = {}; +let events: Record = {}; const mockTarget = { - addEventListener: jest.fn((event, callback) => { + addEventListener: vi.fn((event, callback) => { events[event] = callback; }), - removeEventListener: jest.fn((event) => { + removeEventListener: vi.fn((event) => { Reflect.deleteProperty(events, event); }), }; -const setup = (onLongPress: any, target, options?: Options) => +const setup = (onLongPress: any, target: any, options?: Options) => renderHook(() => useLongPress(onLongPress, target, options)); describe('useLongPress', () => { beforeEach(() => { - jest.useFakeTimers(); + vi.useFakeTimers(); + vi.clearAllMocks(); }); afterEach(() => { events = {}; - jest.useRealTimers(); + vi.useRealTimers(); + vi.clearAllMocks(); }); - it('longPress callback correct', () => { + test('longPress callback correct', () => { setup(mockCallback, mockTarget, { onClick: mockClickCallback, onLongPressEnd: mockLongPressEndCallback, }); expect(mockTarget.addEventListener).toBeCalled(); events['mousedown'](); - jest.advanceTimersByTime(350); + vi.advanceTimersByTime(350); events['mouseleave'](); expect(mockCallback).toBeCalledTimes(1); expect(mockLongPressEndCallback).toBeCalledTimes(1); expect(mockClickCallback).toBeCalledTimes(0); }); - it('click callback correct', () => { + test('click callback correct', () => { setup(mockCallback, mockTarget, { onClick: mockClickCallback, onLongPressEnd: mockLongPressEndCallback, @@ -58,14 +61,14 @@ describe('useLongPress', () => { expect(mockClickCallback).toBeCalledTimes(2); }); - it('longPress and click callback correct', () => { + test('longPress and click callback correct', () => { setup(mockCallback, mockTarget, { onClick: mockClickCallback, onLongPressEnd: mockLongPressEndCallback, }); expect(mockTarget.addEventListener).toBeCalled(); events['mousedown'](); - jest.advanceTimersByTime(350); + vi.advanceTimersByTime(350); events['mouseup'](); events['mousedown'](); events['mouseup'](); @@ -74,7 +77,7 @@ describe('useLongPress', () => { expect(mockClickCallback).toBeCalledTimes(1); }); - it('onLongPress should not be called when over the threshold', () => { + test('onLongPress should not be called when over the threshold', () => { const { unmount } = setup(mockCallback, mockTarget, { moveThreshold: { x: 30, @@ -89,14 +92,14 @@ describe('useLongPress', () => { clientY: 10, }), ); - jest.advanceTimersByTime(320); + vi.advanceTimersByTime(320); expect(mockCallback).not.toBeCalled(); unmount(); expect(events['mousemove']).toBeUndefined(); }); - it(`should not work when target don't support addEventListener method`, () => { + test(`should not work when target don't support addEventListener method`, () => { Object.defineProperty(mockTarget, 'addEventListener', { get() { return false; diff --git a/packages/hooks/src/useLongPress/demo/demo1.tsx b/packages/hooks/src/useLongPress/demo/demo1.tsx index 9a83291b4d..dacc982640 100644 --- a/packages/hooks/src/useLongPress/demo/demo1.tsx +++ b/packages/hooks/src/useLongPress/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 请长按按钮查看效果。 */ -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useLongPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useLongPress/demo/demo2.tsx b/packages/hooks/src/useLongPress/demo/demo2.tsx index dadee3a1e6..260d47898d 100644 --- a/packages/hooks/src/useLongPress/demo/demo2.tsx +++ b/packages/hooks/src/useLongPress/demo/demo2.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import { useLongPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useLongPress/demo/demo3.tsx b/packages/hooks/src/useLongPress/demo/demo3.tsx index 9a68bc37c4..6b155e7d53 100644 --- a/packages/hooks/src/useLongPress/demo/demo3.tsx +++ b/packages/hooks/src/useLongPress/demo/demo3.tsx @@ -5,7 +5,7 @@ * title.zh-CN: 超出移动阈值 * desc.zh-CN: 超出移动阈值之后,长按事件将不会触发 */ -import React, { useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import { useLongPress } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useLongPress/index.en-US.md b/packages/hooks/src/useLongPress/index.en-US.md index ea1163581f..fc7e6aa2a3 100644 --- a/packages/hooks/src/useLongPress/index.en-US.md +++ b/packages/hooks/src/useLongPress/index.en-US.md @@ -27,7 +27,7 @@ Listen for the long press event of the target element. useLongPress( onLongPress: (event: MouseEvent | TouchEvent) => void, target: Target, - options?: { + options: { delay?: number; moveThreshold?: { x?: number; y?: number }; onClick?: (event: MouseEvent | TouchEvent) => void; @@ -42,7 +42,7 @@ useLongPress( | ----------- | ---------------------------- | ----------------------------------------------------------- | ------- | | onLongPress | Trigger function | `(event: MouseEvent \| TouchEvent) => void` | - | | target | DOM node or Ref | `Element` \| `() => Element` \| `MutableRefObject` | - | -| options | Optional configuration items | `Options` | - | +| options | Optional configuration items | `Options` | `{}` | ### Options diff --git a/packages/hooks/src/useLongPress/index.ts b/packages/hooks/src/useLongPress/index.ts index df3f8be751..1edcda784c 100644 --- a/packages/hooks/src/useLongPress/index.ts +++ b/packages/hooks/src/useLongPress/index.ts @@ -2,7 +2,6 @@ import { useRef } from 'react'; import useLatest from '../useLatest'; import type { BasicTarget } from '../utils/domTarget'; import { getTargetElement } from '../utils/domTarget'; -import isBrowser from '../utils/isBrowser'; import useEffectWithTarget from '../utils/useEffectWithTarget'; type EventType = MouseEvent | TouchEvent; @@ -13,11 +12,6 @@ export interface Options { onLongPressEnd?: (event: EventType) => void; } -const touchSupported = - isBrowser && - // @ts-ignore - ('ontouchstart' in window || (window.DocumentTouch && document instanceof DocumentTouch)); - function useLongPress( onLongPress: (event: EventType) => void, target: BasicTarget, @@ -27,9 +21,12 @@ function useLongPress( const onClickRef = useLatest(onClick); const onLongPressEndRef = useLatest(onLongPressEnd); - const timerRef = useRef>(); + const timerRef = useRef>(undefined); + const isTriggeredRef = useRef(false); const pervPositionRef = useRef({ x: 0, y: 0 }); + const mousePressed = useRef(false); + const touchPressed = useRef(false); const hasMoveThreshold = !!( (moveThreshold?.x && moveThreshold.x > 0) || (moveThreshold?.y && moveThreshold.y > 0) @@ -54,13 +51,12 @@ function useLongPress( }; function getClientPosition(event: EventType) { - if (event instanceof TouchEvent) { + if ('TouchEvent' in window && event instanceof TouchEvent) { return { clientX: event.touches[0].clientX, clientY: event.touches[0].clientY, }; } - if (event instanceof MouseEvent) { return { clientX: event.clientX, @@ -68,69 +64,134 @@ function useLongPress( }; } - console.warn('Unsupported event type'); - return { clientX: 0, clientY: 0 }; } - const onStart = (event: EventType) => { + const createTimer = (event: EventType) => { + timerRef.current = setTimeout(() => { + onLongPressRef.current(event); + isTriggeredRef.current = true; + }, delay); + }; + + const onTouchStart = (event: TouchEvent) => { + if (touchPressed.current) { + return; + } + touchPressed.current = true; + if (hasMoveThreshold) { const { clientX, clientY } = getClientPosition(event); pervPositionRef.current.x = clientX; pervPositionRef.current.y = clientY; } - timerRef.current = setTimeout(() => { - onLongPressRef.current(event); - isTriggeredRef.current = true; - }, delay); + createTimer(event); + }; + + const onMouseDown = (event: MouseEvent) => { + if ((event as any)?.sourceCapabilities?.firesTouchEvents) { + return; + } + + mousePressed.current = true; + + if (hasMoveThreshold) { + pervPositionRef.current.x = event.clientX; + pervPositionRef.current.y = event.clientY; + } + createTimer(event); }; - const onMove = (event: TouchEvent) => { + const onMove = (event: EventType) => { if (timerRef.current && overThreshold(event)) { - clearInterval(timerRef.current); + clearTimeout(timerRef.current); timerRef.current = undefined; } }; - const onEnd = (event: EventType, shouldTriggerClick: boolean = false) => { + const onTouchEnd = (event: TouchEvent) => { + if (!touchPressed.current) { + return; + } + touchPressed.current = false; + if (timerRef.current) { clearTimeout(timerRef.current); + timerRef.current = undefined; } + if (isTriggeredRef.current) { onLongPressEndRef.current?.(event); + } else if (onClickRef.current) { + onClickRef.current(event); } - if (shouldTriggerClick && !isTriggeredRef.current && onClickRef.current) { + isTriggeredRef.current = false; + }; + + const onMouseUp = (event: MouseEvent) => { + if ((event as any)?.sourceCapabilities?.firesTouchEvents) { + return; + } + if (!mousePressed.current) { + return; + } + mousePressed.current = false; + + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } + + if (isTriggeredRef.current) { + onLongPressEndRef.current?.(event); + } else if (onClickRef.current) { onClickRef.current(event); } isTriggeredRef.current = false; }; - const onEndWithClick = (event: EventType) => onEnd(event, true); - - if (!touchSupported) { - targetElement.addEventListener('mousedown', onStart); - targetElement.addEventListener('mouseup', onEndWithClick); - targetElement.addEventListener('mouseleave', onEnd); - if (hasMoveThreshold) targetElement.addEventListener('mousemove', onMove); - } else { - targetElement.addEventListener('touchstart', onStart); - targetElement.addEventListener('touchend', onEndWithClick); - if (hasMoveThreshold) targetElement.addEventListener('touchmove', onMove); + const onMouseLeave = (event: MouseEvent) => { + if (!mousePressed.current) { + return; + } + mousePressed.current = false; + + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = undefined; + } + if (isTriggeredRef.current) { + onLongPressEndRef.current?.(event); + isTriggeredRef.current = false; + } + }; + + targetElement.addEventListener('mousedown', onMouseDown as EventListener); + targetElement.addEventListener('mouseup', onMouseUp as EventListener); + targetElement.addEventListener('mouseleave', onMouseLeave as EventListener); + targetElement.addEventListener('touchstart', onTouchStart as EventListener); + targetElement.addEventListener('touchend', onTouchEnd as EventListener); + + if (hasMoveThreshold) { + targetElement.addEventListener('mousemove', onMove as EventListener); + targetElement.addEventListener('touchmove', onMove as EventListener); } + return () => { if (timerRef.current) { clearTimeout(timerRef.current); isTriggeredRef.current = false; } - if (!touchSupported) { - targetElement.removeEventListener('mousedown', onStart); - targetElement.removeEventListener('mouseup', onEndWithClick); - targetElement.removeEventListener('mouseleave', onEnd); - if (hasMoveThreshold) targetElement.removeEventListener('mousemove', onMove); - } else { - targetElement.removeEventListener('touchstart', onStart); - targetElement.removeEventListener('touchend', onEndWithClick); - if (hasMoveThreshold) targetElement.removeEventListener('touchmove', onMove); + + targetElement.removeEventListener('mousedown', onMouseDown as EventListener); + targetElement.removeEventListener('mouseup', onMouseUp as EventListener); + targetElement.removeEventListener('mouseleave', onMouseLeave as EventListener); + targetElement.removeEventListener('touchstart', onTouchStart as EventListener); + targetElement.removeEventListener('touchend', onTouchEnd as EventListener); + + if (hasMoveThreshold) { + targetElement.removeEventListener('mousemove', onMove as EventListener); + targetElement.removeEventListener('touchmove', onMove as EventListener); } }; }, diff --git a/packages/hooks/src/useLongPress/index.zh-CN.md b/packages/hooks/src/useLongPress/index.zh-CN.md index d1cedd91c3..a3683ca2cf 100644 --- a/packages/hooks/src/useLongPress/index.zh-CN.md +++ b/packages/hooks/src/useLongPress/index.zh-CN.md @@ -27,7 +27,7 @@ nav: useLongPress( onLongPress: (event: MouseEvent | TouchEvent) => void, target: Target, - options?: { + options: { delay?: number; moveThreshold?: { x?: number; y?: number }; onClick?: (event: MouseEvent | TouchEvent) => void; @@ -42,7 +42,7 @@ useLongPress( | ----------- | ---------------- | ----------------------------------------------------------- | ------ | | onLongPress | 触发函数 | `(event: MouseEvent \| TouchEvent) => void` | - | | target | DOM 节点或者 Ref | `Element` \| `() => Element` \| `MutableRefObject` | - | -| options | 可选配置项 | `Options` | - | +| options | 可选配置项 | `Options` | `{}` | ### Options diff --git a/packages/hooks/src/useMap/__tests__/index.test.ts b/packages/hooks/src/useMap/__tests__/index.spec.ts similarity index 70% rename from packages/hooks/src/useMap/__tests__/index.test.ts rename to packages/hooks/src/useMap/__tests__/index.spec.ts index 11a5a10d11..5996b7ac79 100644 --- a/packages/hooks/src/useMap/__tests__/index.test.ts +++ b/packages/hooks/src/useMap/__tests__/index.spec.ts @@ -1,10 +1,11 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useMap from '../index'; const setup = (initialMap?: Iterable<[any, any]>) => renderHook(() => useMap(initialMap)); describe('useMap', () => { - it('should init map and utils', () => { + test('should init map and utils', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -24,13 +25,15 @@ describe('useMap', () => { }); }); - it('should init empty map if not initial object provided', () => { + test('should init empty map if not initial object provided', () => { const { result } = setup(); - expect([...result.current[0]]).toEqual([]); + + const { result: result2 } = setup(undefined); + expect([...result2.current[0]]).toEqual([]); }); - it('should get corresponding value for initial provided key', () => { + test('should get corresponding value for initial provided key', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -45,7 +48,7 @@ describe('useMap', () => { expect(value).toBe(1); }); - it('should get corresponding value for existing provided key', () => { + test('should get corresponding value for existing provided key', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -63,7 +66,7 @@ describe('useMap', () => { expect(value).toBe(99); }); - it('should get undefined for non-existing provided key', () => { + test('should get undefined for non-existing provided key', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -78,7 +81,7 @@ describe('useMap', () => { expect(value).toBeUndefined(); }); - it('should set new key-value pair', () => { + test('should set new key-value pair', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -96,7 +99,7 @@ describe('useMap', () => { ]); }); - it('should override current value if setting existing key', () => { + test('should override current value if setting existing key', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -113,7 +116,7 @@ describe('useMap', () => { ]); }); - it('should set new map', () => { + test('should set new map', () => { const { result } = setup([ ['foo', 'bar'], ['a', 1], @@ -131,9 +134,15 @@ describe('useMap', () => { ['foo', 'foo'], ['a', 2], ]); + + act(() => { + // @ts-ignore + utils.setAll(); + }); + expect([...result.current[0]]).toEqual([]); }); - it('remove should be work', () => { + test('remove should be work', () => { const { result } = setup([['msg', 'hello']]); const { remove } = result.current[1]; expect(result.current[0].size).toBe(1); @@ -141,9 +150,27 @@ describe('useMap', () => { remove('msg'); }); expect(result.current[0].size).toBe(0); + + const { result: result2 } = setup([ + ['foo', 'bar'], + ['a', 1], + ['b', 2], + ['c', 3], + ]); + const [, utils] = result2.current; + + act(() => { + utils.remove('a'); + }); + + expect([...result2.current[0]]).toEqual([ + ['foo', 'bar'], + ['b', 2], + ['c', 3], + ]); }); - it('reset should be work', () => { + test('reset should be work', () => { const { result } = setup([['msg', 'hello']]); const { set, reset } = result.current[1]; act(() => { diff --git a/packages/hooks/src/useMap/demo/demo1.tsx b/packages/hooks/src/useMap/demo/demo1.tsx index 828e714e65..58cd02f812 100644 --- a/packages/hooks/src/useMap/demo/demo1.tsx +++ b/packages/hooks/src/useMap/demo/demo1.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useMap } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useMap/index.en-US.md b/packages/hooks/src/useMap/index.en-US.md index 6bac03088e..2ee1a6b7e7 100644 --- a/packages/hooks/src/useMap/index.en-US.md +++ b/packages/hooks/src/useMap/index.en-US.md @@ -25,22 +25,22 @@ const [ reset, get } -] = useMap(initialValue?: Iterable<[any, any]>); +] = useMap(initialValue); ``` ### Result -| Property | Description | Type | -| -------- | ---------------- | ---------------------------------------- | -| map | Map object | `Map` | -| set | Add item | `(key: any, value: any) => void` | -| get | Get item | `(key: any) => MapItem` | -| setAll | Set a new Map | `(newMap: Iterable<[any, any]>) => void` | -| remove | Remove key | `(key: any) => void` | -| reset | Reset to default | `() => void` | +| Property | Description | Type | +| -------- | ---------------- | ------------------------------------ | +| map | Map object | `Map` | +| set | Add item | `(key: K, value: V) => void` | +| get | Get item | `(key: K) => V \| undefined` | +| setAll | Set a new Map | `(newMap: Iterable<[K, V]>) => void` | +| remove | Remove key | `(key: K) => void` | +| reset | Reset to default | `() => void` | ### Params -| Property | Description | Type | Default | -| ------------ | --------------------------- | ---------------------- | ------- | -| initialValue | Optional, set default value | `Iterable<[any, any]>` | - | +| Property | Description | Type | Default | +| ------------ | --------------------------- | ------------------ | ------- | +| initialValue | Optional, set default value | `Iterable<[K, V]>` | - | diff --git a/packages/hooks/src/useMap/index.ts b/packages/hooks/src/useMap/index.ts index 464ff3e4e9..4f0407fb57 100644 --- a/packages/hooks/src/useMap/index.ts +++ b/packages/hooks/src/useMap/index.ts @@ -2,11 +2,8 @@ import { useState } from 'react'; import useMemoizedFn from '../useMemoizedFn'; function useMap(initialValue?: Iterable) { - const getInitValue = () => { - return initialValue === undefined ? new Map() : new Map(initialValue); - }; - - const [map, setMap] = useState>(() => getInitValue()); + const getInitValue = () => new Map(initialValue); + const [map, setMap] = useState>(getInitValue); const set = (key: K, entry: T) => { setMap((prev) => { diff --git a/packages/hooks/src/useMap/index.zh-CN.md b/packages/hooks/src/useMap/index.zh-CN.md index 177620ee5e..7e3cb42fd5 100644 --- a/packages/hooks/src/useMap/index.zh-CN.md +++ b/packages/hooks/src/useMap/index.zh-CN.md @@ -23,22 +23,22 @@ const [ reset, get } -] = useMap(initialValue?: Iterable<[any, any]>); +] = useMap(initialValue); ``` ### Result -| 参数 | 说明 | 类型 | -| ------ | --------------------- | ---------------------------------------- | -| map | Map 对象 | `Map` | -| set | 添加元素 | `(key: any, value: any) => void` | -| get | 获取元素 | `(key: any) => MapItem` | -| setAll | 生成一个新的 Map 对象 | `(newMap: Iterable<[any, any]>) => void` | -| remove | 移除元素 | `(key: any) => void` | -| reset | 重置为默认值 | `() => void` | +| 参数 | 说明 | 类型 | +| ------ | --------------------- | ------------------------------------ | +| map | Map 对象 | `Map` | +| set | 添加元素 | `(key: K, value: V) => void` | +| get | 获取元素 | `(key: K) => V \| undefined` | +| setAll | 生成一个新的 Map 对象 | `(newMap: Iterable<[K, V]>) => void` | +| remove | 移除元素 | `(key: K) => void` | +| reset | 重置为默认值 | `() => void` | ### Params -| 参数 | 说明 | 类型 | 默认值 | -| ------------ | --------------------------- | ---------------------- | ------ | -| initialValue | 可选项,传入默认的 Map 参数 | `Iterable<[any, any]>` | - | +| 参数 | 说明 | 类型 | 默认值 | +| ------------ | --------------------------- | ------------------ | ------ | +| initialValue | 可选项,传入默认的 Map 参数 | `Iterable<[K, V]>` | - | diff --git a/packages/hooks/src/useMemoizedFn/__tests__/index.spec.ts b/packages/hooks/src/useMemoizedFn/__tests__/index.spec.ts new file mode 100644 index 0000000000..09fb2ff162 --- /dev/null +++ b/packages/hooks/src/useMemoizedFn/__tests__/index.spec.ts @@ -0,0 +1,35 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; +import useMemoizedFn from '../'; + +const useCount = () => { + const [count, setCount] = useState(0); + + const addCount = () => { + setCount((c) => c + 1); + }; + + const memoizedFn = useMemoizedFn(() => count); + + return { addCount, memoizedFn }; +}; + +let hook: RenderHookResult; + +describe('useMemoizedFn', () => { + test('useMemoizedFn should work', () => { + act(() => { + hook = renderHook(() => useCount()); + }); + const currentFn = hook.result.current.memoizedFn; + expect(hook.result.current.memoizedFn()).toBe(0); + + act(() => { + hook.result.current.addCount(); + }); + + expect(currentFn).toEqual(hook.result.current.memoizedFn); + expect(hook.result.current.memoizedFn()).toBe(1); + }); +}); diff --git a/packages/hooks/src/useMemoizedFn/__tests__/index.test.ts b/packages/hooks/src/useMemoizedFn/__tests__/index.test.ts deleted file mode 100644 index e6886359f5..0000000000 --- a/packages/hooks/src/useMemoizedFn/__tests__/index.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; -import { useState } from 'react'; -import useMemoizedFn from '../'; - -const useCount = () => { - const [count, setCount] = useState(0); - - const addCount = () => { - setCount((c) => c + 1); - }; - - const memoizedFn = useMemoizedFn(() => count); - - return { addCount, memoizedFn }; -}; - -let hook: RenderHookResult<[], ReturnType>; - -describe('useMemoizedFn', () => { - it('useMemoizedFn should work', () => { - act(() => { - hook = renderHook(() => useCount()); - }); - const currentFn = hook.result.current.memoizedFn; - expect(hook.result.current.memoizedFn()).toEqual(0); - - act(() => { - hook.result.current.addCount(); - }); - - expect(currentFn).toEqual(hook.result.current.memoizedFn); - expect(hook.result.current.memoizedFn()).toEqual(1); - }); - - it('should output error when fn is not a function', () => { - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - renderHook(() => useMemoizedFn(1 as any)); - expect(errSpy).toBeCalledWith('useMemoizedFn expected parameter is a function, got number'); - errSpy.mockRestore(); - }); -}); diff --git a/packages/hooks/src/useMemoizedFn/demo/demo1.tsx b/packages/hooks/src/useMemoizedFn/demo/demo1.tsx index e3a9506a65..111aebc9d8 100644 --- a/packages/hooks/src/useMemoizedFn/demo/demo1.tsx +++ b/packages/hooks/src/useMemoizedFn/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: useMemoizedFn 与 useCallback 可以实现同样的效果。 */ -import React, { useState, useCallback } from 'react'; +import { useState, useCallback } from 'react'; import { message } from 'antd'; import { useMemoizedFn } from 'ahooks'; diff --git a/packages/hooks/src/useMemoizedFn/demo/demo2.tsx b/packages/hooks/src/useMemoizedFn/demo/demo2.tsx index e8e34f46d1..8090981050 100644 --- a/packages/hooks/src/useMemoizedFn/demo/demo2.tsx +++ b/packages/hooks/src/useMemoizedFn/demo/demo2.tsx @@ -8,7 +8,7 @@ import { useMemoizedFn } from 'ahooks'; import { message } from 'antd'; -import React, { useCallback, useRef, useState } from 'react'; +import { useCallback, useRef, useState, memo } from 'react'; export default () => { const [count, setCount] = useState(0); @@ -51,7 +51,7 @@ export default () => { }; // some expensive component with React.memo -const ExpensiveTree = React.memo<{ [key: string]: any }>(({ showCount }) => { +const ExpensiveTree = memo<{ [key: string]: any }>(({ showCount }) => { const renderCountRef = useRef(0); renderCountRef.current += 1; diff --git a/packages/hooks/src/useMemoizedFn/index.en-US.md b/packages/hooks/src/useMemoizedFn/index.en-US.md index 4a42b52724..291837f115 100644 --- a/packages/hooks/src/useMemoizedFn/index.en-US.md +++ b/packages/hooks/src/useMemoizedFn/index.en-US.md @@ -5,7 +5,7 @@ nav: # useMemoizedFn -Hooks for persistent functions. In theory, useMemoizedFn can be used instead of useCallback. +Hooks for persistent functions. In general, useMemoizedFn can be used instead of useCallback. See [FAQ](#faq) for special cases. In some scenarios, we need to use useCallback to cache a function, but when the second parameter deps changes, the function will be regenerated, causing the function reference to change. @@ -42,17 +42,25 @@ const func = useMemoizedFn(() => { ## API ```typescript -const fn = useMemoizedFn(fn: T): T; +const memoizedFn = useMemoizedFn(fn: T): T; ``` ### Result -| Property | Description | Type | -| -------- | -------------------------------------- | ------------------------- | -| fn | Fn the reference address never changes | `(...args: any[]) => any` | +| Property | Description | Type | +| ---------- | ------------------------------------------------- | ------------------------- | +| memoizedFn | Function that the reference address never changes | `(...args: any[]) => any` | ### Params | Property | Description | Type | Default | | -------- | --------------------------------- | ------------------------- | ------- | | fn | Function that require persistence | `(...args: any[]) => any` | - | + +## FAQ + +### The function returned by `useMemoizedFn` will not inherit properties from fn itself? + +The function returned by `useMemoizedFn` is entirely different from the reference of the passed `fn`, and it does not inherit any properties from `fn` itself. If you want to preserve the properties of the function itself after memoization, `useMemoizedFn` currently does not fulfill that requirement. In this case, consider downgrading to using `useCallback` or `useMemo` instead. + +Related issues: [2273](https://github.com/alibaba/hooks/issues/2273) diff --git a/packages/hooks/src/useMemoizedFn/index.ts b/packages/hooks/src/useMemoizedFn/index.ts index fdd2d3cbc9..bc118ac35e 100644 --- a/packages/hooks/src/useMemoizedFn/index.ts +++ b/packages/hooks/src/useMemoizedFn/index.ts @@ -9,7 +9,7 @@ type PickFunction = ( ...args: Parameters ) => ReturnType; -function useMemoizedFn(fn: T) { +const useMemoizedFn = (fn: T) => { if (isDev) { if (!isFunction(fn)) { console.error(`useMemoizedFn expected parameter is a function, got ${typeof fn}`); @@ -20,16 +20,17 @@ function useMemoizedFn(fn: T) { // why not write `fnRef.current = fn`? // https://github.com/alibaba/hooks/issues/728 - fnRef.current = useMemo(() => fn, [fn]); + fnRef.current = useMemo(() => fn, [fn]); + + const memoizedFn = useRef>(undefined); - const memoizedFn = useRef>(); if (!memoizedFn.current) { memoizedFn.current = function (this, ...args) { return fnRef.current.apply(this, args); }; } - return memoizedFn.current as T; -} + return memoizedFn.current; +}; export default useMemoizedFn; diff --git a/packages/hooks/src/useMemoizedFn/index.zh-CN.md b/packages/hooks/src/useMemoizedFn/index.zh-CN.md index 0bf7c8bed0..a3017c9846 100644 --- a/packages/hooks/src/useMemoizedFn/index.zh-CN.md +++ b/packages/hooks/src/useMemoizedFn/index.zh-CN.md @@ -5,7 +5,7 @@ nav: # useMemoizedFn -持久化 function 的 Hook,理论上,可以使用 useMemoizedFn 完全代替 useCallback。 +持久化 function 的 Hook,一般情况下,可以使用 useMemoizedFn 完全代替 useCallback,特殊情况见 [FAQ](#faq)。 在某些场景中,我们需要使用 useCallback 来记住一个函数,但是在第二个参数 deps 变化时,会重新生成函数,导致函数地址变化。 @@ -42,17 +42,25 @@ const func = useMemoizedFn(() => { ## API ```typescript -const fn = useMemoizedFn(fn: T): T; +const memoizedFn = useMemoizedFn(fn: T): T; ``` ### Result -| 参数 | 说明 | 类型 | -| ---- | ------------------------- | ------------------------- | -| fn | 引用地址永远不会变化的 fn | `(...args: any[]) => any` | +| 参数 | 说明 | 类型 | +| ---------- | -------------------------- | ------------------------- | +| memoizedFn | 引用地址永远不会变化的函数 | `(...args: any[]) => any` | ### Params | 参数 | 说明 | 类型 | 默认值 | | ---- | ---------------- | ------------------------- | ------ | | fn | 需要持久化的函数 | `(...args: any[]) => any` | - | + +## FAQ + +### `useMemoizedFn` 返回的函数没有继承 fn 自身的属性? + +`useMemoizedFn` 返回的函数与传入的 fn 的引用完全不同,且没有继承 fn 自身的属性。如果想要持久化后函数自身的属性不丢失,目前 `useMemoizedFn` 满足不了,请降级使用 `useCallback`、`useMemo`。 + +Related issues: [2273](https://github.com/alibaba/hooks/issues/2273) diff --git a/packages/hooks/src/useMount/__tests__/index.spec.ts b/packages/hooks/src/useMount/__tests__/index.spec.ts new file mode 100644 index 0000000000..c9aa3ef5a3 --- /dev/null +++ b/packages/hooks/src/useMount/__tests__/index.spec.ts @@ -0,0 +1,53 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import useMount from '../index'; + +describe('useMount', () => { + test('test mount', async () => { + const destructor = vi.fn(); + const fn = vi.fn(); + fn.mockReturnValue(destructor); + const hook = renderHook(() => useMount(fn)); + expect(fn).toHaveBeenCalledTimes(1); + expect(destructor).toHaveBeenCalledTimes(0); + hook.rerender(); + expect(fn).toHaveBeenCalledTimes(1); + expect(destructor).toHaveBeenCalledTimes(0); + hook.unmount(); + expect(fn).toHaveBeenCalledTimes(1); + expect(destructor).toHaveBeenCalledTimes(1); + + renderHook(() => useMount(fn)).unmount(); + expect(fn).toHaveBeenCalledTimes(2); + expect(destructor).toHaveBeenCalledTimes(2); + }); + + test('test mount with async function', async () => { + const mockAsyncFn = vi.fn().mockResolvedValue(undefined); + const hook = renderHook(() => useMount(mockAsyncFn)); + expect(mockAsyncFn).toHaveBeenCalledTimes(1); + hook.rerender(); + expect(mockAsyncFn).toHaveBeenCalledTimes(1); + hook.unmount(); + expect(mockAsyncFn).toHaveBeenCalledTimes(1); + }); + + test('test mount with async function that returns cleanup', async () => { + const cleanup = vi.fn(); + const mockAsyncFn = vi.fn().mockResolvedValue(cleanup); + const hook = renderHook(() => useMount(mockAsyncFn)); + expect(mockAsyncFn).toHaveBeenCalledTimes(1); + hook.unmount(); + // Cleanup should not be called for async functions + expect(cleanup).toHaveBeenCalledTimes(0); + }); + + // test('should output error when fn is not a function', () => { + // const errSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + // renderHook(() => useMount(1 as any)); + // expect(errSpy).toBeCalledWith( + // 'useMount: parameter `fn` expected to be a function, but got "number".', + // ); + // errSpy.mockRestore(); + // }); +}); diff --git a/packages/hooks/src/useMount/__tests__/index.test.ts b/packages/hooks/src/useMount/__tests__/index.test.ts deleted file mode 100644 index 7816574b4d..0000000000 --- a/packages/hooks/src/useMount/__tests__/index.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useMount from '../index'; - -describe('useMount', () => { - it('test mount', async () => { - const fn = jest.fn(); - const hook = renderHook(() => useMount(fn)); - expect(fn).toBeCalledTimes(1); - hook.rerender(); - expect(fn).toBeCalledTimes(1); - hook.unmount(); - expect(fn).toBeCalledTimes(1); - - renderHook(() => useMount(fn)).unmount(); - expect(fn).toBeCalledTimes(2); - }); - - it('should output error when fn is not a function', () => { - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - renderHook(() => useMount(1 as any)); - expect(errSpy).toBeCalledWith( - 'useMount: parameter `fn` expected to be a function, but got "number".', - ); - errSpy.mockRestore(); - }); -}); diff --git a/packages/hooks/src/useMount/demo/demo1.tsx b/packages/hooks/src/useMount/demo/demo1.tsx index 0748bc5b61..49ee5af42e 100644 --- a/packages/hooks/src/useMount/demo/demo1.tsx +++ b/packages/hooks/src/useMount/demo/demo1.tsx @@ -8,11 +8,13 @@ import { useMount, useBoolean } from 'ahooks'; import { message } from 'antd'; -import React from 'react'; - const MyComponent = () => { useMount(() => { message.info('mount'); + + return () => { + message.info('unmount'); + }; }); return

Hello World
; diff --git a/packages/hooks/src/useMount/index.en-US.md b/packages/hooks/src/useMount/index.en-US.md index d4f5fe0956..76cbfff465 100644 --- a/packages/hooks/src/useMount/index.en-US.md +++ b/packages/hooks/src/useMount/index.en-US.md @@ -16,11 +16,11 @@ A hook that executes a function after the component is mounted. ## API ```typescript -useMount(fn: () => void); +useMount(fn: EffectCallback); ``` ### Params | Property | Description | Type | Default | | -------- | --------------------------- | ------------ | ------- | -| fn | The function to be executed | `() => void` | - | +| fn | The function to be executed | `EffectCallback` | - | diff --git a/packages/hooks/src/useMount/index.ts b/packages/hooks/src/useMount/index.ts index 1c437e2b59..db3b43d23c 100644 --- a/packages/hooks/src/useMount/index.ts +++ b/packages/hooks/src/useMount/index.ts @@ -1,8 +1,11 @@ import { useEffect } from 'react'; +import { type EffectCallback } from 'react'; import { isFunction } from '../utils'; import isDev from '../utils/isDev'; -const useMount = (fn: () => void) => { +type MountCallback = EffectCallback | (() => Promise void)>); + +const useMount = (fn: MountCallback) => { if (isDev) { if (!isFunction(fn)) { console.error( @@ -12,7 +15,12 @@ const useMount = (fn: () => void) => { } useEffect(() => { - fn?.(); + const result = fn?.(); + // If fn returns a Promise, don't return it as cleanup function + if (result && typeof result === 'object' && typeof (result as any).then === 'function') { + return; + } + return result as ReturnType; }, []); }; diff --git a/packages/hooks/src/useMount/index.zh-CN.md b/packages/hooks/src/useMount/index.zh-CN.md index 390edb4a06..55886c605b 100644 --- a/packages/hooks/src/useMount/index.zh-CN.md +++ b/packages/hooks/src/useMount/index.zh-CN.md @@ -16,11 +16,11 @@ nav: ## API ```typescript -useMount(fn: () => void); +useMount(fn: EffectCallback); ``` ### 参数 | 参数 | 说明 | 类型 | 默认值 | | ---- | ------------------ | ------------ | ------ | -| fn | 初始化时执行的函数 | `() => void` | - | +| fn | 初始化时执行的函数 | `EffectCallback` | - | diff --git a/packages/hooks/src/useMouse/__tests__/index.spec.ts b/packages/hooks/src/useMouse/__tests__/index.spec.ts new file mode 100644 index 0000000000..421d59a0f6 --- /dev/null +++ b/packages/hooks/src/useMouse/__tests__/index.spec.ts @@ -0,0 +1,56 @@ +import { renderHook, waitFor } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import useMouse from '../index'; + +describe('useMouse', () => { + function moveMouse(x: number, y: number) { + document.dispatchEvent( + new MouseEvent('mousemove', { + clientX: x, + clientY: y, + screenX: x, + screenY: y, + }), + ); + } + + test('on mouseMove', async () => { + const hook = renderHook(() => useMouse()); + expect(hook.result.current.pageX).toBeNaN(); + expect(hook.result.current.pageY).toBeNaN(); + + moveMouse(10, 10); + + // In jsdom environment, pageX and pageY might be set to clientX and clientY + await waitFor(() => expect(hook.result.current.clientX).toBe(10)); + expect(hook.result.current.clientY).toBe(10); + expect(hook.result.current.screenX).toBe(10); + expect(hook.result.current.screenY).toBe(10); + }); + + test('should be work with target', async () => { + const events: Record = {}; + const getBoundingClientRectMock = vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect'); + vi.spyOn(document, 'addEventListener').mockImplementation( + vi.fn((event: any, callback: any) => { + events[event] = callback; + }), + ); + + const targetEl = document.createElement('div'); + getBoundingClientRectMock.mockReturnValue({ + left: 100, + top: 100, + width: 200, + height: 200, + } as DOMRect); + const { result } = renderHook(() => useMouse(targetEl)); + events['mousemove']({ pageX: 100, pageY: 100 }); + + await waitFor(() => expect(result.current.elementX).toBe(0)); + expect(result.current.elementX).toBe(0); + expect(result.current.elementY).toBe(0); + expect(result.current.elementPosX).toBe(100); + expect(result.current.elementPosY).toBe(100); + }); +}); diff --git a/packages/hooks/src/useMouse/__tests__/index.test.ts b/packages/hooks/src/useMouse/__tests__/index.test.ts deleted file mode 100644 index d9e3aa89fa..0000000000 --- a/packages/hooks/src/useMouse/__tests__/index.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useMouse from '../index'; - -describe('useMouse', () => { - function moveMouse(x: number, y: number) { - document.dispatchEvent( - new MouseEvent('mousemove', { - clientX: x, - clientY: y, - screenX: x, - screenY: y, - }), - ); - } - - it('on mouseMove', async () => { - const hook = renderHook(() => useMouse()); - expect(hook.result.current.pageX).toEqual(NaN); - expect(hook.result.current.pageY).toEqual(NaN); - - moveMouse(10, 10); - await hook.waitForNextUpdate(); - - // can't manually set pageX & pageY for mouseEvent, default undefined here. - expect(hook.result.current.pageX).toEqual(undefined); - expect(hook.result.current.pageY).toEqual(undefined); - expect(hook.result.current.clientX).toEqual(10); - expect(hook.result.current.clientY).toEqual(10); - expect(hook.result.current.screenX).toEqual(10); - expect(hook.result.current.screenY).toEqual(10); - }); - - it('should be work with target', async () => { - const events = {}; - const getBoundingClientRectMock = jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect'); - jest.spyOn(document, 'addEventListener').mockImplementation( - jest.fn((event: any, callback: any) => { - events[event] = callback; - }), - ); - - const targetEl = document.createElement('div'); - getBoundingClientRectMock.mockReturnValue({ - left: 100, - top: 100, - width: 200, - height: 200, - } as DOMRect); - const { result, waitForNextUpdate } = renderHook(() => useMouse(targetEl)); - events['mousemove']({ pageX: 100, pageY: 100 }); - await waitForNextUpdate(); - - expect(result.current.elementX).toBe(0); - expect(result.current.elementY).toBe(0); - expect(result.current.elementPosX).toBe(100); - expect(result.current.elementPosY).toBe(100); - }); -}); diff --git a/packages/hooks/src/useMouse/demo/demo1.tsx b/packages/hooks/src/useMouse/demo/demo1.tsx index 7e66f15d1f..d8be571156 100644 --- a/packages/hooks/src/useMouse/demo/demo1.tsx +++ b/packages/hooks/src/useMouse/demo/demo1.tsx @@ -7,8 +7,6 @@ */ import { useMouse } from 'ahooks'; -import React from 'react'; - export default () => { const mouse = useMouse(); diff --git a/packages/hooks/src/useMouse/demo/demo2.tsx b/packages/hooks/src/useMouse/demo/demo2.tsx index 338f25a690..207c3b32a1 100644 --- a/packages/hooks/src/useMouse/demo/demo2.tsx +++ b/packages/hooks/src/useMouse/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 通过传入目标元素,可以获取鼠标相对于元素的位置。 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useMouse } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useMutationObserver/__tests__/index.test.ts b/packages/hooks/src/useMutationObserver/__tests__/index.spec.ts similarity index 70% rename from packages/hooks/src/useMutationObserver/__tests__/index.test.ts rename to packages/hooks/src/useMutationObserver/__tests__/index.spec.ts index b4ee9ce707..28cc730c4e 100644 --- a/packages/hooks/src/useMutationObserver/__tests__/index.test.ts +++ b/packages/hooks/src/useMutationObserver/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import useMutationObserver from '../index'; const options: MutationObserverInit = { attributes: true, childList: true }; @@ -15,16 +16,16 @@ describe('useMutationObserver', () => { document.body.removeChild(container); }); - it('should callback work when target style be changed', async () => { - const callback = jest.fn(); + test('should callback work when target style be changed', async () => { + const callback = vi.fn(); const { rerender } = renderHook(() => useMutationObserver(callback, () => container, options)); container.style.backgroundColor = '#000'; await rerender(); expect(callback).toBeCalled(); }); - it('should callback work when target node tree be changed', async () => { - const callback = jest.fn(); + test('should callback work when target node tree be changed', async () => { + const callback = vi.fn(); const { rerender } = renderHook(() => useMutationObserver(callback, () => container, options)); const paraEl = document.createElement('p'); container.appendChild(paraEl); @@ -32,8 +33,8 @@ describe('useMutationObserver', () => { expect(callback).toBeCalled(); }); - it('should not work when target is null', async () => { - const callback = jest.fn(); + test('should not work when target is null', async () => { + const callback = vi.fn(); const { rerender } = renderHook(() => useMutationObserver(callback, null, options)); container.style.backgroundColor = '#000'; await rerender(); diff --git a/packages/hooks/src/useMutationObserver/demo/demo1.tsx b/packages/hooks/src/useMutationObserver/demo/demo1.tsx index d92a09933f..c84c4684f6 100644 --- a/packages/hooks/src/useMutationObserver/demo/demo1.tsx +++ b/packages/hooks/src/useMutationObserver/demo/demo1.tsx @@ -5,7 +5,7 @@ */ import { useMutationObserver } from 'ahooks'; -import React, { useRef, useState } from 'react'; +import { useRef, useState } from 'react'; const App: React.FC = () => { const [width, setWidth] = useState(200); diff --git a/packages/hooks/src/useMutationObserver/index.ts b/packages/hooks/src/useMutationObserver/index.ts index 14a2444ed2..182f24ec7a 100644 --- a/packages/hooks/src/useMutationObserver/index.ts +++ b/packages/hooks/src/useMutationObserver/index.ts @@ -19,9 +19,7 @@ const useMutationObserver = ( const observer = new MutationObserver(callbackRef.current); observer.observe(element, options); return () => { - if (observer) { - observer.disconnect(); - } + observer?.disconnect(); }; }, [options], diff --git a/packages/hooks/src/useNetwork/__tests__/index.test.ts b/packages/hooks/src/useNetwork/__tests__/index.spec.ts similarity index 74% rename from packages/hooks/src/useNetwork/__tests__/index.test.ts rename to packages/hooks/src/useNetwork/__tests__/index.spec.ts index b5d51019f0..3884a7846d 100644 --- a/packages/hooks/src/useNetwork/__tests__/index.test.ts +++ b/packages/hooks/src/useNetwork/__tests__/index.spec.ts @@ -1,8 +1,9 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useNetwork from '../index'; -import { renderHook, act } from '@testing-library/react-hooks'; describe('useNetwork', () => { - it('toggle network state', () => { + test('toggle network state', () => { const { result } = renderHook(() => useNetwork()); expect(result.current.online).toBeTruthy(); act(() => { diff --git a/packages/hooks/src/useNetwork/demo/demo1.tsx b/packages/hooks/src/useNetwork/demo/demo1.tsx index 8f84a23f6d..c797124213 100644 --- a/packages/hooks/src/useNetwork/demo/demo1.tsx +++ b/packages/hooks/src/useNetwork/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 返回网络状态信息 */ -import React from 'react'; import { useNetwork } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useNetwork/index.ts b/packages/hooks/src/useNetwork/index.ts index 665f2ee21c..fbd23ead44 100644 --- a/packages/hooks/src/useNetwork/index.ts +++ b/packages/hooks/src/useNetwork/index.ts @@ -20,13 +20,17 @@ enum NetworkEventType { function getConnection() { const nav = navigator as any; - if (!isObject(nav)) return null; + if (!isObject(nav)) { + return null; + } return nav.connection || nav.mozConnection || nav.webkitConnection; } function getConnectionProperty(): NetworkState { const c = getConnection(); - if (!c) return {}; + if (!c) { + return {}; + } return { rtt: c.rtt, type: c.type, diff --git a/packages/hooks/src/usePagination/__tests__/index.spec.ts b/packages/hooks/src/usePagination/__tests__/index.spec.ts new file mode 100644 index 0000000000..da23575953 --- /dev/null +++ b/packages/hooks/src/usePagination/__tests__/index.spec.ts @@ -0,0 +1,152 @@ +import type { RenderHookResult } from '@testing-library/react'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import usePagination from '../'; + +// 初始化 +// 基本 action +// refreshDeps +// cache + +describe('usePagination', () => { + let queryArgs: any; + const asyncFn = (query: any) => { + queryArgs = query; + return Promise.resolve({ + current: query.current, + total: 55, + pageSize: query.pageSize, + list: [], + }); + }; + + const setUp = ( + service: Parameters[0], + options: Parameters[1], + ) => renderHook((o) => usePagination(service, o || options)); + + let hook: RenderHookResult; + + test('should fetch after first render', async () => { + queryArgs = undefined; + act(() => { + hook = setUp(asyncFn, {}); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(1); + expect(queryArgs.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.loading).toBe(false)); + + expect(hook.result.current.pagination.current).toBe(1); + expect(hook.result.current.pagination.pageSize).toBe(10); + expect(hook.result.current.pagination.total).toBe(55); + expect(hook.result.current.pagination.totalPage).toBe(6); + }); + + test('should action work', async () => { + queryArgs = undefined; + act(() => { + hook = setUp(asyncFn, {}); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(1); + expect(queryArgs.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.loading).toBe(false)); + + act(() => { + hook.result.current.pagination.changeCurrent(2); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(2); + expect(queryArgs.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(2)); + + act(() => { + hook.result.current.pagination.changeCurrent(10); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(6); + expect(queryArgs.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(6)); + + act(() => { + hook.result.current.pagination.changePageSize(20); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(3); + expect(queryArgs.pageSize).toBe(20); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(3)); + expect(hook.result.current.pagination.pageSize).toBe(20); + expect(hook.result.current.pagination.totalPage).toBe(3); + + act(() => { + hook.result.current.pagination.onChange(2, 10); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(2); + expect(queryArgs.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(2)); + expect(hook.result.current.pagination.pageSize).toBe(10); + expect(hook.result.current.pagination.totalPage).toBe(6); + }); + + test('should refreshDeps work', async () => { + queryArgs = undefined; + let dep = 1; + act(() => { + hook = setUp(asyncFn, { + refreshDeps: [dep], + }); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(1); + expect(queryArgs.pageSize).toBe(10); + await waitFor(() => expect(hook.result.current.loading).toBe(false)); + + act(() => { + hook.result.current.pagination.onChange(3, 20); + }); + expect(hook.result.current.loading).toBe(true); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(3)); + expect(hook.result.current.pagination.pageSize).toBe(20); + + dep = 2; + hook.rerender({ + refreshDeps: [dep], + }); + + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(1); + expect(queryArgs.pageSize).toBe(20); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(1)); + expect(hook.result.current.pagination.pageSize).toBe(20); + }); + + test('should default params work', async () => { + queryArgs = undefined; + act(() => { + hook = setUp(asyncFn, { + defaultPageSize: 5, + defaultCurrent: 2, + }); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(2); + expect(queryArgs.pageSize).toBe(5); + await waitFor(() => expect(hook.result.current.loading).toBe(false)); + + expect(hook.result.current.pagination.current).toBe(2); + expect(hook.result.current.pagination.pageSize).toBe(5); + expect(hook.result.current.pagination.total).toBe(55); + expect(hook.result.current.pagination.totalPage).toBe(11); + + act(() => { + hook.result.current.pagination.changeCurrent(3); + }); + expect(hook.result.current.loading).toBe(true); + expect(queryArgs.current).toBe(3); + expect(queryArgs.pageSize).toBe(5); + await waitFor(() => expect(hook.result.current.pagination.current).toBe(3)); + expect(hook.result.current.pagination.pageSize).toBe(5); + }); +}); diff --git a/packages/hooks/src/usePagination/__tests__/index.test.ts b/packages/hooks/src/usePagination/__tests__/index.test.ts deleted file mode 100644 index 66c86fd77d..0000000000 --- a/packages/hooks/src/usePagination/__tests__/index.test.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import usePagination from '../'; - -// 初始化 -// 基本 action -// refreshDeps -// cache - -describe('usePagination', () => { - let queryArgs; - const asyncFn = (query) => { - queryArgs = query; - return Promise.resolve({ - current: query.current, - total: 55, - pageSize: query.pageSize, - list: [], - }); - }; - - const setUp = (service, options) => renderHook((o) => usePagination(service, o || options)); - - let hook; - - it('should fetch after first render', async () => { - queryArgs = undefined; - act(() => { - hook = setUp(asyncFn, {}); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(1); - expect(queryArgs.pageSize).toEqual(10); - await hook.waitForNextUpdate(); - - expect(hook.result.current.loading).toEqual(false); - - expect(hook.result.current.pagination.current).toEqual(1); - expect(hook.result.current.pagination.pageSize).toEqual(10); - expect(hook.result.current.pagination.total).toEqual(55); - expect(hook.result.current.pagination.totalPage).toEqual(6); - }); - - it('should action work', async () => { - queryArgs = undefined; - act(() => { - hook = setUp(asyncFn, {}); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(1); - expect(queryArgs.pageSize).toEqual(10); - await hook.waitForNextUpdate(); - - expect(hook.result.current.loading).toEqual(false); - - act(() => { - hook.result.current.pagination.changeCurrent(2); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(2); - expect(queryArgs.pageSize).toEqual(10); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(2); - - act(() => { - hook.result.current.pagination.changeCurrent(10); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(6); - expect(queryArgs.pageSize).toEqual(10); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(6); - - act(() => { - hook.result.current.pagination.changePageSize(20); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(3); - expect(queryArgs.pageSize).toEqual(20); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(3); - expect(hook.result.current.pagination.pageSize).toEqual(20); - expect(hook.result.current.pagination.totalPage).toEqual(3); - - act(() => { - hook.result.current.pagination.onChange(2, 10); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(2); - expect(queryArgs.pageSize).toEqual(10); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(2); - expect(hook.result.current.pagination.pageSize).toEqual(10); - expect(hook.result.current.pagination.totalPage).toEqual(6); - }); - - it('should refreshDeps work', async () => { - queryArgs = undefined; - let dep = 1; - act(() => { - hook = setUp(asyncFn, { - refreshDeps: [dep], - }); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(1); - expect(queryArgs.pageSize).toEqual(10); - await hook.waitForNextUpdate(); - - expect(hook.result.current.loading).toEqual(false); - - act(() => { - hook.result.current.pagination.onChange(3, 20); - }); - expect(hook.result.current.loading).toEqual(true); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(3); - expect(hook.result.current.pagination.pageSize).toEqual(20); - - dep = 2; - hook.rerender({ - refreshDeps: [dep], - }); - - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(1); - expect(queryArgs.pageSize).toEqual(20); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(1); - expect(hook.result.current.pagination.pageSize).toEqual(20); - }); - - it('should default params work', async () => { - queryArgs = undefined; - act(() => { - hook = setUp(asyncFn, { - defaultPageSize: 5, - defaultCurrent: 2, - }); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(2); - expect(queryArgs.pageSize).toEqual(5); - await hook.waitForNextUpdate(); - - expect(hook.result.current.loading).toEqual(false); - - expect(hook.result.current.pagination.current).toEqual(2); - expect(hook.result.current.pagination.pageSize).toEqual(5); - expect(hook.result.current.pagination.total).toEqual(55); - expect(hook.result.current.pagination.totalPage).toEqual(11); - - act(() => { - hook.result.current.pagination.changeCurrent(3); - }); - expect(hook.result.current.loading).toEqual(true); - expect(queryArgs.current).toEqual(3); - expect(queryArgs.pageSize).toEqual(5); - await hook.waitForNextUpdate(); - expect(hook.result.current.pagination.current).toEqual(3); - expect(hook.result.current.pagination.pageSize).toEqual(5); - }); -}); diff --git a/packages/hooks/src/usePagination/demo/demo1.tsx b/packages/hooks/src/usePagination/demo/demo1.tsx index 19dacb5d19..e86294eb70 100644 --- a/packages/hooks/src/usePagination/demo/demo1.tsx +++ b/packages/hooks/src/usePagination/demo/demo1.tsx @@ -1,8 +1,6 @@ import { usePagination } from 'ahooks'; import { Pagination } from 'antd'; import Mock from 'mockjs'; -import React from 'react'; - interface UserListItem { id: string; name: string; diff --git a/packages/hooks/src/usePagination/demo/demo2.tsx b/packages/hooks/src/usePagination/demo/demo2.tsx index 809c013fe4..089c3ec84e 100644 --- a/packages/hooks/src/usePagination/demo/demo2.tsx +++ b/packages/hooks/src/usePagination/demo/demo2.tsx @@ -1,6 +1,6 @@ import { Pagination } from 'antd'; import Mock from 'mockjs'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { usePagination } from 'ahooks'; interface UserListItem { @@ -69,7 +69,6 @@ export default () => { value={gender} style={{ width: 180, marginBottom: 24 }} onChange={(e) => setGender(e.target.value)} - placeholder="select gender" > diff --git a/packages/hooks/src/usePagination/demo/demo3.tsx b/packages/hooks/src/usePagination/demo/demo3.tsx index f55e149124..aabcddc8ee 100644 --- a/packages/hooks/src/usePagination/demo/demo3.tsx +++ b/packages/hooks/src/usePagination/demo/demo3.tsx @@ -1,8 +1,7 @@ import { usePagination } from 'ahooks'; -import { useUpdateEffect } from 'ahooks'; import { Pagination } from 'antd'; import Mock from 'mockjs'; -import React, { useState } from 'react'; +import { useState } from 'react'; interface UserListItem { id: string; @@ -60,7 +59,6 @@ export default () => { value={gender} style={{ width: 180, marginBottom: 24 }} onChange={(e) => setGender(e.target.value)} - placeholder="select gender" > diff --git a/packages/hooks/src/usePagination/demo/demo4.tsx b/packages/hooks/src/usePagination/demo/demo4.tsx index c829ce9145..82ba16bfd5 100644 --- a/packages/hooks/src/usePagination/demo/demo4.tsx +++ b/packages/hooks/src/usePagination/demo/demo4.tsx @@ -1,7 +1,7 @@ import { useBoolean, useUpdateEffect } from 'ahooks'; import { Pagination } from 'antd'; import Mock from 'mockjs'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { usePagination } from 'ahooks'; interface UserListItem { @@ -39,22 +39,7 @@ async function getUserList(params: { }); } -export default () => { - const [state, { toggle }] = useBoolean(); - return ( -
-

You can click the button multiple times, the conditions of pagination will be cached.

-

- -

- {state && } -
- ); -}; - -const PaginationComponent = () => { +const PaginationComponent: React.FC = () => { const { data, loading, pagination, run, params } = usePagination( ({ current, pageSize }, g: string) => { return getUserList({ @@ -86,7 +71,6 @@ const PaginationComponent = () => { value={gender} style={{ width: 180, marginBottom: 24 }} onChange={(e) => setGender(e.target.value)} - placeholder="select gender" > @@ -115,3 +99,18 @@ const PaginationComponent = () => {
); }; + +export default () => { + const [state, { toggle }] = useBoolean(); + return ( +
+

You can click the button multiple times, the conditions of pagination will be cached.

+

+ +

+ {state && } +
+ ); +}; diff --git a/packages/hooks/src/usePagination/index.en-US.md b/packages/hooks/src/usePagination/index.en-US.md index 834b8a1f3e..9f70ac54c2 100644 --- a/packages/hooks/src/usePagination/index.en-US.md +++ b/packages/hooks/src/usePagination/index.en-US.md @@ -78,6 +78,6 @@ const { | Property | Description | Type | Default | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | ------- | -| defaultPageSize | Default page size | `number` | - | -| defaultCurrent | Number of pages on initial request | `number` | - | +| defaultPageSize | Default page size | `number` | 10 | +| defaultCurrent | Number of pages on initial request | `number` | 1 | | refreshDeps | Changes in `refreshDeps` will reset current to the first page and re-initiate the request. Generally, you can put the dependent conditions here. | `React.DependencyList` | `[]` | diff --git a/packages/hooks/src/usePagination/index.ts b/packages/hooks/src/usePagination/index.ts index 2e821931d2..205bb8e9ff 100644 --- a/packages/hooks/src/usePagination/index.ts +++ b/packages/hooks/src/usePagination/index.ts @@ -11,7 +11,7 @@ const usePagination = ( const { defaultPageSize = 10, defaultCurrent = 1, ...rest } = options; const result = useRequest(service, { - defaultParams: [{ current: defaultCurrent, pageSize: defaultPageSize }], + defaultParams: [{ current: defaultCurrent, pageSize: defaultPageSize }] as unknown as TParams, refreshDepsAction: () => { // eslint-disable-next-line @typescript-eslint/no-use-before-define changeCurrent(1); @@ -35,12 +35,14 @@ const usePagination = ( const [oldPaginationParams = {}, ...restParams] = result.params || []; result.run( - { - ...oldPaginationParams, - current: toCurrent, - pageSize: toPageSize, - }, - ...restParams, + ...([ + { + ...oldPaginationParams, + current: toCurrent, + pageSize: toPageSize, + }, + ...restParams, + ] as TParams), ); }; diff --git a/packages/hooks/src/usePagination/index.zh-CN.md b/packages/hooks/src/usePagination/index.zh-CN.md index 4c0d33878a..366b56a5e5 100644 --- a/packages/hooks/src/usePagination/index.zh-CN.md +++ b/packages/hooks/src/usePagination/index.zh-CN.md @@ -78,6 +78,6 @@ const { | 参数 | 说明 | 类型 | 默认值 | | --------------- | ------------------------------------------------------------------------------------------- | ---------------------- | ------ | -| defaultPageSize | 默认分页数量 | `number` | - | -| defaultCurrent | 初次请求时的页数 | `number` | - | +| defaultPageSize | 默认分页数量 | `number` | 10 | +| defaultCurrent | 初次请求时的页数 | `number` | 1 | | refreshDeps | `refreshDeps` 变化,会重置 current 到第一页,并重新发起请求,一般你可以把依赖的条件放这里。 | `React.DependencyList` | `[]` | diff --git a/packages/hooks/src/usePrevious/__tests__/index.test.ts b/packages/hooks/src/usePrevious/__tests__/index.spec.ts similarity index 64% rename from packages/hooks/src/usePrevious/__tests__/index.test.ts rename to packages/hooks/src/usePrevious/__tests__/index.spec.ts index a1dcee669a..5eb7ef9276 100644 --- a/packages/hooks/src/usePrevious/__tests__/index.test.ts +++ b/packages/hooks/src/usePrevious/__tests__/index.spec.ts @@ -1,5 +1,7 @@ -import { renderHook } from '@testing-library/react-hooks'; -import usePrevious, { ShouldUpdateFunc } from '../'; +import { renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import type { ShouldUpdateFunc } from '../'; +import usePrevious from '../'; describe('usePrevious', () => { function getHook(initialValue?: T, compareFunction?: ShouldUpdateFunc) { @@ -11,11 +13,11 @@ describe('usePrevious', () => { }); } - it('should return undefined on init', () => { + test('should return undefined on init', () => { expect(getHook().result.current).toBeUndefined(); }); - it('should update previous value only after render with different value', () => { + test('should update previous value only after render with different value', () => { const hook = getHook(0, () => true); expect(hook.result.current).toBeUndefined(); @@ -35,7 +37,16 @@ describe('usePrevious', () => { expect(hook.result.current).toBe(4); }); - it('should work fine with `undefined` values', () => { + test('should not update previous value if current value is the same', () => { + const hook = getHook(0); + expect(hook.result.current).toBeUndefined(); + hook.rerender({ val: 1 }); + expect(hook.result.current).toBe(0); + hook.rerender({ val: 1 }); + expect(hook.result.current).toBe(0); + }); + + test('should work fine with `undefined` values', () => { const hook = renderHook(({ value }) => usePrevious(value), { initialProps: { value: undefined as undefined | number }, }); @@ -52,22 +63,22 @@ describe('usePrevious', () => { expect(hook.result.current).toBeUndefined(); }); - it('should receive a predicate as a second parameter that will compare prev and current', () => { + test('should receive a predicate as a second parameter that will compare prev and current', () => { const obj1 = { label: 'John', value: 'john' }; const obj2 = { label: 'Jonny', value: 'john' }; const obj3 = { label: 'Kate', value: 'kate' }; type Obj = { label: string; value: string }; const predicate = (a: Obj | undefined, b: Obj) => (a ? a.value !== b.value : true); - const hook = getHook(obj1 as Obj, predicate); + const hook = getHook(obj1 as Obj, predicate as any); expect(hook.result.current).toBeUndefined(); - hook.rerender({ val: obj2, cmp: predicate }); + hook.rerender({ val: obj2, cmp: predicate as any }); expect(hook.result.current).toBeUndefined(); - hook.rerender({ val: obj3, cmp: predicate }); + hook.rerender({ val: obj3, cmp: predicate as any }); expect(hook.result.current).toBe(obj1); }); diff --git a/packages/hooks/src/usePrevious/demo/demo1.tsx b/packages/hooks/src/usePrevious/demo/demo1.tsx index 04073de208..39426d6be2 100644 --- a/packages/hooks/src/usePrevious/demo/demo1.tsx +++ b/packages/hooks/src/usePrevious/demo/demo1.tsx @@ -7,7 +7,7 @@ */ import { usePrevious } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; export default () => { const [count, setCount] = useState(0); diff --git a/packages/hooks/src/usePrevious/demo/demo2.tsx b/packages/hooks/src/usePrevious/demo/demo2.tsx index df0757ab18..679d8a6e7d 100644 --- a/packages/hooks/src/usePrevious/demo/demo2.tsx +++ b/packages/hooks/src/usePrevious/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 只有 shouldUpdate function 返回 true 时,才会记录值的变化。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { usePrevious } from 'ahooks'; interface Person { @@ -38,8 +38,8 @@ export default () => { const [state, setState] = useState({ name: 'Jack', job: 'student' }); const [nameInput, setNameInput] = useState(''); const [jobInput, setJobInput] = useState(''); - const previousName = usePrevious(state, nameCompareFunction); - const previousJob = usePrevious(state, jobCompareFunction); + const previousName = usePrevious(state, nameCompareFunction as any); + const previousJob = usePrevious(state, jobCompareFunction as any); return ( <> diff --git a/packages/hooks/src/usePrevious/index.en-US.md b/packages/hooks/src/usePrevious/index.en-US.md index 94a5488c8a..1fd9e5ab81 100644 --- a/packages/hooks/src/usePrevious/index.en-US.md +++ b/packages/hooks/src/usePrevious/index.en-US.md @@ -34,7 +34,7 @@ const previousState: T = usePrevious( ### Params -| Property | Description | Type | Default | -| ------------ | ------------------------------------------------------------- | -------------------------------------------- | ------------------- | -| state | The state that needs to be tracked | `T` | - | -| shouldUpdate | Optional. Customize whether the state value should be updated | `(prev: T \| undefined, next: T) => boolean` | `(a, b) => a !== b` | +| Property | Description | Type | Default | +| ------------ | ------------------------------------------------------------- | -------------------------------------------- | ---------------------------- | +| state | The state that needs to be tracked | `T` | - | +| shouldUpdate | Optional. Customize whether the state value should be updated | `(prev: T \| undefined, next: T) => boolean` | `(a, b) => !Object.is(a, b)` | diff --git a/packages/hooks/src/usePrevious/index.ts b/packages/hooks/src/usePrevious/index.ts index 7a9bb299ea..e4c23f4a0b 100644 --- a/packages/hooks/src/usePrevious/index.ts +++ b/packages/hooks/src/usePrevious/index.ts @@ -1,6 +1,6 @@ import { useRef } from 'react'; -export type ShouldUpdateFunc = (prev: T | undefined, next: T) => boolean; +export type ShouldUpdateFunc = (prev?: T, next?: T) => boolean; const defaultShouldUpdate = (a?: T, b?: T) => !Object.is(a, b); @@ -8,8 +8,8 @@ function usePrevious( state: T, shouldUpdate: ShouldUpdateFunc = defaultShouldUpdate, ): T | undefined { - const prevRef = useRef(); - const curRef = useRef(); + const prevRef = useRef(undefined); + const curRef = useRef(undefined); if (shouldUpdate(curRef.current, state)) { prevRef.current = curRef.current; diff --git a/packages/hooks/src/usePrevious/index.zh-CN.md b/packages/hooks/src/usePrevious/index.zh-CN.md index 2caec36a11..7f9c499470 100644 --- a/packages/hooks/src/usePrevious/index.zh-CN.md +++ b/packages/hooks/src/usePrevious/index.zh-CN.md @@ -34,7 +34,7 @@ const previousState: T = usePrevious( ### Params -| 参数 | 说明 | 类型 | 默认值 | -| ------------ | -------------------------- | -------------------------------------------- | ------------------- | -| state | 需要记录变化的值 | `T` | - | -| shouldUpdate | 可选,自定义判断值是否变化 | `(prev: T \| undefined, next: T) => boolean` | `(a, b) => a !== b` | +| 参数 | 说明 | 类型 | 默认值 | +| ------------ | -------------------------- | -------------------------------------------- | ---------------------------- | +| state | 需要记录变化的值 | `T` | - | +| shouldUpdate | 可选,自定义判断值是否变化 | `(prev: T \| undefined, next: T) => boolean` | `(a, b) => !Object.is(a, b)` | diff --git a/packages/hooks/src/useRafInterval/__tests__/index.spec.ts b/packages/hooks/src/useRafInterval/__tests__/index.spec.ts new file mode 100644 index 0000000000..374537f525 --- /dev/null +++ b/packages/hooks/src/useRafInterval/__tests__/index.spec.ts @@ -0,0 +1,73 @@ +import { renderHook } from '@testing-library/react'; +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; + +import useRafInterval from '../index'; + +interface ParamsObj { + fn: (...arg: any) => any; + delay: number | undefined; + options?: { immediate: boolean }; +} + +const setUp = ({ fn, delay, options }: ParamsObj) => + renderHook(() => useRafInterval(fn, delay, options)); + +const FRAME_TIME = 16; +describe('useRafInterval', () => { + beforeAll(() => { + vi.useFakeTimers(); + }); + afterAll(() => { + vi.restoreAllMocks(); + }); + + test('interval should work', () => { + const callback = vi.fn(); + setUp({ fn: callback, delay: FRAME_TIME }); + expect(callback).not.toBeCalled(); + vi.advanceTimersByTime(FRAME_TIME * 2.5); + expect(callback).toHaveBeenCalledTimes(2); + }); + + test('delay is undefined should stop', () => { + const delay: number | undefined = undefined; + const callback = vi.fn(); + setUp({ fn: callback, delay }); + expect(callback).not.toBeCalled(); + vi.advanceTimersByTime(FRAME_TIME * 1.5); + expect(callback).not.toBeCalled(); + }); + + test('immediate in options should work', () => { + const callback = vi.fn(); + setUp({ fn: callback, delay: FRAME_TIME, options: { immediate: true } }); + expect(callback).toBeCalled(); + expect(callback).toHaveBeenCalledTimes(1); + vi.advanceTimersByTime(FRAME_TIME * 1.5); + expect(callback).toHaveBeenCalledTimes(2); + }); + + test('interval should be clear', () => { + const callback = vi.fn(); + const hook = setUp({ fn: callback, delay: FRAME_TIME }); + + expect(callback).not.toBeCalled(); + + hook.result.current(); + vi.advanceTimersByTime(FRAME_TIME * 2.5); + // not to be called + expect(callback).toHaveBeenCalledTimes(0); + }); + + test('execute clear in the callback and interval should be clear', () => { + const callback = vi.fn().mockImplementation(() => hook.result.current()); + const hook = setUp({ fn: callback, delay: FRAME_TIME }); + + expect(callback).not.toBeCalled(); + + vi.advanceTimersByTime(FRAME_TIME * 1.5); + expect(callback).toHaveBeenCalledTimes(1); + vi.advanceTimersByTime(FRAME_TIME * 1.5); + expect(callback).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/hooks/src/useRafInterval/__tests__/index.test.ts b/packages/hooks/src/useRafInterval/__tests__/index.test.ts deleted file mode 100644 index 648dd0db28..0000000000 --- a/packages/hooks/src/useRafInterval/__tests__/index.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useRafInterval from '../index'; - -interface ParamsObj { - fn: (...arg: any) => any; - delay: number | undefined; - options?: { immediate: boolean }; -} - -const setUp = ({ fn, delay, options }: ParamsObj) => - renderHook(() => useRafInterval(fn, delay, options)); - -const FRAME_TIME = 16; -describe('useRafInterval', () => { - beforeAll(() => { - jest.useFakeTimers('modern'); - }); - afterAll(() => { - jest.restoreAllMocks(); - }); - - it('interval should work', () => { - const callback = jest.fn(); - setUp({ fn: callback, delay: FRAME_TIME }); - expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(FRAME_TIME * 2.5); - expect(callback).toHaveBeenCalledTimes(2); - }); - - it('delay is undefined should stop', () => { - const delay: number | undefined = undefined; - const callback = jest.fn(); - setUp({ fn: callback, delay }); - expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(FRAME_TIME * 1.5); - expect(callback).not.toBeCalled(); - }); - - it('immediate in options should work', () => { - const callback = jest.fn(); - setUp({ fn: callback, delay: FRAME_TIME, options: { immediate: true } }); - expect(callback).toBeCalled(); - expect(callback).toHaveBeenCalledTimes(1); - jest.advanceTimersByTime(FRAME_TIME * 1.5); - expect(callback).toHaveBeenCalledTimes(2); - }); - - it('interval should be clear', () => { - const callback = jest.fn(); - const hook = setUp({ fn: callback, delay: FRAME_TIME }); - - expect(callback).not.toBeCalled(); - - hook.result.current(); - jest.advanceTimersByTime(FRAME_TIME * 2.5); - // not to be called - expect(callback).toHaveBeenCalledTimes(0); - }); -}); diff --git a/packages/hooks/src/useRafInterval/__tests__/node.spec.ts b/packages/hooks/src/useRafInterval/__tests__/node.spec.ts new file mode 100644 index 0000000000..02190b6751 --- /dev/null +++ b/packages/hooks/src/useRafInterval/__tests__/node.spec.ts @@ -0,0 +1,32 @@ +import { renderHook } from '@testing-library/react'; +import { beforeAll, afterAll, describe, test, expect, vi } from 'vitest'; +import useRafInterval from '../index'; + +interface ParamsObj { + fn: (...arg: any) => any; + delay: number | undefined; + options?: { immediate: boolean }; +} + +const setUp = ({ fn, delay, options }: ParamsObj) => + renderHook(() => useRafInterval(fn, delay, options)); + +const FRAME_TIME = 16; +describe('useRafInterval', () => { + beforeAll(() => { + vi.useFakeTimers(); + }); + afterAll(() => { + vi.restoreAllMocks(); + }); + test('should downgrade to setInterval when requstAnimationFrame is undefined', () => { + Object.defineProperty(window, 'cancelAnimationFrame', { value: undefined }); + Object.defineProperty(window, 'requestAnimationFrame', { value: undefined }); + + const callback = vi.fn(); + setUp({ fn: callback, delay: FRAME_TIME }); + expect(callback).not.toBeCalled(); + vi.advanceTimersByTime(FRAME_TIME * 1.5); + expect(callback).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/hooks/src/useRafInterval/__tests__/node.ts b/packages/hooks/src/useRafInterval/__tests__/node.ts deleted file mode 100644 index 12841531a0..0000000000 --- a/packages/hooks/src/useRafInterval/__tests__/node.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useRafInterval from '../index'; - -interface ParamsObj { - fn: (...arg: any) => any; - delay: number | undefined; - options?: { immediate: boolean }; -} - -const setUp = ({ fn, delay, options }: ParamsObj) => - renderHook(() => useRafInterval(fn, delay, options)); - -const FRAME_TIME = 16; -describe('useRafInterval', () => { - beforeAll(() => { - jest.useFakeTimers('modern'); - }); - afterAll(() => { - jest.restoreAllMocks(); - }); - it('should downgrade to setInterval when requstAnimationFrame is undefined', () => { - const _requestAnimationFrame = global.requestAnimationFrame; - const _cancelAnimationFrame = global.cancelAnimationFrame; - - // @ts-ignore - delete global.requestAnimationFrame; - // @ts-ignore - delete global.cancelAnimationFrame; - - const callback = jest.fn(); - setUp({ fn: callback, delay: FRAME_TIME }); - expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(FRAME_TIME * 1.5); - expect(callback).toHaveBeenCalledTimes(1); - - global.requestAnimationFrame = _requestAnimationFrame; - global.cancelAnimationFrame = _cancelAnimationFrame; - }); -}); diff --git a/packages/hooks/src/useRafInterval/demo/demo1.tsx b/packages/hooks/src/useRafInterval/demo/demo1.tsx index 44d37e9e47..731080a487 100644 --- a/packages/hooks/src/useRafInterval/demo/demo1.tsx +++ b/packages/hooks/src/useRafInterval/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 每1000ms,执行一次 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRafInterval } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useRafInterval/demo/demo2.tsx b/packages/hooks/src/useRafInterval/demo/demo2.tsx index 0b3a6a5034..42eac8d0a4 100644 --- a/packages/hooks/src/useRafInterval/demo/demo2.tsx +++ b/packages/hooks/src/useRafInterval/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 动态修改 delay 以实现定时器间隔变化与暂停。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRafInterval } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useRafInterval/index.ts b/packages/hooks/src/useRafInterval/index.ts index ecdab92cfa..0b27e6fa5a 100644 --- a/packages/hooks/src/useRafInterval/index.ts +++ b/packages/hooks/src/useRafInterval/index.ts @@ -3,36 +3,36 @@ import useLatest from '../useLatest'; import { isNumber } from '../utils'; interface Handle { - id: number | NodeJS.Timer; + id: ReturnType | ReturnType; } -const setRafInterval = function (callback: () => void, delay: number = 0): Handle { - if (typeof requestAnimationFrame === typeof undefined) { +const setRafInterval = (callback: () => void, delay: number = 0): Handle => { + if (typeof requestAnimationFrame === 'undefined') { return { id: setInterval(callback, delay), }; } - let start = new Date().getTime(); + let start = Date.now(); const handle: Handle = { id: 0, }; const loop = () => { - const current = new Date().getTime(); + const current = Date.now(); + handle.id = requestAnimationFrame(loop); if (current - start >= delay) { callback(); - start = new Date().getTime(); + start = Date.now(); } - handle.id = requestAnimationFrame(loop); }; handle.id = requestAnimationFrame(loop); return handle; }; -function cancelAnimationFrameIsNotDefined(t: any): t is NodeJS.Timer { - return typeof cancelAnimationFrame === typeof undefined; -} +const cancelAnimationFrameIsNotDefined = (t: any): t is ReturnType => { + return typeof cancelAnimationFrame === 'undefined'; +}; -const clearRafInterval = function (handle: Handle) { +const clearRafInterval = (handle: Handle) => { if (cancelAnimationFrameIsNotDefined(handle.id)) { return clearInterval(handle.id); } @@ -49,29 +49,27 @@ function useRafInterval( const immediate = options?.immediate; const fnRef = useLatest(fn); - const timerRef = useRef(); + const timerRef = useRef(undefined); + + const clear = useCallback(() => { + if (timerRef.current) { + clearRafInterval(timerRef.current); + } + }, []); useEffect(() => { - if (!isNumber(delay) || delay < 0) return; + if (!isNumber(delay) || delay < 0) { + return; + } if (immediate) { fnRef.current(); } timerRef.current = setRafInterval(() => { fnRef.current(); }, delay); - return () => { - if (timerRef.current) { - clearRafInterval(timerRef.current); - } - }; + return clear; }, [delay]); - const clear = useCallback(() => { - if (timerRef.current) { - clearRafInterval(timerRef.current); - } - }, []); - return clear; } diff --git a/packages/hooks/src/useRafState/__tests__/index.test.ts b/packages/hooks/src/useRafState/__tests__/index.spec.ts similarity index 74% rename from packages/hooks/src/useRafState/__tests__/index.test.ts rename to packages/hooks/src/useRafState/__tests__/index.spec.ts index f6cf6a2ec3..25a9c188f6 100644 --- a/packages/hooks/src/useRafState/__tests__/index.test.ts +++ b/packages/hooks/src/useRafState/__tests__/index.spec.ts @@ -1,9 +1,11 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; + import useRafState from '../index'; describe('useRafState', () => { - it('should work', () => { - const mockRaf = jest + test('should work', () => { + const mockRaf = vi .spyOn(window, 'requestAnimationFrame') .mockImplementation((cb: FrameRequestCallback) => { cb(0); diff --git a/packages/hooks/src/useRafState/demo/demo1.tsx b/packages/hooks/src/useRafState/demo/demo1.tsx index 7cd302f00c..eb649ce1d2 100644 --- a/packages/hooks/src/useRafState/demo/demo1.tsx +++ b/packages/hooks/src/useRafState/demo/demo1.tsx @@ -5,7 +5,7 @@ */ import { useRafState } from 'ahooks'; -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; export default () => { const [state, setState] = useRafState({ diff --git a/packages/hooks/src/useRafState/index.ts b/packages/hooks/src/useRafState/index.ts index b171dea10c..a6f9db8027 100644 --- a/packages/hooks/src/useRafState/index.ts +++ b/packages/hooks/src/useRafState/index.ts @@ -13,7 +13,7 @@ function useRafState(initialState?: S | (() => S)) { cancelAnimationFrame(ref.current); ref.current = requestAnimationFrame(() => { - setState(value); + setState(value as any); }); }, []); diff --git a/packages/hooks/src/useRafTimeout/__tests__/index.test.ts b/packages/hooks/src/useRafTimeout/__tests__/index.spec.ts similarity index 59% rename from packages/hooks/src/useRafTimeout/__tests__/index.test.ts rename to packages/hooks/src/useRafTimeout/__tests__/index.spec.ts index 1e34134ae7..709ce77502 100644 --- a/packages/hooks/src/useRafTimeout/__tests__/index.test.ts +++ b/packages/hooks/src/useRafTimeout/__tests__/index.spec.ts @@ -1,4 +1,6 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; + import useRafTimeout from '../index'; interface ParamsObj { @@ -11,37 +13,37 @@ const setUp = ({ fn, delay }: ParamsObj) => renderHook(() => useRafTimeout(fn, d const FRAME_TIME = 16.7; describe('useRafTimeout', () => { beforeAll(() => { - jest.useFakeTimers('modern'); + vi.useFakeTimers(); }); afterAll(() => { - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); - it('timeout should work', () => { - const callback = jest.fn(); + test('timeout should work', () => { + const callback = vi.fn(); setUp({ fn: callback, delay: FRAME_TIME }); expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(FRAME_TIME * 2.5); + vi.advanceTimersByTime(FRAME_TIME * 2.5); expect(callback).toHaveBeenCalledTimes(1); }); - it('timeout should stop when delay is undefined', () => { + test('timeout should stop when delay is undefined', () => { const delay: number | undefined = undefined; - const callback = jest.fn(); + const callback = vi.fn(); setUp({ fn: callback, delay }); expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(FRAME_TIME * 1.5); + vi.advanceTimersByTime(FRAME_TIME * 1.5); expect(callback).not.toBeCalled(); }); - it('timeout should be clear', () => { - const callback = jest.fn(); + test('timeout should be clear', () => { + const callback = vi.fn(); const hook = setUp({ fn: callback, delay: FRAME_TIME }); expect(callback).not.toBeCalled(); hook.result.current(); - jest.advanceTimersByTime(FRAME_TIME * 2.5); + vi.advanceTimersByTime(FRAME_TIME * 2.5); expect(callback).toHaveBeenCalledTimes(0); }); }); diff --git a/packages/hooks/src/useRafTimeout/__tests__/node.ts b/packages/hooks/src/useRafTimeout/__tests__/node.spec.ts similarity index 70% rename from packages/hooks/src/useRafTimeout/__tests__/node.ts rename to packages/hooks/src/useRafTimeout/__tests__/node.spec.ts index 5630deba21..defb164241 100644 --- a/packages/hooks/src/useRafTimeout/__tests__/node.ts +++ b/packages/hooks/src/useRafTimeout/__tests__/node.spec.ts @@ -1,4 +1,5 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; import useRafTimeout from '../index'; interface ParamsObj { @@ -11,12 +12,12 @@ const setUp = ({ fn, delay }: ParamsObj) => renderHook(() => useRafTimeout(fn, d const FRAME_TIME = 16.7; describe('useRafTimeout', () => { beforeAll(() => { - jest.useFakeTimers('modern'); + vi.useFakeTimers(); }); afterAll(() => { - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); - it('should downgrade to setTimeout when requstAnimationFrame is undefined', () => { + test('should downgrade to setTimeout when requstAnimationFrame is undefined', () => { const _requestAnimationFrame = global.requestAnimationFrame; const _cancelAnimationFrame = global.cancelAnimationFrame; @@ -25,10 +26,10 @@ describe('useRafTimeout', () => { // @ts-ignore delete global.cancelAnimationFrame; - const callback = jest.fn(); + const callback = vi.fn(); setUp({ fn: callback, delay: FRAME_TIME }); expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(FRAME_TIME * 1.5); + vi.advanceTimersByTime(FRAME_TIME * 1.5); expect(callback).toHaveBeenCalledTimes(1); global.requestAnimationFrame = _requestAnimationFrame; diff --git a/packages/hooks/src/useRafTimeout/demo/demo1.tsx b/packages/hooks/src/useRafTimeout/demo/demo1.tsx index 5769b267a6..ce45130d81 100644 --- a/packages/hooks/src/useRafTimeout/demo/demo1.tsx +++ b/packages/hooks/src/useRafTimeout/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 在 2000ms 后执行。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRafTimeout } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useRafTimeout/demo/demo2.tsx b/packages/hooks/src/useRafTimeout/demo/demo2.tsx index e1990d1432..a04006b960 100644 --- a/packages/hooks/src/useRafTimeout/demo/demo2.tsx +++ b/packages/hooks/src/useRafTimeout/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 动态修改 delay 以实现定时器间隔变化与暂停。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRafTimeout } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useRafTimeout/index.ts b/packages/hooks/src/useRafTimeout/index.ts index a0a5cd3af4..23f13f8bab 100644 --- a/packages/hooks/src/useRafTimeout/index.ts +++ b/packages/hooks/src/useRafTimeout/index.ts @@ -3,11 +3,11 @@ import useLatest from '../useLatest'; import { isNumber } from '../utils'; interface Handle { - id: number | NodeJS.Timeout; + id: ReturnType | ReturnType; } -const setRafTimeout = function (callback: () => void, delay: number = 0): Handle { - if (typeof requestAnimationFrame === typeof undefined) { +const setRafTimeout = (callback: () => void, delay: number = 0): Handle => { + if (typeof requestAnimationFrame === 'undefined') { return { id: setTimeout(callback, delay), }; @@ -17,10 +17,10 @@ const setRafTimeout = function (callback: () => void, delay: number = 0): Handle id: 0, }; - const startTime = new Date().getTime(); + const startTime = Date.now(); const loop = () => { - const current = new Date().getTime(); + const current = Date.now(); if (current - startTime >= delay) { callback(); } else { @@ -31,11 +31,11 @@ const setRafTimeout = function (callback: () => void, delay: number = 0): Handle return handle; }; -function cancelAnimationFrameIsNotDefined(t: any): t is NodeJS.Timer { - return typeof cancelAnimationFrame === typeof undefined; -} +const cancelAnimationFrameIsNotDefined = (t: any): t is ReturnType => { + return typeof cancelAnimationFrame === 'undefined'; +}; -const clearRafTimeout = function (handle: Handle) { +const clearRafTimeout = (handle: Handle) => { if (cancelAnimationFrameIsNotDefined(handle.id)) { return clearTimeout(handle.id); } @@ -44,19 +44,7 @@ const clearRafTimeout = function (handle: Handle) { function useRafTimeout(fn: () => void, delay: number | undefined) { const fnRef = useLatest(fn); - const timerRef = useRef(); - - useEffect(() => { - if (!isNumber(delay) || delay < 0) return; - timerRef.current = setRafTimeout(() => { - fnRef.current(); - }, delay); - return () => { - if (timerRef.current) { - clearRafTimeout(timerRef.current); - } - }; - }, [delay]); + const timerRef = useRef(undefined); const clear = useCallback(() => { if (timerRef.current) { @@ -64,6 +52,16 @@ function useRafTimeout(fn: () => void, delay: number | undefined) { } }, []); + useEffect(() => { + if (!isNumber(delay) || delay < 0) { + return; + } + timerRef.current = setRafTimeout(() => { + fnRef.current(); + }, delay); + return clear; + }, [delay]); + return clear; } diff --git a/packages/hooks/src/useReactive/__tests__/index.spec.tsx b/packages/hooks/src/useReactive/__tests__/index.spec.tsx new file mode 100644 index 0000000000..522b35f695 --- /dev/null +++ b/packages/hooks/src/useReactive/__tests__/index.spec.tsx @@ -0,0 +1,288 @@ +import { act, fireEvent, render, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import useReactive from '../'; + +const Demo = () => { + const state: { + count: number; + val: any; + foo?: string; + arr: number[]; + } = useReactive({ + count: 0, + val: { + val1: { + val2: '', + }, + }, + arr: [1], + foo: 'foo', + }); + + return ( +
+

+ counter state.count:{state.count} +

+

+ delete property:{state.foo} +

+ + + + +
+
+

+ state.arr: {JSON.stringify(state.arr)} +

+ + + + + + +
+
+

nested structure

+

{state.val.val1.val2}

+ { + state.val.val1.val2 = e.target.value; + }} + /> +
+ ); +}; + +describe('test useReactive feature', () => { + test('test count', () => { + const wrap = render(); + + const count = wrap.getByRole('addCount'); + const addCountBtn = wrap.getByRole('addCountBtn'); + const subCountBtn = wrap.getByRole('subCountBtn'); + + act(() => { + fireEvent.click(addCountBtn); + }); + expect(count.textContent).toBe('1'); + + act(() => { + fireEvent.click(addCountBtn); + fireEvent.click(addCountBtn); + }); + expect(count.textContent).toBe('3'); + + act(() => { + fireEvent.click(subCountBtn); + }); + expect(count.textContent).toBe('2'); + + act(() => { + fireEvent.click(subCountBtn); + fireEvent.click(subCountBtn); + fireEvent.click(subCountBtn); + fireEvent.click(subCountBtn); + fireEvent.click(subCountBtn); + }); + expect(count.textContent).toBe('-3'); + }); + + test('test array', () => { + const wrap = render(); + const testArray = wrap.getAllByRole('test-array')[0]; + const pushbtn = wrap.getAllByRole('pushbtn')[0]; + const popbtn = wrap.getAllByRole('popbtn')[0]; + const shiftbtn = wrap.getAllByRole('shiftbtn')[0]; + const unshiftbtn = wrap.getAllByRole('unshiftbtn')[0]; + act(() => { + fireEvent.click(pushbtn); + }); + expect(JSON.parse(testArray.textContent as any).length).toBe(2); + act(() => { + fireEvent.click(popbtn); + }); + expect(JSON.parse(testArray.textContent as any).length).toBe(1); + act(() => { + fireEvent.click(unshiftbtn); + }); + expect(JSON.parse(testArray.textContent as any).length).toBe(2); + act(() => { + fireEvent.click(shiftbtn); + }); + expect(JSON.parse(testArray.textContent as any).length).toBe(1); + }); + + test('test special objects', () => { + const { result } = renderHook(() => { + // Almost all of the built-in objects are tested. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects + return useReactive({ + a: new Function('return 1;'), + b: new Boolean(true), + c: Symbol.for('a'), + d: new Error('a'), + e: new Number(1), + f: BigInt(1), + g: Math, + h: new Date(), + i: new String('a'), + j1: new RegExp(/a/), + j2: /a/, + k: new Array(1), + l: new Map(), + m: new Set(), + n: new ArrayBuffer(1), + o: new DataView(new ArrayBuffer(1)), + p: Atomics, + q: JSON, + r: new Promise((resolve) => resolve(1)), + s: Reflect, + t: new Proxy({}, {}), + u: Intl, + v: WebAssembly, + }); + }); + + expect(() => result.current.a.name).not.toThrowError(); + expect(() => result.current.b.valueOf()).not.toThrowError(); + expect(() => result.current.c.valueOf()).not.toThrowError(); + expect(() => result.current.d.message).not.toThrowError(); + expect(() => result.current.e.valueOf()).not.toThrowError(); + expect(() => result.current.f.valueOf()).not.toThrowError(); + expect(() => result.current.g.PI).not.toThrowError(); + expect(() => result.current.h.getFullYear()).not.toThrowError(); + expect(() => result.current.i.valueOf()).not.toThrowError(); + expect(() => result.current.j1.test('a')).not.toThrowError(); + expect(() => result.current.j2.test('a')).not.toThrowError(); + expect(() => result.current.k.length).not.toThrowError(); + expect(() => result.current.l.size).not.toThrowError(); + expect(() => result.current.m.size).not.toThrowError(); + expect(() => result.current.n.byteLength).not.toThrowError(); + expect(() => result.current.o.byteLength).not.toThrowError(); + expect(() => result.current.p.isLockFree(1)).not.toThrowError(); + expect(() => result.current.q.stringify(1)).not.toThrowError(); + expect(() => result.current.r.then()).not.toThrowError(); + expect(() => result.current.s.ownKeys({})).not.toThrowError(); + expect(() => result.current.t.toString()).not.toThrowError(); + expect(() => result.current.u.DateTimeFormat()).not.toThrowError(); + expect(() => result.current.v.Module).not.toThrowError(); + }); + + test('test JSX element', () => { + const hook = renderHook(() => useReactive({ html:
foo
})); + const proxy = hook.result.current; + const wrap = render(proxy.html); + const html = wrap.getByRole('id'); + + expect(html.textContent).toBe('foo'); + act(() => { + proxy.html =
bar
; + wrap.rerender(proxy.html); + }); + expect(html.textContent).toBe('bar'); + hook.unmount(); + }); + + test('test read-only and non-configurable data property', () => { + const obj = {} as { user: { name: string } }; + Reflect.defineProperty(obj, 'user', { + value: { name: 'foo' }, + writable: false, + configurable: false, + }); + + const hook = renderHook(() => useReactive(obj)); + const proxy = hook.result.current; + + expect(() => proxy.user.name).not.toThrowError(); + hook.unmount(); + }); + + test('test input1', () => { + const wrap = render(); + + const input = wrap.getAllByRole('input1')[0]; + const inputVal = wrap.getAllByRole('inputVal1')[0]; + act(() => { + fireEvent.change(input, { target: { value: 'a' } }); + }); + expect(inputVal.textContent).toBe('a'); + + act(() => { + fireEvent.change(input, { target: { value: 'bbb' } }); + }); + expect(inputVal.textContent).toBe('bbb'); + }); + + test('delete object property', () => { + const wrap = render(); + + const deleteProperty = wrap.getAllByRole('deleteProperty')[0]; + const deletePropertyBtn = wrap.getAllByRole('deletePropertyBtn')[0]; + expect(deleteProperty.textContent).toBe('foo'); + + act(() => { + fireEvent.click(deletePropertyBtn); + }); + expect(deleteProperty.textContent).toBe(''); + }); + + test('access from self to prototype chain', () => { + const parent: Record = { + name: 'parent', + get value() { + return this.name; + }, + }; + + const child: Record = { + name: 'child', + }; + + const { result } = renderHook(() => useReactive(parent)); + const proxy = result.current; + + Object.setPrototypeOf(child, proxy); + + expect(child.value).toBe('child'); + expect(proxy.value).toBe('parent'); + expect(parent.value).toBe('parent'); + + act(() => delete child.name); + expect(child.value).toBe('parent'); + expect(proxy.value).toBe('parent'); + expect(parent.value).toBe('parent'); + + act(() => delete proxy.name); + expect(child.value).toBeUndefined(); + expect(proxy.value).toBeUndefined(); + expect(parent.value).toBeUndefined(); + }); +}); diff --git a/packages/hooks/src/useReactive/__tests__/index.test.tsx b/packages/hooks/src/useReactive/__tests__/index.test.tsx deleted file mode 100644 index a4b5ef29b6..0000000000 --- a/packages/hooks/src/useReactive/__tests__/index.test.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import { fireEvent, render } from '@testing-library/react'; -import React from 'react'; -import { act } from 'react-dom/test-utils'; -import useReactive from '../'; - -const Demo = () => { - let state: { - count: number; - val: any; - foo?: string; - arr: number[]; - } = useReactive({ - count: 0, - val: { - val1: { - val2: '', - }, - }, - arr: [1], - foo: 'foo', - }); - - return ( -
-

- counter state.count:{state.count} -

-

- delete property:{state.foo} -

- - - - -
-
-

- state.arr: {JSON.stringify(state.arr)} -

- - - - - - -
-
-

nested structure

-

{state.val.val1.val2}

- { - state.val.val1.val2 = e.target.value; - }} - /> -
- ); -}; - -describe('test useReactive feature', () => { - it('test count ', () => { - let wrap = render(); - - let count = wrap.getByRole('addCount'); - let addCountBtn = wrap.getByRole('addCountBtn'); - let subCountBtn = wrap.getByRole('subCountBtn'); - - act(() => { - fireEvent.click(addCountBtn); - }); - expect(count.textContent).toBe('1'); - - act(() => { - fireEvent.click(addCountBtn); - fireEvent.click(addCountBtn); - }); - expect(count.textContent).toBe('3'); - - act(() => { - fireEvent.click(subCountBtn); - }); - expect(count.textContent).toBe('2'); - - act(() => { - fireEvent.click(subCountBtn); - fireEvent.click(subCountBtn); - fireEvent.click(subCountBtn); - fireEvent.click(subCountBtn); - fireEvent.click(subCountBtn); - }); - expect(count.textContent).toBe('-3'); - }); - - it('test array', () => { - let wrap = render(); - let testArray = wrap.getByRole('test-array'); - let pushbtn = wrap.getByRole('pushbtn'); - let popbtn = wrap.getByRole('popbtn'); - let shiftbtn = wrap.getByRole('shiftbtn'); - let unshiftbtn = wrap.getByRole('unshiftbtn'); - act(() => { - fireEvent.click(pushbtn); - }); - expect(JSON.parse(testArray.textContent as any).length).toBe(2); - act(() => { - fireEvent.click(popbtn); - }); - expect(JSON.parse(testArray.textContent as any).length).toBe(1); - act(() => { - fireEvent.click(unshiftbtn); - }); - expect(JSON.parse(testArray.textContent as any).length).toBe(2); - act(() => { - fireEvent.click(shiftbtn); - }); - expect(JSON.parse(testArray.textContent as any).length).toBe(1); - }); - - it('test input1', () => { - let wrap = render(); - - let input = wrap.getByRole('input1'); - let inputVal = wrap.getByRole('inputVal1'); - act(() => { - fireEvent.change(input, { target: { value: 'a' } }); - }); - expect(inputVal.textContent).toBe('a'); - - act(() => { - fireEvent.change(input, { target: { value: 'bbb' } }); - }); - expect(inputVal.textContent).toBe('bbb'); - }); - - it('delete object property', () => { - let wrap = render(); - - let deleteProperty = wrap.getByRole('deleteProperty'); - let deletePropertyBtn = wrap.getByRole('deletePropertyBtn'); - expect(deleteProperty.textContent).toBe('foo'); - - act(() => { - fireEvent.click(deletePropertyBtn); - }); - expect(deleteProperty.textContent).toBe(''); - }); -}); diff --git a/packages/hooks/src/useReactive/demo/demo1.tsx b/packages/hooks/src/useReactive/demo/demo1.tsx index 510ef1fd02..17bbb5a01f 100644 --- a/packages/hooks/src/useReactive/demo/demo1.tsx +++ b/packages/hooks/src/useReactive/demo/demo1.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useReactive } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useReactive/demo/demo2.tsx b/packages/hooks/src/useReactive/demo/demo2.tsx index 9e72f1ab0d..ee5ad68157 100644 --- a/packages/hooks/src/useReactive/demo/demo2.tsx +++ b/packages/hooks/src/useReactive/demo/demo2.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useReactive } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useReactive/demo/demo3.tsx b/packages/hooks/src/useReactive/demo/demo3.tsx index 887a7c2c52..0edf210418 100644 --- a/packages/hooks/src/useReactive/demo/demo3.tsx +++ b/packages/hooks/src/useReactive/demo/demo3.tsx @@ -1,11 +1,10 @@ -import React from 'react'; import { useReactive } from 'ahooks'; export default () => { const state = useReactive({ bug: '', bugs: ['feat', 'fix', 'chore'], - addBug(bug) { + addBug(bug: any) { this.bugs.push(bug); }, get bugsCount() { diff --git a/packages/hooks/src/useReactive/demo/demo4.tsx b/packages/hooks/src/useReactive/demo/demo4.tsx index b720a13fab..99db09facc 100644 --- a/packages/hooks/src/useReactive/demo/demo4.tsx +++ b/packages/hooks/src/useReactive/demo/demo4.tsx @@ -4,7 +4,7 @@ * desc.zh-CN: useReactive 产生可操作的代理对象一直都是同一个引用,`useEffect` , `useMemo` ,`useCallback` ,`子组件属性传递` 等如果依赖的是这个代理对象是**不会**引起重新执行。 */ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useReactive } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useReactive/demo/index.tsx b/packages/hooks/src/useReactive/demo/index.tsx index c7ff7c447c..4b87a972f8 100644 --- a/packages/hooks/src/useReactive/demo/index.tsx +++ b/packages/hooks/src/useReactive/demo/index.tsx @@ -1,8 +1,7 @@ -import React from 'react'; import { useReactive } from 'ahooks'; export default () => { - let state = useReactive({ + const state = useReactive({ count: 0, val: { val1: { diff --git a/packages/hooks/src/useReactive/index.en-US.md b/packages/hooks/src/useReactive/index.en-US.md index c96339572f..5fa7a6e854 100644 --- a/packages/hooks/src/useReactive/index.en-US.md +++ b/packages/hooks/src/useReactive/index.en-US.md @@ -21,7 +21,7 @@ It offers data reactivity when manipulating states and views, in which case `use -### notice +### Notice @@ -36,3 +36,11 @@ const state = useReactive(initialValue: Record); | Params | Description | Type | Default | | ------------ | ------------- | --------------------- | ------- | | initialState | Current state | `Record` | - | + +## FAQ + +### When `useReactive` is used with `Map`, `Set`, it will throw an error or not work? + +`useReactive` is not compatible with `Map`, `Set`。 + +Related issues: [#2239](https://github.com/alibaba/hooks/discussions/2239) diff --git a/packages/hooks/src/useReactive/index.ts b/packages/hooks/src/useReactive/index.ts index 7a0d6e0f11..48b04fda2b 100644 --- a/packages/hooks/src/useReactive/index.ts +++ b/packages/hooks/src/useReactive/index.ts @@ -1,7 +1,7 @@ import { useRef } from 'react'; +import isPlainObject from 'lodash/isPlainObject'; import useCreation from '../useCreation'; import useUpdate from '../useUpdate'; -import { isObject } from '../utils'; // k:v 原对象:代理过的对象 const proxyMap = new WeakMap(); @@ -25,7 +25,16 @@ function observer>(initialVal: T, cb: () => void): const proxy = new Proxy(initialVal, { get(target, key, receiver) { const res = Reflect.get(target, key, receiver); - return isObject(res) ? observer(res, cb) : Reflect.get(target, key); + + // https://github.com/alibaba/hooks/issues/1317 + const descriptor = Reflect.getOwnPropertyDescriptor(target, key); + if (!descriptor?.configurable && !descriptor?.writable) { + return res; + } + + // Only proxy plain object or array, + // otherwise it will cause: https://github.com/alibaba/hooks/issues/2080 + return isPlainObject(res) || Array.isArray(res) ? observer(res, cb) : res; }, set(target, key, val) { const ret = Reflect.set(target, key, val); diff --git a/packages/hooks/src/useReactive/index.zh-CN.md b/packages/hooks/src/useReactive/index.zh-CN.md index 5b6e43bc95..a58290d534 100644 --- a/packages/hooks/src/useReactive/index.zh-CN.md +++ b/packages/hooks/src/useReactive/index.zh-CN.md @@ -15,11 +15,11 @@ nav: ### 数组操作 - + ### 计算属性 - + ### 注意 @@ -36,3 +36,11 @@ const state = useReactive(initialState: Record); | 参数 | 说明 | 类型 | 默认值 | | ------------ | -------------- | --------------------- | ------ | | initialState | 当前的数据对象 | `Record` | - | + +## FAQ + +### `useReactive` 和 `Map`、`Set` 一起使用时报错或无效? + +`useReactive` 目前不兼容 `Map`、`Set`。 + +相关 issues:[#2239](https://github.com/alibaba/hooks/discussions/2239) diff --git a/packages/hooks/src/useRequest/__tests__/index.spec.ts b/packages/hooks/src/useRequest/__tests__/index.spec.ts new file mode 100644 index 0000000000..1ee1982015 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/index.spec.ts @@ -0,0 +1,286 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + +describe('useRequest', () => { + beforeAll(() => { + vi.useFakeTimers(); + }); + + afterAll(() => { + errorSpy.mockRestore(); + }); + + const setUp = ( + service: (...args: TParams) => Promise, + options?: Parameters>[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; + + test('useRequest should auto run', async () => { + let value = ''; + let success: string | undefined; + const successCallback = (data: string) => { + success = data; + }; + const errorCallback = vi.fn(); + const beforeCallback = () => { + value = 'before'; + }; + const finallyCallback = () => { + value = 'finally'; + }; + // auto run success + act(() => { + hook = setUp(request, { + onSuccess: successCallback, + onError: errorCallback, + onBefore: beforeCallback, + onFinally: finallyCallback, + }); + }); + expect(hook.result.current.loading).toBe(true); + expect(value).toBe('before'); + expect(success).toBeUndefined(); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(success).toBe('success'); + expect(hook.result.current.data).toBe('success'); + expect(value).toBe('finally'); + expect(errorCallback).toHaveBeenCalledTimes(0); + + //manual run fail + act(() => { + hook.result.current.run(0); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.error).toEqual(new Error('fail')); + expect(hook.result.current.loading).toBe(false); + expect(errorCallback).toHaveBeenCalledTimes(1); + + //manual run success + act(() => { + hook.result.current.run(1); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.data).toBe('success'); + expect(hook.result.current.loading).toBe(false); + expect(errorCallback).toHaveBeenCalledTimes(1); + hook.unmount(); + + //auto run fail + act(() => { + hook = setUp(() => request(0), { + onSuccess: successCallback, + onError: errorCallback, + }); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.error).toEqual(new Error('fail')); + expect(hook.result.current.loading).toBe(false); + expect(errorCallback).toHaveBeenCalledTimes(2); + hook.unmount(); + }); + + test('useRequest should be manually triggered', async () => { + act(() => { + hook = setUp(request, { + manual: true, + }); + }); + expect(hook.result.current.loading).toBe(false); + act(() => { + hook.result.current.run(1); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.data).toBe('success'); + act(() => { + hook.result.current.run(0); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.error).toEqual(new Error('fail')); + hook.unmount(); + }); + + test('useRequest runAsync should work', async () => { + let success = '', + error = ''; + + act(() => { + hook = setUp(request, { + manual: true, + }); + }); + act(() => { + hook.result.current + .runAsync(0) + .then((res: any) => { + success = res; + }) + .catch((err: any) => { + error = err; + }); + }); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(success).toBe(''); + expect(error).toEqual(new Error('fail')); + success = ''; + error = ''; + act(() => { + hook.result.current + .runAsync(1) + .then((res: any) => { + success = res; + }) + .catch((err: any) => { + error = err; + }); + }); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(success).toBe('success'); + expect(error).toBe(''); + hook.unmount(); + }); + + test('useRequest mutate should work', async () => { + act(() => { + hook = setUp(request, {}); + }); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.data).toBe('success'); + act(() => { + hook.result.current.mutate('hello'); + }); + expect(hook.result.current.data).toBe('hello'); + hook.unmount(); + }); + + test('runAsync should resolve immediately when ready=false', async () => { + // manual = true + act(() => { + hook = setUp(request, { + manual: true, + ready: false, + }); + }); + expect(hook.result.current.loading).toBe(false); + + let resolved = false; + let value: any = 'init'; + + await act(async () => { + hook.result.current.runAsync(1).then((res: any) => { + resolved = true; + value = res; + }); + await Promise.resolve(); + }); + + expect(resolved).toBe(true); + expect(value).toBeUndefined(); + expect(hook.result.current.loading).toBe(false); + hook.unmount(); + + // manual = false + act(() => { + hook = setUp(request, { + ready: false, + }); + }); + expect(hook.result.current.loading).toBe(false); + + resolved = false; + value = 'init'; + + await act(async () => { + hook.result.current.runAsync(1).then((res: any) => { + resolved = true; + value = res; + }); + await Promise.resolve(); + }); + + expect(resolved).toBe(true); + expect(value).toBeUndefined(); + expect(hook.result.current.loading).toBe(false); + hook.unmount(); + }); + + test('useRequest defaultParams should work', async () => { + act(() => { + hook = setUp(request, { + defaultParams: [1, 2, 3], + }); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.params).toEqual([1, 2, 3]); + expect(hook.result.current.data).toBe('success'); + expect(hook.result.current.loading).toBe(false); + hook.unmount(); + }); + + test('should infer default parameter types from service', () => { + const service = async (a = 1, b = 1) => { + return `${a + b}`; + }; + + const { result } = renderHook(() => + useRequest(service, { + manual: true, + }), + ); + + act(() => { + result.current.run(1, 2); + }); + + const assertRunParamTypes = () => { + // @ts-expect-error should reject non-number params + result.current.run('1', 2); + }; + + expect(assertRunParamTypes).toBeDefined(); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/index.test.ts b/packages/hooks/src/useRequest/__tests__/index.test.ts deleted file mode 100644 index 10ebcec958..0000000000 --- a/packages/hooks/src/useRequest/__tests__/index.test.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - -describe('useRequest', () => { - beforeAll(() => { - jest.useFakeTimers(); - }); - - afterAll(() => { - errorSpy.mockRestore(); - }); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - let hook; - it('useRequest should auto run', async () => { - let value, success; - const successCallback = (text) => { - success = text; - }; - const errorCallback = jest.fn(); - const beforeCallback = () => { - value = 'before'; - }; - const finallyCallback = () => { - value = 'finally'; - }; - //auto run success - act(() => { - hook = setUp(request, { - onSuccess: successCallback, - onError: errorCallback, - onBefore: beforeCallback, - onFinally: finallyCallback, - }); - }); - expect(hook.result.current.loading).toEqual(true); - expect(value).toEqual('before'); - expect(success).toEqual(undefined); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(success).toEqual('success'); - expect(hook.result.current.data).toEqual('success'); - expect(value).toEqual('finally'); - expect(errorCallback).toHaveBeenCalledTimes(0); - - //manual run fail - act(() => { - hook.result.current.run(0); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.error).toEqual(new Error('fail')); - expect(hook.result.current.loading).toEqual(false); - expect(errorCallback).toHaveBeenCalledTimes(1); - - //manual run success - act(() => { - hook.result.current.run(1); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.data).toEqual('success'); - expect(hook.result.current.loading).toEqual(false); - expect(errorCallback).toHaveBeenCalledTimes(1); - hook.unmount(); - - //auto run fail - act(() => { - hook = setUp(() => request(0), { - onSuccess: successCallback, - onError: errorCallback, - }); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.error).toEqual(new Error('fail')); - expect(hook.result.current.loading).toEqual(false); - expect(errorCallback).toHaveBeenCalledTimes(2); - hook.unmount(); - }); - - it('useRequest should be manually triggered', async () => { - act(() => { - hook = setUp(request, { - manual: true, - }); - }); - expect(hook.result.current.loading).toEqual(false); - act(() => { - hook.result.current.run(1); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.data).toEqual('success'); - act(() => { - hook.result.current.run(0); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.error).toEqual(new Error('fail')); - hook.unmount(); - }); - - it('useRequest runAsync should work', async () => { - let success = '', - error = ''; - - act(() => { - hook = setUp(request, { - manual: true, - }); - }); - act(() => { - hook.result.current - .runAsync(0) - .then((res) => { - success = res; - }) - .catch((err) => { - error = err; - }); - }); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(success).toEqual(''); - expect(error).toEqual(new Error('fail')); - - success = ''; - error = ''; - act(() => { - hook.result.current - .runAsync(1) - .then((res) => { - success = res; - }) - .catch((err) => { - error = err; - }); - }); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(success).toEqual('success'); - expect(error).toEqual(''); - hook.unmount(); - }); - - it('useRequest mutate should work', async () => { - act(() => { - hook = setUp(request, {}); - }); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.data).toEqual('success'); - act(() => { - hook.result.current.mutate('hello'); - }); - expect(hook.result.current.data).toEqual('hello'); - hook.unmount(); - }); - - it('useRequest defaultParams should work', async () => { - act(() => { - hook = setUp(request, { - defaultParams: [1, 2, 3], - }); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.params).toEqual([1, 2, 3]); - expect(hook.result.current.data).toEqual('success'); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/useAutoRunPlugin.spec.ts b/packages/hooks/src/useRequest/__tests__/useAutoRunPlugin.spec.ts new file mode 100644 index 0000000000..ed91bb4f0e --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/useAutoRunPlugin.spec.ts @@ -0,0 +1,294 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +describe('useAutoRunPlugin', () => { + vi.useFakeTimers(); + + const setUp = ( + service: (...args: TParams) => Promise, + options?: Parameters>[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; + + test('useAutoRunPlugin ready should work', async () => { + let dep = 1; + act(() => { + hook = setUp(request, { + refreshDeps: [dep], + }); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + dep = 2; + hook.rerender({ + refreshDeps: [dep], + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + refreshDeps: [dep], + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useAutoRunPlugin manual=false ready=true work fine', async () => { + act(() => { + hook = setUp(request, { + ready: true, + }); + }); + + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: false, + }); + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: true, + }); + + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useAutoRunPlugin manual=false ready=false work fine', async () => { + act(() => { + hook = setUp(request, { + ready: false, + }); + }); + + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: true, + }); + + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: false, + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useAutoRunPlugin manual=false ready&defaultParams work fine', async () => { + act(() => { + hook = setUp(request, { + ready: false, + defaultParams: [1], + }); + }); + + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: true, + defaultParams: [2], + }); + + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.params).toEqual([2]); + + hook.rerender({ + ready: false, + defaultParams: [2], + }); + hook.rerender({ + ready: true, + defaultParams: [3], + }); + + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.params).toEqual([3]); + }); + + test('useAutoRunPlugin manual=true ready work fine', async () => { + act(() => { + hook = setUp(request, { + ready: false, + manual: true, + }); + }); + expect(hook.result.current.loading).toBe(false); + act(() => { + hook.result.current.run(); + }); + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: true, + manual: true, + }); + expect(hook.result.current.loading).toBe(false); + + act(() => { + hook.result.current.run(); + }); + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useAutoRunPlugin manual=false refreshDeps should work', async () => { + let dep = 1; + act(() => { + hook = setUp(request, { + refreshDeps: [dep], + }); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + dep = 2; + hook.rerender({ + refreshDeps: [dep], + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + refreshDeps: [dep], + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useAutoRunPlugin manual=true refreshDeps should work', async () => { + let dep = 1; + act(() => { + hook = setUp(request, { + manual: true, + refreshDeps: [dep], + }); + }); + expect(hook.result.current.loading).toBe(false); + + dep = 2; + hook.rerender({ + manual: true, + refreshDeps: [dep], + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useAutoRunPlugin refreshDepsAction should work', async () => { + let dep = 1; + let count = 0; + const refreshDepsAction = () => { + count += 1; + }; + act(() => { + hook = setUp(request, { + refreshDeps: [dep], + refreshDepsAction, + }); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + dep = 2; + hook.rerender({ + refreshDeps: [dep], + refreshDepsAction, + }); + expect(hook.result.current.loading).toBe(false); + expect(count).toBe(1); + + hook.rerender({ + refreshDeps: [dep], + refreshDepsAction, + }); + expect(hook.result.current.loading).toBe(false); + expect(count).toBe(1); + + dep = 3; + hook.rerender({ + refreshDeps: [dep], + refreshDepsAction, + }); + expect(hook.result.current.loading).toBe(false); + expect(count).toBe(2); + }); + + test('useAutoRunPlugin ready & refreshDeps change same time work fine', async () => { + const fn = vi.fn(); + + const asyncFn = () => { + return new Promise((resolve) => { + fn(); + return resolve('success'); + }); + }; + + act(() => { + hook = setUp(asyncFn, { + ready: false, + defaultParams: [1], + refreshDeps: [1], + }); + }); + + expect(hook.result.current.loading).toBe(false); + + hook.rerender({ + ready: true, + defaultParams: [2], + refreshDeps: [2], + }); + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.params).toEqual([2]); + expect(fn).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/useAutoRunPlugin.test.ts b/packages/hooks/src/useRequest/__tests__/useAutoRunPlugin.test.ts deleted file mode 100644 index c58a3ec4c9..0000000000 --- a/packages/hooks/src/useRequest/__tests__/useAutoRunPlugin.test.ts +++ /dev/null @@ -1,312 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -describe('useAutoRunPlugin', () => { - jest.useFakeTimers(); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - - let hook; - - it('useAutoRunPlugin ready should work', async () => { - let dep = 1; - act(() => { - hook = setUp(request, { - refreshDeps: [dep], - }); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - dep = 2; - hook.rerender({ - refreshDeps: [dep], - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - refreshDeps: [dep], - }); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); - - it('useAutoRunPlugin manual=false ready=true work fine', async () => { - act(() => { - hook = setUp(request, { - ready: true, - }); - }); - - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: false, - }); - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: true, - }); - - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); - - it('useAutoRunPlugin manual=false ready=false work fine', async () => { - act(() => { - hook = setUp(request, { - ready: false, - }); - }); - - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: true, - }); - - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: false, - }); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); - - it('useAutoRunPlugin manual=false ready&defaultParams work fine', async () => { - act(() => { - hook = setUp(request, { - ready: false, - defaultParams: [1], - }); - }); - - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: true, - defaultParams: [2], - }); - - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.params).toEqual([2]); - - hook.rerender({ - ready: false, - defaultParams: [2], - }); - hook.rerender({ - ready: true, - defaultParams: [3], - }); - - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.params).toEqual([3]); - - hook.unmount(); - }); - - it('useAutoRunPlugin manual=true ready work fine', async () => { - act(() => { - hook = setUp(request, { - ready: false, - manual: true, - }); - }); - expect(hook.result.current.loading).toEqual(false); - act(() => { - hook.result.current.run(); - }); - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: true, - manual: true, - }); - expect(hook.result.current.loading).toEqual(false); - - act(() => { - hook.result.current.run(); - }); - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); - - it('useAutoRunPlugin manual=false refreshDeps should work', async () => { - let dep = 1; - act(() => { - hook = setUp(request, { - refreshDeps: [dep], - }); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - dep = 2; - hook.rerender({ - refreshDeps: [dep], - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - refreshDeps: [dep], - }); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); - - it('useAutoRunPlugin manual=true refreshDeps should work', async () => { - let dep = 1; - act(() => { - hook = setUp(request, { - manual: true, - refreshDeps: [dep], - }); - }); - expect(hook.result.current.loading).toEqual(false); - - dep = 2; - hook.rerender({ - manual: true, - refreshDeps: [dep], - }); - expect(hook.result.current.loading).toEqual(false); - - hook.unmount(); - }); - - it('useAutoRunPlugin refreshDepsAction should work', async () => { - let dep = 1; - let count = 0; - let refreshDepsAction = () => { - count += 1; - }; - act(() => { - hook = setUp(request, { - refreshDeps: [dep], - refreshDepsAction, - }); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - - dep = 2; - hook.rerender({ - refreshDeps: [dep], - refreshDepsAction, - }); - expect(hook.result.current.loading).toEqual(false); - expect(count).toEqual(1); - - hook.rerender({ - refreshDeps: [dep], - refreshDepsAction, - }); - expect(hook.result.current.loading).toEqual(false); - expect(count).toEqual(1); - - dep = 3; - hook.rerender({ - refreshDeps: [dep], - refreshDepsAction, - }); - expect(hook.result.current.loading).toEqual(false); - expect(count).toEqual(2); - - hook.unmount(); - }); - - it('useAutoRunPlugin ready & refreshDeps change same time work fine', async () => { - const fn = jest.fn(); - - const asyncFn = () => { - return new Promise((resolve) => { - fn(); - return resolve('success'); - }); - }; - - act(() => { - hook = setUp(asyncFn, { - ready: false, - defaultParams: [1], - refreshDeps: [1], - }); - }); - - expect(hook.result.current.loading).toEqual(false); - - hook.rerender({ - ready: true, - defaultParams: [2], - refreshDeps: [2], - }); - expect(hook.result.current.loading).toEqual(true); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.params).toEqual([2]); - expect(fn).toHaveBeenCalledTimes(1); - - hook.unmount(); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/useCachePlugin.spec.tsx b/packages/hooks/src/useRequest/__tests__/useCachePlugin.spec.tsx new file mode 100644 index 0000000000..31543a14e8 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/useCachePlugin.spec.tsx @@ -0,0 +1,202 @@ +import { act, render, renderHook } from '@testing-library/react'; +import { useState } from 'react'; +import { describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest, { clearCache } from '../index'; + +describe('useCachePlugin', () => { + vi.useFakeTimers(); + + const setup = ( + service: Parameters[0], + options: Parameters[1], + ) => renderHook(() => useRequest(service, options)); + + const testCacheKey = async (options: any) => { + const hook = setup(request, options); + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.data).toBe('success'); + hook.unmount(); + }; + + test('useRequest cacheKey should work', async () => { + await testCacheKey({ + cacheKey: 'testCacheKey', + }); + + vi.advanceTimersByTime(100); + + const hook2 = setup(request, { + cacheKey: 'testCacheKey', + }); + expect(hook2.result.current.loading).toBe(true); + expect(hook2.result.current.data).toBe('success'); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook2.result.current.loading).toBe(false); + }); + + test('useRequest staleTime should work', async () => { + await testCacheKey({ + cacheKey: 'testStaleTime', + staleTime: 3000, + }); + + vi.advanceTimersByTime(1000); + + const hook2 = setup(request, { + cacheKey: 'testStaleTime', + staleTime: 3000, + }); + expect(hook2.result.current.loading).toBe(false); + expect(hook2.result.current.data).toBe('success'); + hook2.unmount(); + + vi.advanceTimersByTime(3001); + + const hook3 = setup(request, { + cacheKey: 'testStaleTime', + staleTime: 3000, + }); + expect(hook3.result.current.loading).toBe(true); + expect(hook3.result.current.data).toBe('success'); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook3.result.current.loading).toBe(false); + }); + + test('useRequest cacheTime should work', async () => { + await testCacheKey({ + cacheKey: 'testCacheTime', + cacheTime: 5000, + }); + + vi.advanceTimersByTime(1000); + + const hook2 = setup(request, { + cacheKey: 'testCacheTime', + cacheTime: 5000, + }); + expect(hook2.result.current.loading).toBe(true); + expect(hook2.result.current.data).toBe('success'); + hook2.unmount(); + + vi.advanceTimersByTime(5001); + + const hook3 = setup(request, { + cacheKey: 'testCacheTime', + cacheTime: 5000, + }); + expect(hook3.result.current.loading).toBe(true); + expect(hook3.result.current.data).toBeUndefined(); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook3.result.current.loading).toBe(false); + expect(hook3.result.current.data).toBe('success'); + }); + + test('clearCache should work', async () => { + await testCacheKey('testClearCache'); + + clearCache('testClearCache'); + const hook2 = setup(request, { + cacheKey: 'testClearCache', + }); + expect(hook2.result.current.loading).toBe(true); + expect(hook2.result.current.data).toBeUndefined(); + }); + + test('setCache/getCache should work', async () => { + const cacheKey = `setCacheKey`; + await testCacheKey({ + cacheKey, + setCache: (data: JSON) => localStorage.setItem(cacheKey, JSON.stringify(data)), + getCache: () => JSON.parse(localStorage.getItem(cacheKey) || '{}'), + }); + + vi.advanceTimersByTime(1000); + const hook2 = setup(request, { + cacheKey, + setCache: (data) => localStorage.setItem(cacheKey, JSON.stringify(data)), + getCache: () => JSON.parse(localStorage.getItem(cacheKey) || '{}'), + }); + expect(hook2.result.current.loading).toBe(true); + expect(hook2.result.current.data).toBe('success'); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook2.result.current.loading).toBe(false); + }); + + test('cache should work when change data immediately', async () => { + const { result } = setup(request, { + cacheKey: 'mutateCacheKey', + }); + act(() => { + result.current.mutate(1); + }); + expect(result.current.data).toBe(1); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(result.current.loading).toBe(false); + expect(result.current.data).toBe('success'); + }); + + //github.com/alibaba/hooks/issues/1859 + test('error should reset with activeKey', async () => { + const errSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + let res = {} as any; + const TestComponent = () => { + const [key, setKey] = useState(1); + const { data, error } = useRequest(() => request(key), { + refreshDeps: [key], + cacheKey: String(key), + staleTime: 300000, + }); + res = { + data, + error, + setKey, + }; + return null; + }; + + render(); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(res.error).toBeUndefined(); + + act(() => res.setKey(0)); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(errSpy).toBeCalled(); + expect(res.error).not.toBeUndefined(); + + act(() => res.setKey(1)); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(res.error).toBeUndefined(); + + errSpy.mockRestore(); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/useCachePlugin.test.tsx b/packages/hooks/src/useRequest/__tests__/useCachePlugin.test.tsx deleted file mode 100644 index f7a6e7be47..0000000000 --- a/packages/hooks/src/useRequest/__tests__/useCachePlugin.test.tsx +++ /dev/null @@ -1,196 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import { render } from '@testing-library/react'; -import useRequest, { clearCache } from '../index'; -import { request } from '../../utils/testingHelpers'; -import React, { useState } from 'react'; -import 'jest-localstorage-mock'; - -describe('useCachePlugin', () => { - jest.useFakeTimers(); - - const setup = (service, options) => renderHook(() => useRequest(service, options)); - - const testCacheKey = async (options: any) => { - const hook = setup(request, options); - expect(hook.result.current.loading).toEqual(true); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.data).toEqual('success'); - hook.unmount(); - }; - - it('useRequest cacheKey should work', async () => { - await testCacheKey({ - cacheKey: 'testCacheKey', - }); - - jest.advanceTimersByTime(100); - - const hook2 = setup(request, { - cacheKey: 'testCacheKey', - }); - expect(hook2.result.current.loading).toEqual(true); - expect(hook2.result.current.data).toEqual('success'); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(hook2.result.current.loading).toEqual(false); - }); - - it('useRequest staleTime should work', async () => { - await testCacheKey({ - cacheKey: 'testStaleTime', - staleTime: 3000, - }); - - jest.advanceTimersByTime(1000); - - const hook2 = setup(request, { - cacheKey: 'testStaleTime', - staleTime: 3000, - }); - expect(hook2.result.current.loading).toEqual(false); - expect(hook2.result.current.data).toEqual('success'); - hook2.unmount(); - - jest.advanceTimersByTime(3001); - - const hook3 = setup(request, { - cacheKey: 'testStaleTime', - staleTime: 3000, - }); - expect(hook3.result.current.loading).toEqual(true); - expect(hook3.result.current.data).toEqual('success'); - - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(hook3.result.current.loading).toEqual(false); - }); - - it('useRequest cacheTime should work', async () => { - await testCacheKey({ - cacheKey: 'testCacheTime', - cacheTime: 5000, - }); - - jest.advanceTimersByTime(1000); - - const hook2 = setup(request, { - cacheKey: 'testCacheTime', - cacheTime: 5000, - }); - expect(hook2.result.current.loading).toEqual(true); - expect(hook2.result.current.data).toEqual('success'); - hook2.unmount(); - - jest.advanceTimersByTime(5001); - - const hook3 = setup(request, { - cacheKey: 'testCacheTime', - cacheTime: 5000, - }); - expect(hook3.result.current.loading).toEqual(true); - expect(hook3.result.current.data).toEqual(undefined); - - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(hook3.result.current.loading).toEqual(false); - expect(hook3.result.current.data).toEqual('success'); - }); - - it('clearCache should work', async () => { - await testCacheKey('testClearCache'); - - clearCache('testClearCache'); - const hook2 = setup(request, { - cacheKey: 'testClearCache', - }); - expect(hook2.result.current.loading).toEqual(true); - expect(hook2.result.current.data).toEqual(undefined); - }); - - it('setCache/getCache should work', async () => { - const cacheKey = `setCacheKey`; - await testCacheKey({ - cacheKey, - setCache: (data) => localStorage.setItem(cacheKey, JSON.stringify(data)), - getCache: () => JSON.parse(localStorage.getItem(cacheKey) || '{}'), - }); - - jest.advanceTimersByTime(1000); - const hook2 = setup(request, { - cacheKey, - setCache: (data) => localStorage.setItem(cacheKey, JSON.stringify(data)), - getCache: () => JSON.parse(localStorage.getItem(cacheKey) || '{}'), - }); - expect(hook2.result.current.loading).toEqual(true); - expect(hook2.result.current.data).toEqual('success'); - - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(hook2.result.current.loading).toEqual(false); - }); - - it('cache should work when change data immediately', async () => { - const { result } = setup(request, { - cacheKey: 'mutateCacheKey', - }); - act(() => { - result.current.mutate(1); - }); - expect(result.current.data).toEqual(1); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(result.current.loading).toEqual(false); - expect(result.current.data).toEqual('success'); - }); - - //github.com/alibaba/hooks/issues/1859 - it('error should reset with activeKey', async () => { - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - - let res = {} as any; - const TestComponent = () => { - const [key, setKey] = useState(1); - const { data, error } = useRequest(() => request(key), { - refreshDeps: [key], - cacheKey: String(key), - staleTime: 300000, - }); - res = { - data, - error, - setKey, - }; - return null; - }; - - render(); - - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(res.error).toEqual(undefined); - - res.setKey(0); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(errSpy).toBeCalled(); - expect(res.error).not.toEqual(undefined); - - res.setKey(1); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(res.error).toEqual(undefined); - - errSpy.mockRestore(); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/useDebouncePlugin.test.ts b/packages/hooks/src/useRequest/__tests__/useDebouncePlugin.spec.ts similarity index 56% rename from packages/hooks/src/useRequest/__tests__/useDebouncePlugin.test.ts rename to packages/hooks/src/useRequest/__tests__/useDebouncePlugin.spec.ts index eeb65ba10c..94b4039e08 100644 --- a/packages/hooks/src/useRequest/__tests__/useDebouncePlugin.test.ts +++ b/packages/hooks/src/useRequest/__tests__/useDebouncePlugin.spec.ts @@ -1,14 +1,19 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; describe('useDebouncePlugin', () => { - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); + const setUp = ( + service: Parameters[0], + options: Parameters[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; - let hook; - it('useDebouncePlugin should work', async () => { - jest.useFakeTimers(); - const callback = jest.fn(); + test('useDebouncePlugin should work', () => { + vi.useFakeTimers(); + const callback = vi.fn(); act(() => { hook = setUp( @@ -25,46 +30,44 @@ describe('useDebouncePlugin', () => { act(() => { hook.result.current.run(1); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(2); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(3); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(4); }); act(() => { - jest.runAllTimers(); + vi.runAllTimers(); }); - await hook.waitForNextUpdate(); expect(callback).toHaveBeenCalledTimes(1); act(() => { hook.result.current.run(1); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(2); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(3); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(4); }); act(() => { - jest.runAllTimers(); + vi.runAllTimers(); }); - await hook.waitForNextUpdate(); expect(callback).toHaveBeenCalledTimes(2); act(() => { hook.result.current.run(1); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.run(2); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); hook.result.current.cancel(); }); act(() => { - jest.runAllTimers(); + vi.runAllTimers(); }); expect(callback).toHaveBeenCalledTimes(2); diff --git a/packages/hooks/src/useRequest/__tests__/useLoadingDelayPlugin.spec.ts b/packages/hooks/src/useRequest/__tests__/useLoadingDelayPlugin.spec.ts new file mode 100644 index 0000000000..5b255700b7 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/useLoadingDelayPlugin.spec.ts @@ -0,0 +1,81 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { afterEach, describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +describe('useLoadingDelayPlugin', () => { + vi.useFakeTimers(); + + const setUp = ( + service: (...args: TParams) => Promise, + options?: Parameters>[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult, any>; + + afterEach(() => { + hook.unmount(); + }); + + test('useLoadingDelayPlugin should work', async () => { + act(() => { + hook = setUp(request, { + loadingDelay: 2000, + }); + }); + expect(hook.result.current.loading).toBe(false); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + + act(() => { + hook = setUp(request, { + loadingDelay: 500, + }); + }); + expect(hook.result.current.loading).toBe(false); + + act(() => { + vi.advanceTimersByTime(501); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + }); + + test('useLoadingDelayPlugin should no update loading when ready is false', async () => { + act(() => { + hook = setUp(request, { + loadingDelay: 2000, + ready: false, + }); + }); + expect(hook.result.current.loading).toBe(false); + + act(() => { + vi.advanceTimersByTime(3000); + }); + + expect(hook.result.current.loading).toBe(false); + }); + + test('useLoadingDelayPlugin should update loading when ready is undefined', async () => { + act(() => { + hook = setUp(request, { + loadingDelay: 2000, + }); + }); + expect(hook.result.current.loading).toBe(false); + + act(() => { + vi.advanceTimersByTime(3000); + }); + + expect(hook.result.current.loading).toBe(true); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/useLoadingDelayPlugin.test.ts b/packages/hooks/src/useRequest/__tests__/useLoadingDelayPlugin.test.ts deleted file mode 100644 index 8d3b64f228..0000000000 --- a/packages/hooks/src/useRequest/__tests__/useLoadingDelayPlugin.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -describe('useLoadingDelayPlugin', () => { - jest.useFakeTimers(); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - - let hook; - it('useLoadingDelayPlugin should work', async () => { - act(() => { - hook = setUp(request, { - loadingDelay: 2000, - }); - }); - expect(hook.result.current.loading).toEqual(false); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - - act(() => { - hook = setUp(request, { - loadingDelay: 500, - }); - }); - expect(hook.result.current.loading).toEqual(false); - - act(() => { - jest.advanceTimersByTime(501); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - hook.unmount(); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/usePollingPlugin.spec.ts b/packages/hooks/src/useRequest/__tests__/usePollingPlugin.spec.ts new file mode 100644 index 0000000000..aa2e12c819 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/usePollingPlugin.spec.ts @@ -0,0 +1,136 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +describe('usePollingPlugin', () => { + vi.useFakeTimers(); + + const setUp = ( + service: (...args: TParams) => Promise, + options?: Parameters>[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; + + test('usePollingPlugin pollingInterval=100 pollingWhenHidden=true should work', async () => { + const callback = vi.fn(); + act(() => { + hook = setUp( + () => { + callback(); + return request(1); + }, + { + pollingInterval: 100, + pollingWhenHidden: true, + }, + ); + }); + expect(hook.result.current.loading).toBe(true); + + // 第一次请求完成 + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook.result.current.loading).toBe(false); + expect(hook.result.current.data).toBe('success'); + expect(callback).toHaveBeenCalledTimes(1); + + // 第一次 polling (100ms 间隔 + 1000ms 执行) + await act(async () => { + vi.advanceTimersByTime(1100); + }); + expect(callback).toHaveBeenCalledTimes(2); + + // 第二次 polling + await act(async () => { + vi.advanceTimersByTime(1100); + }); + expect(callback).toHaveBeenCalledTimes(3); + + act(() => { + hook.result.current.cancel(); + }); + + // 取消后不应该再 polling + act(() => { + vi.advanceTimersByTime(1100); + }); + expect(callback).toHaveBeenCalledTimes(3); + + // 手动重新运行 + act(() => { + hook.result.current.run(); + }); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(callback).toHaveBeenCalledTimes(4); + + // 恢复 polling + await act(async () => { + vi.advanceTimersByTime(1100); + }); + expect(callback).toHaveBeenCalledTimes(5); + }); + + let hook2: RenderHookResult; + test('usePollingPlugin pollingErrorRetryCount=3 should work', async () => { + // if request error and set pollingErrorRetryCount + // and the number of consecutive failures exceeds pollingErrorRetryCount, polling stops + let errorCallback: any; + act(() => { + errorCallback = vi.fn(); + hook2 = setUp(() => request(0), { + pollingErrorRetryCount: 3, + pollingInterval: 100, + pollingWhenHidden: true, + onError: errorCallback, + }); + }); + + expect(hook2.result.current.loading).toBe(true); + expect(errorCallback).toHaveBeenCalledTimes(0); + + // 第一次请求失败 + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(hook2.result.current.loading).toBe(false); + expect(errorCallback).toHaveBeenCalledTimes(1); + + // 第一次重试失败 (100ms 间隔 + 1000ms 执行) + await act(async () => { + vi.advanceTimersByTime(1100); + }); + expect(errorCallback).toHaveBeenCalledTimes(2); + + // 第二次重试失败 + await act(async () => { + vi.advanceTimersByTime(1100); + }); + expect(errorCallback).toHaveBeenCalledTimes(3); + + // 第三次重试失败 + await act(async () => { + vi.advanceTimersByTime(1100); + }); + expect(errorCallback).toHaveBeenCalledTimes(4); + + // 达到重试限制,停止 polling + act(() => { + vi.advanceTimersByTime(1100); + }); + expect(errorCallback).toHaveBeenCalledTimes(4); + + // 手动重新运行 + act(() => { + hook2.result.current.run(); + }); + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(errorCallback).toHaveBeenCalledTimes(5); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/usePollingPlugin.test.ts b/packages/hooks/src/useRequest/__tests__/usePollingPlugin.test.ts deleted file mode 100644 index 168faf5095..0000000000 --- a/packages/hooks/src/useRequest/__tests__/usePollingPlugin.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -describe('usePollingPlugin', () => { - jest.useFakeTimers(); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - - let hook; - it('usePollingPlugin pollingInterval=100 pollingWhenHidden=true should work', async () => { - const callback = jest.fn(); - act(() => { - hook = setUp( - () => { - callback(); - return request(1); - }, - { - pollingInterval: 100, - pollingWhenHidden: true, - }, - ); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - expect(hook.result.current.data).toEqual('success'); - expect(callback).toHaveBeenCalledTimes(1); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(callback).toHaveBeenCalledTimes(2); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(callback).toHaveBeenCalledTimes(3); - - act(() => { - hook.result.current.cancel(); - }); - - act(() => { - jest.runAllTimers(); - }); - expect(callback).toHaveBeenCalledTimes(3); - - act(() => { - hook.result.current.run(); - }); - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(callback).toHaveBeenCalledTimes(4); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(callback).toHaveBeenCalledTimes(5); - - hook.unmount(); - }); - - let hook2; - it('usePollingPlugin pollingErrorRetryCount=3 should work', async () => { - // if request error and set pollingErrorRetryCount - // and the number of consecutive failures exceeds pollingErrorRetryCount, polling stops - let errorCallback; - act(() => { - errorCallback = jest.fn(); - hook2 = setUp(() => request(0), { - pollingErrorRetryCount: 3, - pollingInterval: 100, - pollingWhenHidden: true, - onError: errorCallback, - }); - }); - - expect(hook2.result.current.loading).toEqual(true); - expect(errorCallback).toHaveBeenCalledTimes(0); - - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(hook2.result.current.loading).toEqual(false); - expect(errorCallback).toHaveBeenCalledTimes(1); - - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(2); - - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(3); - - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(4); - - act(() => { - jest.runAllTimers(); - }); - expect(errorCallback).toHaveBeenCalledTimes(4); - - act(() => { - hook2.result.current.run(); - }); - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(5); - - hook2.unmount(); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/useRefreshOnWindowFocusPlugin.spec.ts b/packages/hooks/src/useRequest/__tests__/useRefreshOnWindowFocusPlugin.spec.ts new file mode 100644 index 0000000000..198be93f68 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/useRefreshOnWindowFocusPlugin.spec.ts @@ -0,0 +1,90 @@ +import { act, fireEvent, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +describe('useRefreshOnWindowFocusPlugin', () => { + vi.useFakeTimers(); + + const setUp = ( + service: (...args: TParams) => Promise, + options?: Parameters>[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; + let hook1: RenderHookResult; + let hook2: RenderHookResult; + + test('useRefreshOnWindowFocusPlugin should work', async () => { + act(() => { + hook = setUp(request, { + refreshOnWindowFocus: true, + focusTimespan: 5000, + }); + }); + expect(hook.result.current.loading).toBe(true); + await act(async () => { + vi.advanceTimersByTime(1001); + }); + expect(hook.result.current.loading).toBe(false); + act(() => { + fireEvent.focus(window); + }); + expect(hook.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(2000); + }); + expect(hook.result.current.loading).toBe(false); + act(() => { + vi.advanceTimersByTime(3000); + fireEvent.focus(window); + }); + expect(hook.result.current.loading).toBe(true); + }); + + test('fix: multiple unsubscriptions should not delete the last subscription listener ', async () => { + act(() => { + hook1 = setUp(request, { + refreshOnWindowFocus: true, + }); + hook2 = setUp(request, { + refreshOnWindowFocus: true, + }); + }); + + expect(hook1.result.current.loading).toBe(true); + expect(hook2.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(1001); + }); + expect(hook1.result.current.loading).toBe(false); + expect(hook2.result.current.loading).toBe(false); + + act(() => { + fireEvent.focus(window); + }); + + expect(hook1.result.current.loading).toBe(true); + expect(hook2.result.current.loading).toBe(true); + + await act(async () => { + vi.advanceTimersByTime(2000); + }); + + expect(hook1.result.current.loading).toBe(false); + expect(hook2.result.current.loading).toBe(false); + + hook1.unmount(); + + act(() => { + vi.advanceTimersByTime(3000); + fireEvent.focus(window); + }); + + expect(hook1.result.current.loading).toBe(false); + // hook2 should not unsubscribe + expect(hook2.result.current.loading).toBe(true); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/useRefreshOnWindowFocusPlugin.test.ts b/packages/hooks/src/useRequest/__tests__/useRefreshOnWindowFocusPlugin.test.ts deleted file mode 100644 index e5533c7cf0..0000000000 --- a/packages/hooks/src/useRequest/__tests__/useRefreshOnWindowFocusPlugin.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import { fireEvent } from '@testing-library/react'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -describe('useRefreshOnWindowFocusPlugin', () => { - jest.useFakeTimers(); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - - let hook; - it('useRefreshOnWindowFocusPlugin should work', async () => { - act(() => { - hook = setUp(request, { - refreshOnWindowFocus: true, - focusTimespan: 5000, - }); - }); - expect(hook.result.current.loading).toEqual(true); - act(() => { - jest.advanceTimersByTime(1001); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - act(() => { - fireEvent.focus(window); - }); - expect(hook.result.current.loading).toEqual(true); - - act(() => { - jest.advanceTimersByTime(2000); - }); - await hook.waitForNextUpdate(); - expect(hook.result.current.loading).toEqual(false); - act(() => { - jest.advanceTimersByTime(3000); - fireEvent.focus(window); - }); - expect(hook.result.current.loading).toEqual(true); - hook.unmount(); - }); - - it('fix: multiple unsubscriptions should not delete the last subscription listener ', async () => { - let hook1; - let hook2; - act(() => { - hook1 = setUp(request, { - refreshOnWindowFocus: true, - }); - hook2 = setUp(request, { - refreshOnWindowFocus: true, - }); - }); - - expect(hook1.result.current.loading).toEqual(true); - expect(hook2.result.current.loading).toEqual(true); - - act(() => { - jest.advanceTimersByTime(1001); - }); - await hook1.waitForNextUpdate(); - expect(hook1.result.current.loading).toEqual(false); - expect(hook2.result.current.loading).toEqual(false); - - act(() => { - fireEvent.focus(window); - }); - - expect(hook1.result.current.loading).toEqual(true); - expect(hook2.result.current.loading).toEqual(true); - - act(() => { - jest.advanceTimersByTime(2000); - }); - - await hook1.waitForNextUpdate(); - - expect(hook1.result.current.loading).toEqual(false); - expect(hook2.result.current.loading).toEqual(false); - - hook1.unmount(); - - act(() => { - jest.advanceTimersByTime(3000); - fireEvent.focus(window); - }); - - expect(hook1.result.current.loading).toEqual(false); - // hook2 should not unsubscribe - expect(hook2.result.current.loading).toEqual(true); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/useRetryPlugin.spec.ts b/packages/hooks/src/useRequest/__tests__/useRetryPlugin.spec.ts new file mode 100644 index 0000000000..c37b9129c6 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/useRetryPlugin.spec.ts @@ -0,0 +1,94 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +describe('useRetryPlugin', () => { + vi.useFakeTimers(); + + const setUp = ( + service: (...args: TParams) => Promise, + options?: Parameters>[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; + let hook2: RenderHookResult; + + test('useRetryPlugin should work', async () => { + let errorCallback: any; + act(() => { + errorCallback = vi.fn(); + hook = setUp(() => request(0), { + retryCount: 3, + onError: errorCallback, + }); + }); + act(() => { + vi.advanceTimersByTime(500); + }); + expect(errorCallback).toHaveBeenCalledTimes(0); + + // 第一次执行失败 (1000ms) + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(errorCallback).toHaveBeenCalledTimes(1); + + // 第一次重试失败 (等待 2000ms 后重试 + 1000ms 执行) + await act(async () => { + vi.advanceTimersByTime(3000); + }); + expect(errorCallback).toHaveBeenCalledTimes(2); + + // 第二次重试失败 (等待 4000ms 后重试 + 1000ms 执行) + await act(async () => { + vi.advanceTimersByTime(5000); + }); + expect(errorCallback).toHaveBeenCalledTimes(3); + + // 第三次重试失败 (等待 8000ms 后重试 + 1000ms 执行) + await act(async () => { + vi.advanceTimersByTime(9000); + }); + expect(errorCallback).toHaveBeenCalledTimes(4); + + // 达到重试次数限制,不再重试 + act(() => { + vi.advanceTimersByTime(10000); + }); + expect(errorCallback).toHaveBeenCalledTimes(4); + hook.unmount(); + + // cancel should work + act(() => { + errorCallback = vi.fn(); + hook2 = setUp(() => request(0), { + retryCount: 3, + onError: errorCallback, + }); + }); + expect(errorCallback).toHaveBeenCalledTimes(0); + + // 第一次执行失败 + await act(async () => { + vi.advanceTimersByTime(1000); + }); + expect(errorCallback).toHaveBeenCalledTimes(1); + + // 第一次重试失败 + await act(async () => { + vi.advanceTimersByTime(3000); + }); + expect(errorCallback).toHaveBeenCalledTimes(2); + + // 取消重试 + act(() => { + hook2.result.current.cancel(); + }); + act(() => { + vi.advanceTimersByTime(10000); + }); + expect(errorCallback).toHaveBeenCalledTimes(2); + hook2.unmount(); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/useRetryPlugin.test.ts b/packages/hooks/src/useRequest/__tests__/useRetryPlugin.test.ts deleted file mode 100644 index 53eada5757..0000000000 --- a/packages/hooks/src/useRequest/__tests__/useRetryPlugin.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -describe('useRetryPlugin', () => { - jest.useFakeTimers(); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - - let hook; - it('useRetryPlugin should work', async () => { - let errorCallback; - act(() => { - errorCallback = jest.fn(); - hook = setUp(() => request(0), { - retryCount: 3, - onError: errorCallback, - }); - }); - act(() => { - jest.setTimeout(10000); - jest.advanceTimersByTime(500); - }); - expect(errorCallback).toHaveBeenCalledTimes(0); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(1); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(2); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(3); - - act(() => { - jest.runAllTimers(); - }); - await hook.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(4); - - act(() => { - jest.runAllTimers(); - }); - expect(errorCallback).toHaveBeenCalledTimes(4); - hook.unmount(); - - //cancel should work - let hook2; - act(() => { - errorCallback = jest.fn(); - hook2 = setUp(() => request(0), { - retryCount: 3, - onError: errorCallback, - }); - }); - expect(errorCallback).toHaveBeenCalledTimes(0); - - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(1); - - act(() => { - jest.runAllTimers(); - }); - await hook2.waitForNextUpdate(); - expect(errorCallback).toHaveBeenCalledTimes(2); - act(() => { - hook2.result.current.cancel(); - }); - act(() => { - jest.runAllTimers(); - }); - expect(errorCallback).toHaveBeenCalledTimes(2); - hook2.unmount(); - }); -}); diff --git a/packages/hooks/src/useRequest/__tests__/useThrottlePlugin.spec.ts b/packages/hooks/src/useRequest/__tests__/useThrottlePlugin.spec.ts new file mode 100644 index 0000000000..e396befaa2 --- /dev/null +++ b/packages/hooks/src/useRequest/__tests__/useThrottlePlugin.spec.ts @@ -0,0 +1,44 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { request } from '../../utils/testingHelpers'; +import useRequest from '../index'; + +describe('useThrottlePlugin', () => { + vi.useFakeTimers(); + + const setUp = ( + service: Parameters[0], + options: Parameters[1], + ) => renderHook((o) => useRequest(service, o || options)); + + let hook: RenderHookResult; + test('useThrottlePlugin should work', () => { + const callback = vi.fn(); + + act(() => { + hook = setUp( + () => { + callback(); + return request({}); + }, + { + manual: true, + throttleWait: 100, + }, + ); + }); + + act(() => { + hook.result.current.run(1); + vi.advanceTimersByTime(50); + hook.result.current.run(2); + vi.advanceTimersByTime(50); + hook.result.current.run(3); + vi.advanceTimersByTime(50); + hook.result.current.run(4); + vi.advanceTimersByTime(40); + }); + + expect(callback).toHaveBeenCalledTimes(2); + }); +}); diff --git a/packages/hooks/src/useRequest/__tests__/useThrottlePlugin.test.ts b/packages/hooks/src/useRequest/__tests__/useThrottlePlugin.test.ts deleted file mode 100644 index 1ac8579c3d..0000000000 --- a/packages/hooks/src/useRequest/__tests__/useThrottlePlugin.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useRequest from '../index'; -import { request } from '../../utils/testingHelpers'; - -describe('useThrottlePlugin', () => { - jest.useFakeTimers(); - - const setUp = (service, options) => renderHook((o) => useRequest(service, o || options)); - - let hook; - it('useThrottlePlugin should work', async () => { - const callback = jest.fn(); - - act(() => { - hook = setUp( - () => { - callback(); - return request({}); - }, - { - manual: true, - throttleWait: 100, - }, - ); - }); - - act(() => { - hook.result.current.run(1); - jest.advanceTimersByTime(50); - hook.result.current.run(2); - jest.advanceTimersByTime(50); - hook.result.current.run(3); - jest.advanceTimersByTime(50); - hook.result.current.run(4); - jest.advanceTimersByTime(40); - }); - - expect(callback).toHaveBeenCalledTimes(2); - }); -}); diff --git a/packages/hooks/src/useRequest/doc/basic/basic.en-US.md b/packages/hooks/src/useRequest/doc/basic/basic.en-US.md index 123722d44f..330719c1f7 100644 --- a/packages/hooks/src/useRequest/doc/basic/basic.en-US.md +++ b/packages/hooks/src/useRequest/doc/basic/basic.en-US.md @@ -99,7 +99,7 @@ We have modified the user name, but we do not want to wait for the request to be ## Cancel response -`useRequest` provides a `cancel` function, which will **ignore** the data and erros returned by the current promise +`useRequest` provides a `cancel` function, which will **ignore** the data and error returned by the current promise **Note: Calling `cancel` doesn't cancel the execution of promise** diff --git a/packages/hooks/src/useRequest/doc/basic/demo/cancel.tsx b/packages/hooks/src/useRequest/doc/basic/demo/cancel.tsx index 01e44996c2..eba5d4b83f 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/cancel.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/cancel.tsx @@ -1,5 +1,5 @@ import { message } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRequest } from 'ahooks'; function editUsername(username: string): Promise { diff --git a/packages/hooks/src/useRequest/doc/basic/demo/default.tsx b/packages/hooks/src/useRequest/doc/basic/demo/default.tsx index e6add661fd..86c578296b 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/default.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/default.tsx @@ -6,8 +6,6 @@ import { useRequest } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; - function getUsername(): Promise { return new Promise((resolve, reject) => { setTimeout(() => { diff --git a/packages/hooks/src/useRequest/doc/basic/demo/lifeCycle.tsx b/packages/hooks/src/useRequest/doc/basic/demo/lifeCycle.tsx index 429fc4904f..8933d3c821 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/lifeCycle.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/lifeCycle.tsx @@ -1,5 +1,5 @@ import { message } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRequest } from 'ahooks'; function editUsername(username: string): Promise { diff --git a/packages/hooks/src/useRequest/doc/basic/demo/manual-run.tsx b/packages/hooks/src/useRequest/doc/basic/demo/manual-run.tsx index a580a05e15..db875e444a 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/manual-run.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/manual-run.tsx @@ -7,7 +7,7 @@ */ import { message } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRequest } from 'ahooks'; function editUsername(username: string): Promise { diff --git a/packages/hooks/src/useRequest/doc/basic/demo/manual-runAsync.tsx b/packages/hooks/src/useRequest/doc/basic/demo/manual-runAsync.tsx index 4eb941b875..c26ec0e5b2 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/manual-runAsync.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/manual-runAsync.tsx @@ -7,7 +7,7 @@ */ import { message } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRequest } from 'ahooks'; function editUsername(username: string): Promise { @@ -35,7 +35,7 @@ export default () => { setState(''); message.success(`The username was changed to "${state}" !`); } catch (error) { - message.error(error.message); + message.error((error as Error).message); } }; diff --git a/packages/hooks/src/useRequest/doc/basic/demo/mutate.tsx b/packages/hooks/src/useRequest/doc/basic/demo/mutate.tsx index 8e103e2110..685b2cfc94 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/mutate.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/mutate.tsx @@ -5,7 +5,7 @@ */ import { message } from 'antd'; -import React, { useState, useRef } from 'react'; +import { useState, useRef } from 'react'; import { useRequest } from 'ahooks'; import Mock from 'mockjs'; @@ -31,7 +31,7 @@ function editUsername(username: string): Promise { export default () => { // store last username - const lastRef = useRef(); + const lastRef = useRef(undefined); const [state, setState] = useState(''); @@ -52,7 +52,7 @@ export default () => { }); const onChange = () => { - lastRef.current = username; + lastRef.current = username || undefined; mutate(state); edit(state); }; diff --git a/packages/hooks/src/useRequest/doc/basic/demo/params.tsx b/packages/hooks/src/useRequest/doc/basic/demo/params.tsx index da3763468e..b6b18cf1c3 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/params.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/params.tsx @@ -1,6 +1,6 @@ import { useRequest } from 'ahooks'; import Mock from 'mockjs'; -import React, { useState } from 'react'; +import { useState } from 'react'; function getUsername(id: string): Promise { return new Promise((resolve) => { diff --git a/packages/hooks/src/useRequest/doc/basic/demo/refresh.tsx b/packages/hooks/src/useRequest/doc/basic/demo/refresh.tsx index 099e8a0ee7..c295e36295 100644 --- a/packages/hooks/src/useRequest/doc/basic/demo/refresh.tsx +++ b/packages/hooks/src/useRequest/doc/basic/demo/refresh.tsx @@ -6,7 +6,7 @@ import { useRequest } from 'ahooks'; import Mock from 'mockjs'; -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; function getUsername(id: number): Promise { console.log('use-request-refresh-id', id); diff --git a/packages/hooks/src/useRequest/doc/cache/cache.en-US.md b/packages/hooks/src/useRequest/doc/cache/cache.en-US.md index d521283d6f..58dce1b057 100644 --- a/packages/hooks/src/useRequest/doc/cache/cache.en-US.md +++ b/packages/hooks/src/useRequest/doc/cache/cache.en-US.md @@ -29,10 +29,12 @@ By setting `staleTime`, we can specify the data retention time, during which tim ### Data sharing -The content of the same `cacheKey` is shared globally, which will bring the following features +> Note: If no new request is issued, the "Data sharing" will not be triggered. `cacheTime` and `staleTime` parameters will invalidate "Data sharing". [#2313](https://github.com/alibaba/hooks/issues/2313) -- Sharing request `Promise`, only one of the same `cacheKey` will initiate a request at the same time, and the subsequent ones will share the same request `Promise`. -- Data synchronization. At any time, when we change the content of one of the `cacheKey`, the content of the other `cacheKey` will be synchronized. +The content of the same `cacheKey` is shared globally, which will bring the following features: + +- Sharing request `Promise`: Only one of the same `cacheKey` will initiate a request at the same time, and the subsequent ones will share the same request `Promise`. +- Data synchronization: When a request is made by one `cacheKey`, the contents of other identical `cacheKey` will be synchronized accordingly. In the following example, the two components will only initiate one request during initialization. And the content of the two articles is always synchronized. @@ -77,7 +79,7 @@ interface CachedData { | Property | Description | Type | Default | | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | -------- | -| cacheKey | A unique ID of the request. If `cacheKey` is set, we will enable the caching mechanism. The data of the same `cacheKey` is globally synchronized. | `string` | - | +| cacheKey | A unique ID of the request. Data of the same `cacheKey` will synchronized globally (`cacheTime` and `staleTime` parameters will invalidate this mechanism, see demo: [Data sharing](#data-sharing)) | `string` | - | | cacheTime |
  • Set the cache time. By default, the cached data will be cleared after 5 minutes.
  • If set to `-1`, the cached data will never expire
| `number` | `300000` | | staleTime |
  • Time to consider the cached data is fresh. Within this time interval, the request will not be re-initiated
  • If set to `-1`, it means that the data is always fresh
| `number` | `0` | | setCache |
  • Custom set cache
  • `setCache` and `getCache` need to be used together
  • In the custom cache mode, `cacheTime` and `clearCache` are useless, please implement it yourself according to the actual situation.
| `(data: CachedData) => void;` | - | diff --git a/packages/hooks/src/useRequest/doc/cache/cache.zh-CN.md b/packages/hooks/src/useRequest/doc/cache/cache.zh-CN.md index d5bfc547ca..4ec3444abf 100644 --- a/packages/hooks/src/useRequest/doc/cache/cache.zh-CN.md +++ b/packages/hooks/src/useRequest/doc/cache/cache.zh-CN.md @@ -29,10 +29,12 @@ group: ### 数据共享 -同一个 `cacheKey` 的内容,在全局是共享的,这会带来以下几个特性 +> 注意:如果没有发起新请求,不会触发数据共享。`cacheTime`、`staleTime` 参数会使数据共享失效。[#2313](https://github.com/alibaba/hooks/issues/2313) -- 请求 `Promise` 共享,相同的 `cacheKey` 同时只会有一个在发起请求,后发起的会共用同一个请求 `Promise` -- 数据同步,任何时候,当我们改变其中某个 `cacheKey` 的内容时,其它相同 `cacheKey` 的内容均会同步 +同一个 `cacheKey` 的内容,在全局是共享的,这会带来以下几个特性: + +- 请求 `Promise` 共享:相同的 `cacheKey` 同时只会有一个在发起请求,后发起的会共用同一个请求 `Promise` +- 数据同步:当某个 `cacheKey` 发起请求时,其它相同 `cacheKey` 的内容均会随之同步 下面的示例中,初始化时,两个组件只会发起一个请求。并且两篇文章的内容永远是同步的。 @@ -77,7 +79,7 @@ interface CachedData { | 参数 | 说明 | 类型 | 默认值 | | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | -------- | -| cacheKey | 请求唯一标识。如果设置了 `cacheKey`,我们会启用缓存机制。同一个 `cacheKey` 的数据全局同步。 | `string` | - | +| cacheKey | 请求的唯一标识。相同 `cacheKey` 的数据全局同步(`cacheTime`、`staleTime` 参数会使该机制失效,见示例:[数据共享](#数据共享))。 | `string` | - | | cacheTime |
  • 设置缓存数据回收时间。默认缓存数据 5 分钟后回收
  • 如果设置为 `-1`, 则表示缓存数据永不过期
| `number` | `300000` | | staleTime |
  • 缓存数据保持新鲜时间。在该时间间隔内,认为数据是新鲜的,不会重新发请求
  • 如果设置为 `-1`,则表示数据永远新鲜
| `number` | `0` | | setCache |
  • 自定义设置缓存
  • `setCache` 和 `getCache` 需要配套使用
  • 在自定义缓存模式下,`cacheTime` 和 `clearCache` 不会生效,请根据实际情况自行实现。
| `(data: CachedData) => void;` | - | diff --git a/packages/hooks/src/useRequest/doc/cache/demo/cacheKey.tsx b/packages/hooks/src/useRequest/doc/cache/demo/cacheKey.tsx index 22fb310299..aaa787eceb 100644 --- a/packages/hooks/src/useRequest/doc/cache/demo/cacheKey.tsx +++ b/packages/hooks/src/useRequest/doc/cache/demo/cacheKey.tsx @@ -3,19 +3,18 @@ import Mock from 'mockjs'; import React from 'react'; import { useRequest } from 'ahooks'; -async function getArticle(): Promise<{ data: string; time: number }> { - console.log('cacheKey'); - return new Promise((resolve) => { +const getArticle = async () => { + return new Promise<{ data: string; time: number }>((resolve) => { setTimeout(() => { resolve({ data: Mock.mock('@paragraph'), - time: new Date().getTime(), + time: Date.now(), }); }, 1000); }); -} +}; -const Article = () => { +const Article: React.FC = () => { const { data, loading } = useRequest(getArticle, { cacheKey: 'cacheKey-demo', }); diff --git a/packages/hooks/src/useRequest/doc/cache/demo/clearCache.tsx b/packages/hooks/src/useRequest/doc/cache/demo/clearCache.tsx index 0d036d30ef..94d8d6a6a8 100644 --- a/packages/hooks/src/useRequest/doc/cache/demo/clearCache.tsx +++ b/packages/hooks/src/useRequest/doc/cache/demo/clearCache.tsx @@ -1,20 +1,19 @@ import Mock from 'mockjs'; -import React from 'react'; import { useRequest, clearCache, useBoolean } from 'ahooks'; import { message } from 'antd'; -async function getArticle(): Promise<{ data: string; time: number }> { - return new Promise((resolve) => { +const getArticle = async () => { + return new Promise<{ data: string; time: number }>((resolve) => { setTimeout(() => { resolve({ data: Mock.mock('@paragraph'), - time: new Date().getTime(), + time: Date.now(), }); }, 3000); }); -} +}; -const Article = ({ cacheKey }) => { +const Article = ({ cacheKey }: { cacheKey: string }) => { const { data, loading } = useRequest(getArticle, { cacheKey, }); diff --git a/packages/hooks/src/useRequest/doc/cache/demo/params.tsx b/packages/hooks/src/useRequest/doc/cache/demo/params.tsx index a6bf62a03b..bc7c17b716 100644 --- a/packages/hooks/src/useRequest/doc/cache/demo/params.tsx +++ b/packages/hooks/src/useRequest/doc/cache/demo/params.tsx @@ -1,19 +1,19 @@ import { useBoolean } from 'ahooks'; import useRequest from '../../../'; import Mock from 'mockjs'; -import React, { useState } from 'react'; +import { useState } from 'react'; -async function getArticle(keyword: string): Promise<{ data: string; time: number }> { +const getArticle = async (keyword: string) => { console.log('cacheKey', keyword); - return new Promise((resolve) => { + return new Promise<{ data: string; time: number }>((resolve) => { setTimeout(() => { resolve({ data: Mock.mock('@paragraph'), - time: new Date().getTime(), + time: Date.now(), }); }, 1000); }); -} +}; const Article = () => { const { data, params, loading, run } = useRequest(getArticle, { diff --git a/packages/hooks/src/useRequest/doc/cache/demo/setCache.tsx b/packages/hooks/src/useRequest/doc/cache/demo/setCache.tsx index 78c2d84594..066103105b 100644 --- a/packages/hooks/src/useRequest/doc/cache/demo/setCache.tsx +++ b/packages/hooks/src/useRequest/doc/cache/demo/setCache.tsx @@ -3,23 +3,23 @@ import Mock from 'mockjs'; import React from 'react'; import { useRequest } from 'ahooks'; -async function getArticle(): Promise<{ data: string; time: number }> { - return new Promise((resolve) => { +const getArticle = async () => { + return new Promise<{ data: string; time: number }>((resolve) => { setTimeout(() => { resolve({ data: Mock.mock('@paragraph'), - time: new Date().getTime(), + time: Date.now(), }); }, 1000); }); -} +}; const cacheKey = 'setCache-demo'; -const Article = () => { +const Article: React.FC = () => { const { data, loading } = useRequest(getArticle, { cacheKey, - setCache: (data) => localStorage.setItem(cacheKey, JSON.stringify(data)), + setCache: (value) => localStorage.setItem(cacheKey, JSON.stringify(value)), getCache: () => JSON.parse(localStorage.getItem(cacheKey) || '{}'), }); if (!data && loading) { diff --git a/packages/hooks/src/useRequest/doc/cache/demo/share.tsx b/packages/hooks/src/useRequest/doc/cache/demo/share.tsx index 0969695ea2..a8506acfcf 100644 --- a/packages/hooks/src/useRequest/doc/cache/demo/share.tsx +++ b/packages/hooks/src/useRequest/doc/cache/demo/share.tsx @@ -1,18 +1,17 @@ import Mock from 'mockjs'; -import React from 'react'; import { useRequest } from 'ahooks'; -async function getArticle(): Promise<{ data: string; time: number }> { +const getArticle = async () => { console.log('cacheKey-share'); - return new Promise((resolve) => { + return new Promise<{ data: string; time: number }>((resolve) => { setTimeout(() => { resolve({ data: Mock.mock('@paragraph'), - time: new Date().getTime(), + time: Date.now(), }); }, 3000); }); -} +}; const Article = () => { const { data, loading, refresh } = useRequest(getArticle, { diff --git a/packages/hooks/src/useRequest/doc/cache/demo/staleTime.tsx b/packages/hooks/src/useRequest/doc/cache/demo/staleTime.tsx index ff691c7db4..bac23dd43a 100644 --- a/packages/hooks/src/useRequest/doc/cache/demo/staleTime.tsx +++ b/packages/hooks/src/useRequest/doc/cache/demo/staleTime.tsx @@ -1,19 +1,18 @@ import { useBoolean } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; import { useRequest } from 'ahooks'; -async function getArticle(): Promise<{ data: string; time: number }> { +const getArticle = async () => { console.log('cacheKey-staleTime'); - return new Promise((resolve) => { + return new Promise<{ data: string; time: number }>((resolve) => { setTimeout(() => { resolve({ data: Mock.mock('@paragraph'), - time: new Date().getTime(), + time: Date.now(), }); }, 1000); }); -} +}; const Article = () => { const { data, loading } = useRequest(getArticle, { diff --git a/packages/hooks/src/useRequest/doc/debounce/debounce.en-US.md b/packages/hooks/src/useRequest/doc/debounce/debounce.en-US.md index 5d725e58c4..9727c8c04c 100644 --- a/packages/hooks/src/useRequest/doc/debounce/debounce.en-US.md +++ b/packages/hooks/src/useRequest/doc/debounce/debounce.en-US.md @@ -31,7 +31,7 @@ The usage and effect of all debounce property are the same as [lodash.debounce]( | Property | Description | Type | Default Value | | ---------------- | ---------------------------------------------------------------------------- | --------- | ------------- | | debounceWait | Debounce delay time, in milliseconds. After setting, enter the debounce mode | `number` | - | -| debounceLeading | Execute the request before the delay starts ` | `boolean` | `false` | +| debounceLeading | Execute the request before the delay starts | `boolean` | `false` | | debounceTrailing | Execute the request after the delay ends | `boolean` | `true` | | debounceMaxWait | The maximum time request is allowed to be delayed before it’s executed | `number` | - | diff --git a/packages/hooks/src/useRequest/doc/debounce/demo/debounce.tsx b/packages/hooks/src/useRequest/doc/debounce/demo/debounce.tsx index 796fa04738..abe0b28de7 100644 --- a/packages/hooks/src/useRequest/doc/debounce/demo/debounce.tsx +++ b/packages/hooks/src/useRequest/doc/debounce/demo/debounce.tsx @@ -1,7 +1,5 @@ import { useRequest } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; - async function getEmail(search?: string): Promise { console.log('debounce getEmail', search); return new Promise((resolve) => { diff --git a/packages/hooks/src/useRequest/doc/index/demo/default.tsx b/packages/hooks/src/useRequest/doc/index/demo/default.tsx index e591c63927..a8f5a387a9 100644 --- a/packages/hooks/src/useRequest/doc/index/demo/default.tsx +++ b/packages/hooks/src/useRequest/doc/index/demo/default.tsx @@ -6,8 +6,6 @@ import { useRequest } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; - function getUsername(): Promise { return new Promise((resolve) => { setTimeout(() => { diff --git a/packages/hooks/src/useRequest/doc/index/demo/manual.tsx b/packages/hooks/src/useRequest/doc/index/demo/manual.tsx index 7b240187ac..da78dc691b 100644 --- a/packages/hooks/src/useRequest/doc/index/demo/manual.tsx +++ b/packages/hooks/src/useRequest/doc/index/demo/manual.tsx @@ -7,7 +7,7 @@ */ import { message } from 'antd'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { useRequest } from 'ahooks'; // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/packages/hooks/src/useRequest/doc/loadingDelay/demo/loadingDelay.tsx b/packages/hooks/src/useRequest/doc/loadingDelay/demo/loadingDelay.tsx index a333757710..a6ecce3cd0 100644 --- a/packages/hooks/src/useRequest/doc/loadingDelay/demo/loadingDelay.tsx +++ b/packages/hooks/src/useRequest/doc/loadingDelay/demo/loadingDelay.tsx @@ -1,5 +1,4 @@ import { useRequest } from 'ahooks'; -import React from 'react'; import Mock from 'mockjs'; function getUsername(): Promise { diff --git a/packages/hooks/src/useRequest/doc/polling/demo/polling.tsx b/packages/hooks/src/useRequest/doc/polling/demo/polling.tsx index dcf8f0facb..ccddffbf0d 100644 --- a/packages/hooks/src/useRequest/doc/polling/demo/polling.tsx +++ b/packages/hooks/src/useRequest/doc/polling/demo/polling.tsx @@ -1,5 +1,4 @@ import { useRequest } from 'ahooks'; -import React from 'react'; import Mock from 'mockjs'; function getUsername() { @@ -19,7 +18,7 @@ export default () => { return ( <> -

Username: {loading ? 'Loading' : data}

+

Username: {loading ? 'Loading' : String(data)}

diff --git a/packages/hooks/src/useRequest/doc/polling/demo/pollingError.tsx b/packages/hooks/src/useRequest/doc/polling/demo/pollingError.tsx index 3e597c800f..044ba1a2a8 100644 --- a/packages/hooks/src/useRequest/doc/polling/demo/pollingError.tsx +++ b/packages/hooks/src/useRequest/doc/polling/demo/pollingError.tsx @@ -1,5 +1,4 @@ import { useRequest } from 'ahooks'; -import React from 'react'; import Mock from 'mockjs'; import { message } from 'antd'; @@ -25,7 +24,7 @@ export default () => { return ( <> -

Username: {loading ? 'Loading' : data}

+

Username: {loading ? 'Loading' : String(data)}

diff --git a/packages/hooks/src/useRequest/doc/polling/polling.en-US.md b/packages/hooks/src/useRequest/doc/polling/polling.en-US.md index 495b46706c..56c69db578 100644 --- a/packages/hooks/src/useRequest/doc/polling/polling.en-US.md +++ b/packages/hooks/src/useRequest/doc/polling/polling.en-US.md @@ -58,4 +58,5 @@ You can experience the effect through the following example. - `options.pollingInterval`, `options.pollingWhenHidden` support dynamic changes. - If you set `options.manual = true`, the initialization will not start polling, you need start it by `run/runAsync`. +- If the `pollingInterval` changes from 0 to a value greater than 0, polling will not start automatically, and you need start it by `run/runAsync`. - The polling logic is to wait for `pollingInterval` time after each request is completed, and then initiate the next request. diff --git a/packages/hooks/src/useRequest/doc/polling/polling.zh-CN.md b/packages/hooks/src/useRequest/doc/polling/polling.zh-CN.md index b043adf048..b124f49d02 100644 --- a/packages/hooks/src/useRequest/doc/polling/polling.zh-CN.md +++ b/packages/hooks/src/useRequest/doc/polling/polling.zh-CN.md @@ -50,7 +50,7 @@ const { data, run, cancel } = useRequest(getUsername, { | 参数 | 说明 | 类型 | 默认值 | | ---------------------- | ------------------------------------------------------------------------------------------------------ | --------- | ------ | -| pollingInterval | 轮询间隔,单位为毫秒。如果值大于 0,则启动轮询模式。 | `number` | `0` | +| pollingInterval | 轮询间隔,单位为毫秒。如果值大于 0,则处于轮询模式。 | `number` | `0` | | pollingWhenHidden | 在页面隐藏时,是否继续轮询。如果设置为 false,在页面隐藏时会暂时停止轮询,页面重新显示时继续上次轮询。 | `boolean` | `true` | | pollingErrorRetryCount | 轮询错误重试次数。如果设置为 -1,则无限次 | `number` | `-1` | @@ -58,4 +58,5 @@ const { data, run, cancel } = useRequest(getUsername, { - `options.pollingInterval`、`options.pollingWhenHidden` 支持动态变化。 - 如果设置 `options.manual = true`,则初始化不会启动轮询,需要通过 `run/runAsync` 触发开始。 +- 如果设置 `pollingInterval` 由 `0` 变成 `大于 0` 的值,不会启动轮询,需要通过 `run/runAsync` 触发开始。 - 轮询原理是在每次请求完成后,等待 `pollingInterval` 时间,发起下一次请求。 diff --git a/packages/hooks/src/useRequest/doc/ready/demo/manualReady.tsx b/packages/hooks/src/useRequest/doc/ready/demo/manualReady.tsx index 81ff549cf1..fa6130e94b 100644 --- a/packages/hooks/src/useRequest/doc/ready/demo/manualReady.tsx +++ b/packages/hooks/src/useRequest/doc/ready/demo/manualReady.tsx @@ -1,7 +1,5 @@ import { useRequest, useToggle } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; - function getUsername() { return new Promise((resolve) => { setTimeout(() => { @@ -27,7 +25,7 @@ export default () => {

- Username: {loading ? 'Loading' : data} + Username: {loading ? 'Loading' : String(data)} diff --git a/packages/hooks/src/useRequest/doc/ready/demo/ready.tsx b/packages/hooks/src/useRequest/doc/ready/demo/ready.tsx index 795db15a9a..fd301d10cc 100644 --- a/packages/hooks/src/useRequest/doc/ready/demo/ready.tsx +++ b/packages/hooks/src/useRequest/doc/ready/demo/ready.tsx @@ -1,7 +1,5 @@ import { useRequest, useToggle } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; - function getUsername() { return new Promise((resolve) => { setTimeout(() => { @@ -25,7 +23,7 @@ export default () => { Toggle Ready

-

Username: {loading ? 'Loading' : data}

+

Username: {loading ? 'Loading' : String(data)}

); }; diff --git a/packages/hooks/src/useRequest/doc/ready/ready.en-US.md b/packages/hooks/src/useRequest/doc/ready/ready.en-US.md index 6baac8b28d..0e3d6b0caa 100644 --- a/packages/hooks/src/useRequest/doc/ready/ready.en-US.md +++ b/packages/hooks/src/useRequest/doc/ready/ready.en-US.md @@ -7,7 +7,7 @@ group: # Ready -useRequest provides an `options.ready`, when its value is `false`, the request will never be sent. +By setting `options.ready`, you can control whether a request is sent. When its value is `false`, the request will never be sent. The specific behavior is as follows: diff --git a/packages/hooks/src/useRequest/doc/ready/ready.zh-CN.md b/packages/hooks/src/useRequest/doc/ready/ready.zh-CN.md index b2f5c802a9..9b04d6e705 100644 --- a/packages/hooks/src/useRequest/doc/ready/ready.zh-CN.md +++ b/packages/hooks/src/useRequest/doc/ready/ready.zh-CN.md @@ -7,7 +7,7 @@ group: # Ready -useRequest 提供了一个 `options.ready` 参数,当其值为 `false` 时,请求永远都不会发出。 +通过设置 `options.ready`,可以控制请求是否发出。当其值为 `false` 时,请求永远都不会发出。 其具体行为如下: diff --git a/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDeps.tsx b/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDeps.tsx index 531407e769..65506d2221 100644 --- a/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDeps.tsx +++ b/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDeps.tsx @@ -1,45 +1,37 @@ -import React, { useState } from 'react'; +/** + * title: Repeat last request + * desc: When the dependency array changes, use the previous parameters to make the request again. + * + * title.zh-CN: 重复上一次请求 + * desc.zh-CN: 依赖数组变化时,使用上一次的参数重新发起请求。 + */ + +import { useState } from 'react'; +import Mock from 'mockjs'; +import { Space, Button } from 'antd'; import { useRequest } from 'ahooks'; -const userSchool = (id: string) => { - switch (id) { - case '1': - return 'Tsinghua University'; - case '2': - return 'Beijing University'; - case '3': - return 'Zhejiang University'; - default: - return ''; - } -}; +function getUsername(id: number): Promise { + console.log('getUsername id:', id); -async function getUserSchool(userId: string): Promise { return new Promise((resolve) => { setTimeout(() => { - resolve(userSchool(userId)); + resolve(Mock.mock('@name')); }, 1000); }); } export default () => { - const [userId, setUserId] = useState('1'); - const { data, loading } = useRequest(() => getUserSchool(userId), { + const [userId, setUserId] = useState(); + const { data, loading, run } = useRequest((id: number) => getUsername(id), { refreshDeps: [userId], }); return ( -
- -

School: {loading ? 'Loading' : data}

-
+ +

Username: {loading ? 'loading...' : data}

+ + +
); }; diff --git a/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDepsAction.tsx b/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDepsAction.tsx new file mode 100644 index 0000000000..3003045cd0 --- /dev/null +++ b/packages/hooks/src/useRequest/doc/refreshDeps/demo/refreshDepsAction.tsx @@ -0,0 +1,50 @@ +/** + * title: Custom refresh + * desc: This example shows that when the dependency array changes, it checks the parameters' validity first and then makes a new request. + * + * title.zh-CN: 自定义刷新行为 + * desc.zh-CN: 该示例展示了当依赖数组变化时,首先校验参数合法性,然后发起新的请求。 + */ + +import { useState } from 'react'; +import Mock from 'mockjs'; +import isNumber from 'lodash/isNumber'; +import { Button, Space } from 'antd'; +import { useRequest } from 'ahooks'; + +function getUsername(id: number): Promise { + console.log('getUsername id:', id); + + return new Promise((resolve) => { + setTimeout(() => { + resolve(Mock.mock('@name')); + }, 1000); + }); +} + +export default () => { + const [userId, setUserId] = useState(); + const { data, loading, run } = useRequest((id: number) => getUsername(id), { + refreshDeps: [userId], + refreshDepsAction: () => { + if (!isNumber(userId)) { + console.log( + `parameter "userId" expected to be a number, but got ${typeof userId}.`, + userId, + ); + return; + } + run(userId); + }, + }); + + return ( + +

Username: {loading ? 'loading...' : data}

+ + +
+ ); +}; diff --git a/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.en-US.md b/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.en-US.md index 3e4e85e0e3..f1263e2e22 100644 --- a/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.en-US.md +++ b/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.en-US.md @@ -7,11 +7,10 @@ group: # RefreshDeps -useRequest provides an `options.refreshDeps`, which will trigger the request refresh when its value changes. +By setting `options.refreshDeps`, `useRequest` will run [refresh](https://ahooks.js.org/hooks/use-request/basic/#result) automatically when dependencies change, achieving the effect of [Refresh (repeat the last request)](https://ahooks.js.org/hooks/use-request/basic/#refresh-repeat-the-last-request). ```tsx | pure const [userId, setUserId] = useState('1'); - const { data, run } = useRequest(() => getUserSchool(userId), { refreshDeps: [userId], }); @@ -23,7 +22,6 @@ It is exactly the same with the following implementation ```tsx | pure const [userId, setUserId] = useState('1'); - const { data, refresh } = useRequest(() => getUserSchool(userId)); useEffect(() => { @@ -31,14 +29,23 @@ useEffect(() => { }, [userId]); ``` -You can experience the effect through the following example +### Repeat last request +### Custom refresh + + + ## API ### Options -| Property | Description | Type | Default | -| ----------- | ------------------------------------------------------- | ---------------------- | ------- | -| refreshDeps | When the content of the array changes, trigger refresh. | `React.DependencyList` | `[]` | +| Property | Description | Type | Default | +| ----------------- | ------------------------------------------------------------------------------------------------------------- | ---------------------- | ------- | +| refreshDeps | When the content of the array changes, trigger refresh. | `React.DependencyList` | `[]` | +| refreshDepsAction | Customize the request behavior during dependency refresh; this parameter is invoked when dependencies change. | `() => void` | - | + +## Remark + +- If you set `options.manual = true`, both `refreshDeps` and `refreshDepsAction` are no longer effective, you need to trigger the request by `run/runAsync`. diff --git a/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.zh-CN.md b/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.zh-CN.md index 4dfe7c3de9..aff568171a 100644 --- a/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.zh-CN.md +++ b/packages/hooks/src/useRequest/doc/refreshDeps/refresyDeps.zh-CN.md @@ -7,11 +7,10 @@ group: # 依赖刷新 -useRequest 提供了一个 `options.refreshDeps` 参数,当它的值变化后,会重新触发请求。 +通过设置 `options.refreshDeps`,在依赖变化时, `useRequest` 会自动调用 [refresh](https://ahooks.js.org/zh-CN/hooks/use-request/basic/#result) 方法,实现[刷新(重复上一次请求)](https://ahooks.js.org/zh-CN/hooks/use-request/basic/#刷新重复上一次请求)的效果。 ```tsx | pure const [userId, setUserId] = useState('1'); - const { data, run } = useRequest(() => getUserSchool(userId), { refreshDeps: [userId], }); @@ -23,7 +22,6 @@ const { data, run } = useRequest(() => getUserSchool(userId), { ```tsx | pure const [userId, setUserId] = useState('1'); - const { data, refresh } = useRequest(() => getUserSchool(userId)); useEffect(() => { @@ -31,14 +29,23 @@ useEffect(() => { }, [userId]); ``` -你可以通过下面示例来体验效果 +### 重复上一次请求 +### 自定义刷新行为 + + + ## API ### Options -| 参数 | 说明 | 类型 | 默认值 | -| ----------- | ------------------------------------------------------------------- | ------- | ------ | -| refreshDeps | 依赖数组,当数组内容变化后,发起请求。同 `useEffect` 的第二个参数。 | `any[]` | `[]` | +| 参数 | 说明 | 类型 | 默认值 | +| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------ | +| refreshDeps | 依赖数组。当数组内容变化后[刷新(重复上一次请求)](https://ahooks.js.org/zh-CN/hooks/use-request/basic/#刷新重复上一次请求)。同 `useEffect` 的第二个参数。 | `any[]` | `[]` | +| refreshDepsAction | 自定义依赖数组变化时的请求行为。 | `() => void` | - | + +## 备注 + +- 如果设置 `options.manual = true`,则 `refreshDeps`, `refreshDepsAction` 都不再生效,需要通过 `run/runAsync` 手动触发请求。 diff --git a/packages/hooks/src/useRequest/doc/refreshOnWindowFocus/demo/refreshOnWindowFocus.tsx b/packages/hooks/src/useRequest/doc/refreshOnWindowFocus/demo/refreshOnWindowFocus.tsx index 06f3d78f76..467bcea197 100644 --- a/packages/hooks/src/useRequest/doc/refreshOnWindowFocus/demo/refreshOnWindowFocus.tsx +++ b/packages/hooks/src/useRequest/doc/refreshOnWindowFocus/demo/refreshOnWindowFocus.tsx @@ -1,5 +1,4 @@ import Mock from 'mockjs'; -import React from 'react'; import { useRequest } from 'ahooks'; function getUsername() { @@ -15,5 +14,5 @@ export default () => { refreshOnWindowFocus: true, }); - return
Username: {loading ? 'Loading' : data}
; + return
Username: {loading ? 'Loading' : String(data)}
; }; diff --git a/packages/hooks/src/useRequest/doc/retry/demo/retry.tsx b/packages/hooks/src/useRequest/doc/retry/demo/retry.tsx index aa87ce9308..126367a756 100644 --- a/packages/hooks/src/useRequest/doc/retry/demo/retry.tsx +++ b/packages/hooks/src/useRequest/doc/retry/demo/retry.tsx @@ -1,5 +1,5 @@ import { useRequest } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { message } from 'antd'; function editUsername(username: string) { diff --git a/packages/hooks/src/useRequest/doc/throttle/demo/throttle.tsx b/packages/hooks/src/useRequest/doc/throttle/demo/throttle.tsx index d048f10f0a..8625660761 100644 --- a/packages/hooks/src/useRequest/doc/throttle/demo/throttle.tsx +++ b/packages/hooks/src/useRequest/doc/throttle/demo/throttle.tsx @@ -1,7 +1,5 @@ import { useRequest } from 'ahooks'; import Mock from 'mockjs'; -import React from 'react'; - async function getEmail(search?: string): Promise { console.log('throttle getEmail', search); return new Promise((resolve) => { diff --git a/packages/hooks/src/useRequest/src/Fetch.ts b/packages/hooks/src/useRequest/src/Fetch.ts index 73ceee6004..6b7cac0fa1 100644 --- a/packages/hooks/src/useRequest/src/Fetch.ts +++ b/packages/hooks/src/useRequest/src/Fetch.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-parameter-properties */ +import type { RefObject } from 'react'; import { isFunction } from '../../utils'; -import type { MutableRefObject } from 'react'; import type { FetchState, Options, PluginReturn, Service, Subscribe } from './types'; export default class Fetch { - pluginImpls: PluginReturn[]; + pluginImpls: PluginReturn[] = []; count: number = 0; @@ -16,7 +16,7 @@ export default class Fetch { }; constructor( - public serviceRef: MutableRefObject>, + public serviceRef: RefObject>, public options: Options, public subscribe: Subscribe, public initState: Partial> = {}, @@ -54,7 +54,7 @@ export default class Fetch { // stop request if (stopNow) { - return new Promise(() => {}); + return Promise.resolve(state.data); } this.setState({ @@ -110,14 +110,14 @@ export default class Fetch { } this.setState({ - error, + error: error as Error | undefined, loading: false, }); - this.options.onError?.(error, params); + this.options.onError?.(error as Error, params); this.runPluginHandler('onError', error, params); - this.options.onFinally?.(params, undefined, error); + this.options.onFinally?.(params, undefined, error as Error | undefined); if (currentCount === this.count) { this.runPluginHandler('onFinally', params, undefined, error); diff --git a/packages/hooks/src/useRequest/src/plugins/useAutoRunPlugin.ts b/packages/hooks/src/useRequest/src/plugins/useAutoRunPlugin.ts index 7f852d7ca8..e594b9a053 100644 --- a/packages/hooks/src/useRequest/src/plugins/useAutoRunPlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useAutoRunPlugin.ts @@ -7,7 +7,7 @@ const useAutoRunPlugin: Plugin = ( fetchInstance, { manual, ready = true, defaultParams = [], refreshDeps = [], refreshDepsAction }, ) => { - const hasAutoRun = useRef(false); + const hasAutoRun = useRef(false); hasAutoRun.current = false; useUpdateEffect(() => { diff --git a/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts b/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts index fd14eb0501..ba6aa88619 100644 --- a/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useCachePlugin.ts @@ -2,10 +2,10 @@ import { useRef } from 'react'; import useCreation from '../../../useCreation'; import useUnmount from '../../../useUnmount'; import type { Plugin } from '../types'; -import * as cache from '../utils/cache'; +import { setCache, getCache } from '../utils/cache'; import type { CachedData } from '../utils/cache'; -import * as cachePromise from '../utils/cachePromise'; -import * as cacheSubscribe from '../utils/cacheSubscribe'; +import { setCachePromise, getCachePromise } from '../utils/cachePromise'; +import { trigger, subscribe } from '../utils/cacheSubscribe'; const useCachePlugin: Plugin = ( fetchInstance, @@ -17,24 +17,24 @@ const useCachePlugin: Plugin = ( getCache: customGetCache, }, ) => { - const unSubscribeRef = useRef<() => void>(); + const unSubscribeRef = useRef<() => void>(undefined); - const currentPromiseRef = useRef>(); + const currentPromiseRef = useRef>(undefined); const _setCache = (key: string, cachedData: CachedData) => { if (customSetCache) { customSetCache(cachedData); } else { - cache.setCache(key, cacheTime, cachedData); + setCache(key, cacheTime, cachedData); } - cacheSubscribe.trigger(key, cachedData.data); + trigger(key, cachedData.data); }; const _getCache = (key: string, params: any[] = []) => { if (customGetCache) { return customGetCache(params); } - return cache.getCache(key); + return getCache(key); }; useCreation(() => { @@ -47,13 +47,13 @@ const useCachePlugin: Plugin = ( if (cacheData && Object.hasOwnProperty.call(cacheData, 'data')) { fetchInstance.state.data = cacheData.data; fetchInstance.state.params = cacheData.params; - if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) { + if (staleTime === -1 || Date.now() - cacheData.time <= staleTime) { fetchInstance.state.loading = false; } } // subscribe same cachekey update, trigger update - unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, (data) => { + unSubscribeRef.current = subscribe(cacheKey, (data) => { fetchInstance.setState({ data }); }); }, []); @@ -75,7 +75,7 @@ const useCachePlugin: Plugin = ( } // If the data is fresh, stop request - if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) { + if (staleTime === -1 || Date.now() - cacheData.time <= staleTime) { return { loading: false, data: cacheData?.data, @@ -91,7 +91,7 @@ const useCachePlugin: Plugin = ( } }, onRequest: (service, args) => { - let servicePromise = cachePromise.getCachePromise(cacheKey); + let servicePromise = getCachePromise(cacheKey); // If has servicePromise, and is not trigger by self, then use it if (servicePromise && servicePromise !== currentPromiseRef.current) { @@ -100,7 +100,7 @@ const useCachePlugin: Plugin = ( servicePromise = service(...args); currentPromiseRef.current = servicePromise; - cachePromise.setCachePromise(cacheKey, servicePromise); + setCachePromise(cacheKey, servicePromise); return { servicePromise }; }, onSuccess: (data, params) => { @@ -110,10 +110,10 @@ const useCachePlugin: Plugin = ( _setCache(cacheKey, { data, params, - time: new Date().getTime(), + time: Date.now(), }); // resubscribe - unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, (d) => { + unSubscribeRef.current = subscribe(cacheKey, (d) => { fetchInstance.setState({ data: d }); }); } @@ -125,10 +125,10 @@ const useCachePlugin: Plugin = ( _setCache(cacheKey, { data, params: fetchInstance.state.params, - time: new Date().getTime(), + time: Date.now(), }); // resubscribe - unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, (d) => { + unSubscribeRef.current = subscribe(cacheKey, (d) => { fetchInstance.setState({ data: d }); }); } diff --git a/packages/hooks/src/useRequest/src/plugins/useDebouncePlugin.ts b/packages/hooks/src/useRequest/src/plugins/useDebouncePlugin.ts index 84c548d287..facf01deaf 100644 --- a/packages/hooks/src/useRequest/src/plugins/useDebouncePlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useDebouncePlugin.ts @@ -7,7 +7,7 @@ const useDebouncePlugin: Plugin = ( fetchInstance, { debounceWait, debounceLeading, debounceTrailing, debounceMaxWait }, ) => { - const debouncedRef = useRef>(); + const debouncedRef = useRef>(undefined); const options = useMemo(() => { const ret: DebounceSettings = {}; @@ -28,7 +28,7 @@ const useDebouncePlugin: Plugin = ( const _originRunAsync = fetchInstance.runAsync.bind(fetchInstance); debouncedRef.current = debounce( - (callback) => { + (callback: (...args: any[]) => void) => { callback(); }, debounceWait, @@ -38,7 +38,7 @@ const useDebouncePlugin: Plugin = ( // debounce runAsync should be promise // https://github.com/lodash/lodash/issues/4400#issuecomment-834800398 fetchInstance.runAsync = (...args) => { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { debouncedRef.current?.(() => { _originRunAsync(...args) .then(resolve) diff --git a/packages/hooks/src/useRequest/src/plugins/useLoadingDelayPlugin.ts b/packages/hooks/src/useRequest/src/plugins/useLoadingDelayPlugin.ts index 37c5184f3d..734aa0d58a 100644 --- a/packages/hooks/src/useRequest/src/plugins/useLoadingDelayPlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useLoadingDelayPlugin.ts @@ -1,8 +1,8 @@ import { useRef } from 'react'; import type { Plugin, Timeout } from '../types'; -const useLoadingDelayPlugin: Plugin = (fetchInstance, { loadingDelay }) => { - const timerRef = useRef(); +const useLoadingDelayPlugin: Plugin = (fetchInstance, { loadingDelay, ready }) => { + const timerRef = useRef(undefined); if (!loadingDelay) { return {}; @@ -18,11 +18,16 @@ const useLoadingDelayPlugin: Plugin = (fetchInstance, { loadingDelay onBefore: () => { cancelTimeout(); - timerRef.current = setTimeout(() => { - fetchInstance.setState({ - loading: true, - }); - }, loadingDelay); + // Two cases: + // 1. ready === undefined + // 2. ready === true + if (ready !== false) { + timerRef.current = setTimeout(() => { + fetchInstance.setState({ + loading: true, + }); + }, loadingDelay); + } return { loading: false, diff --git a/packages/hooks/src/useRequest/src/plugins/usePollingPlugin.ts b/packages/hooks/src/useRequest/src/plugins/usePollingPlugin.ts index bf9a30b47c..53e71f14a9 100644 --- a/packages/hooks/src/useRequest/src/plugins/usePollingPlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/usePollingPlugin.ts @@ -8,8 +8,8 @@ const usePollingPlugin: Plugin = ( fetchInstance, { pollingInterval, pollingWhenHidden = true, pollingErrorRetryCount = -1 }, ) => { - const timerRef = useRef(); - const unsubscribeRef = useRef<() => void>(); + const timerRef = useRef(undefined); + const unsubscribeRef = useRef<() => void>(undefined); const countRef = useRef(0); const stopPolling = () => { diff --git a/packages/hooks/src/useRequest/src/plugins/useRefreshOnWindowFocusPlugin.ts b/packages/hooks/src/useRequest/src/plugins/useRefreshOnWindowFocusPlugin.ts index 70b289c901..69c2c3d76c 100644 --- a/packages/hooks/src/useRequest/src/plugins/useRefreshOnWindowFocusPlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useRefreshOnWindowFocusPlugin.ts @@ -8,7 +8,7 @@ const useRefreshOnWindowFocusPlugin: Plugin = ( fetchInstance, { refreshOnWindowFocus, focusTimespan = 5000 }, ) => { - const unsubscribeRef = useRef<() => void>(); + const unsubscribeRef = useRef<() => void>(undefined); const stopSubscribe = () => { unsubscribeRef.current?.(); diff --git a/packages/hooks/src/useRequest/src/plugins/useRetryPlugin.ts b/packages/hooks/src/useRequest/src/plugins/useRetryPlugin.ts index 6c602892ab..16ac5f36d4 100644 --- a/packages/hooks/src/useRequest/src/plugins/useRetryPlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useRetryPlugin.ts @@ -1,9 +1,9 @@ import { useRef } from 'react'; -import type { Plugin, Timeout } from '../types'; +import type { Plugin } from '../types'; const useRetryPlugin: Plugin = (fetchInstance, { retryInterval, retryCount }) => { - const timerRef = useRef(); - const countRef = useRef(0); + const timerRef = useRef>(undefined); + const countRef = useRef(0); const triggerByRetry = useRef(false); diff --git a/packages/hooks/src/useRequest/src/plugins/useThrottlePlugin.ts b/packages/hooks/src/useRequest/src/plugins/useThrottlePlugin.ts index 955c331d41..085492e4d9 100644 --- a/packages/hooks/src/useRequest/src/plugins/useThrottlePlugin.ts +++ b/packages/hooks/src/useRequest/src/plugins/useThrottlePlugin.ts @@ -7,9 +7,10 @@ const useThrottlePlugin: Plugin = ( fetchInstance, { throttleWait, throttleLeading, throttleTrailing }, ) => { - const throttledRef = useRef>(); + const throttledRef = useRef>(undefined); const options: ThrottleSettings = {}; + if (throttleLeading !== undefined) { options.leading = throttleLeading; } diff --git a/packages/hooks/src/useRequest/src/types.ts b/packages/hooks/src/useRequest/src/types.ts index 442a2dff73..2e0eabd372 100644 --- a/packages/hooks/src/useRequest/src/types.ts +++ b/packages/hooks/src/useRequest/src/types.ts @@ -94,10 +94,10 @@ export interface Options { } export type Plugin = { - (fetchInstance: Fetch, options: Options): PluginReturn< - TData, - TParams - >; + ( + fetchInstance: Fetch, + options: Options, + ): PluginReturn; onInit?: (options: Options) => Partial>; }; diff --git a/packages/hooks/src/useRequest/src/useRequest.ts b/packages/hooks/src/useRequest/src/useRequest.ts index 2bf43716d7..07804b0bd7 100644 --- a/packages/hooks/src/useRequest/src/useRequest.ts +++ b/packages/hooks/src/useRequest/src/useRequest.ts @@ -6,9 +6,15 @@ import usePollingPlugin from './plugins/usePollingPlugin'; import useRefreshOnWindowFocusPlugin from './plugins/useRefreshOnWindowFocusPlugin'; import useRetryPlugin from './plugins/useRetryPlugin'; import useThrottlePlugin from './plugins/useThrottlePlugin'; -import type { Options, Plugin, Service } from './types'; +import type { Options, Plugin, Result, Service } from './types'; import useRequestImplement from './useRequestImplement'; +type AnyService = (...args: any[]) => Promise; + +type InferData = Awaited>; + +type InferParams = Parameters; + // function useRequest( // service: Service, // options: OptionsWithFormat, @@ -19,6 +25,18 @@ import useRequestImplement from './useRequestImplement'; // options?: OptionsWithoutFormat, // plugins?: Plugin[], // ): Result +function useRequest( + service: TService, + options?: Options, InferParams>, + plugins?: Plugin, InferParams>[], +): Result, InferParams>; + +function useRequest( + service: Service, + options?: Options, + plugins?: Plugin[], +): Result; + function useRequest( service: Service, options?: Options, diff --git a/packages/hooks/src/useRequest/src/useRequestImplement.ts b/packages/hooks/src/useRequest/src/useRequestImplement.ts index 12dc931cda..d65cfba6cb 100644 --- a/packages/hooks/src/useRequest/src/useRequestImplement.ts +++ b/packages/hooks/src/useRequest/src/useRequestImplement.ts @@ -4,6 +4,7 @@ import useMemoizedFn from '../../useMemoizedFn'; import useMount from '../../useMount'; import useUnmount from '../../useUnmount'; import useUpdate from '../../useUpdate'; +import isDev from '../../utils/isDev'; import Fetch from './Fetch'; import type { Options, Plugin, Result, Service } from './types'; @@ -13,10 +14,17 @@ function useRequestImplement( options: Options = {}, plugins: Plugin[] = [], ) { - const { manual = false, ...rest } = options; + const { manual = false, ready = true, ...rest } = options; + + if (isDev) { + if (options.defaultParams && !Array.isArray(options.defaultParams)) { + console.warn(`expected defaultParams is array, got ${typeof options.defaultParams}`); + } + } const fetchOptions = { manual, + ready, ...rest, }; @@ -39,7 +47,7 @@ function useRequestImplement( fetchInstance.pluginImpls = plugins.map((p) => p(fetchInstance, fetchOptions)); useMount(() => { - if (!manual) { + if (!manual && ready) { // useCachePlugin can set fetchInstance.state.params from cache when init const params = fetchInstance.state.params || options.defaultParams || []; // @ts-ignore diff --git a/packages/hooks/src/useRequest/src/utils/isOnline.ts b/packages/hooks/src/useRequest/src/utils/isOnline.ts index c051f29a7f..06d0b15fe5 100644 --- a/packages/hooks/src/useRequest/src/utils/isOnline.ts +++ b/packages/hooks/src/useRequest/src/utils/isOnline.ts @@ -1,8 +1,10 @@ import isBrowser from '../../../utils/isBrowser'; -export default function isOnline(): boolean { +const isOnline = () => { if (isBrowser && typeof navigator.onLine !== 'undefined') { return navigator.onLine; } return true; -} +}; + +export default isOnline; diff --git a/packages/hooks/src/useRequest/src/utils/subscribeFocus.ts b/packages/hooks/src/useRequest/src/utils/subscribeFocus.ts index 99ac17b609..b1d7f1e593 100644 --- a/packages/hooks/src/useRequest/src/utils/subscribeFocus.ts +++ b/packages/hooks/src/useRequest/src/utils/subscribeFocus.ts @@ -5,25 +5,19 @@ import isOnline from './isOnline'; type Listener = () => void; -const listeners: Listener[] = []; +const listeners = new Set(); function subscribe(listener: Listener) { - listeners.push(listener); + listeners.add(listener); return function unsubscribe() { - const index = listeners.indexOf(listener); - if (index > -1) { - listeners.splice(index, 1); - } + listeners.has(listener) && listeners.delete(listener); }; } if (isBrowser) { const revalidate = () => { if (!isDocumentVisible() || !isOnline()) return; - for (let i = 0; i < listeners.length; i++) { - const listener = listeners[i]; - listener(); - } + listeners.forEach((listener) => listener()); }; window.addEventListener('visibilitychange', revalidate, false); window.addEventListener('focus', revalidate, false); diff --git a/packages/hooks/src/useRequest/src/utils/subscribeReVisible.ts b/packages/hooks/src/useRequest/src/utils/subscribeReVisible.ts index aae3d31728..855c75f10f 100644 --- a/packages/hooks/src/useRequest/src/utils/subscribeReVisible.ts +++ b/packages/hooks/src/useRequest/src/utils/subscribeReVisible.ts @@ -3,23 +3,19 @@ import isDocumentVisible from './isDocumentVisible'; type Listener = () => void; -const listeners: Listener[] = []; +const listeners = new Set(); function subscribe(listener: Listener) { - listeners.push(listener); + listeners.add(listener); return function unsubscribe() { - const index = listeners.indexOf(listener); - listeners.splice(index, 1); + listeners.has(listener) && listeners.delete(listener); }; } if (isBrowser) { const revalidate = () => { if (!isDocumentVisible()) return; - for (let i = 0; i < listeners.length; i++) { - const listener = listeners[i]; - listener(); - } + listeners.forEach((listener) => listener()); }; window.addEventListener('visibilitychange', revalidate, false); } diff --git a/packages/hooks/src/useResetState/__tests__/index.spec.ts b/packages/hooks/src/useResetState/__tests__/index.spec.ts new file mode 100644 index 0000000000..3e0e5b9736 --- /dev/null +++ b/packages/hooks/src/useResetState/__tests__/index.spec.ts @@ -0,0 +1,94 @@ +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import useResetState from '../index'; + +describe('useResetState', () => { + const setUp = (initialValue: S | (() => S)) => + renderHook(() => { + const [state, setState, resetState] = useResetState(initialValue); + + return { + state, + setState, + resetState, + } as const; + }); + + test('should support initialValue', () => { + const hook = setUp({ + hello: 'world', + }); + expect(hook.result.current.state).toEqual({ hello: 'world' }); + }); + + test('should support functional initialValue', () => { + const hook = setUp(() => ({ + hello: 'world', + })); + expect(hook.result.current.state).toEqual({ hello: 'world' }); + }); + + test('should reset state', () => { + const hook = setUp({ + hello: '', + count: 0, + }); + + act(() => { + hook.result.current.setState({ + hello: 'world', + count: 1, + }); + }); + + act(() => { + hook.result.current.resetState(); + }); + + expect(hook.result.current.state).toEqual({ hello: '', count: 0 }); + }); + + test('should support function update', () => { + const hook = setUp({ + count: 0, + }); + act(() => { + hook.result.current.setState((prev) => ({ count: prev.count + 1 })); + }); + expect(hook.result.current.state).toEqual({ count: 1 }); + }); + + test('should keep random initial state', () => { + const random = Math.random(); + const hook = setUp({ + count: random, + }); + + act(() => { + hook.result.current.setState({ count: Math.random() }); + }); + + act(() => { + hook.result.current.resetState(); + }); + + expect(hook.result.current.state).toEqual({ count: random }); + }); + + test('should support random functional initialValue', () => { + const random = Math.random(); + const hook = setUp(() => ({ + count: random, + })); + + act(() => { + hook.result.current.setState({ count: Math.random() }); + }); + + act(() => { + hook.result.current.resetState(); + }); + + expect(hook.result.current.state).toEqual({ count: random }); + }); +}); diff --git a/packages/hooks/src/useResetState/__tests__/index.test.ts b/packages/hooks/src/useResetState/__tests__/index.test.ts deleted file mode 100644 index 5894e10c80..0000000000 --- a/packages/hooks/src/useResetState/__tests__/index.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useResetState from '../index'; - -describe('useResetState', () => { - const setUp = (initialState: S) => - renderHook(() => { - const [state, setState, resetState] = useResetState(initialState); - - return { - state, - setState, - resetState, - } as const; - }); - - it('should support initialValue', () => { - const hook = setUp({ - hello: 'world', - }); - expect(hook.result.current.state).toEqual({ hello: 'world' }); - }); - - it('should reset state', () => { - const hook = setUp({ - hello: '', - count: 0, - }); - - act(() => { - hook.result.current.setState({ - hello: 'world', - count: 1, - }); - }); - - act(() => { - hook.result.current.resetState(); - }); - - expect(hook.result.current.state).toEqual({ hello: '', count: 0 }); - }); - - it('should support function update', () => { - const hook = setUp({ - count: 0, - }); - act(() => { - hook.result.current.setState((prev) => ({ count: prev.count + 1 })); - }); - expect(hook.result.current.state).toEqual({ count: 1 }); - }); -}); diff --git a/packages/hooks/src/useResetState/demo/demo1.tsx b/packages/hooks/src/useResetState/demo/demo1.tsx index 5a98c7f876..5212ae0df3 100644 --- a/packages/hooks/src/useResetState/demo/demo1.tsx +++ b/packages/hooks/src/useResetState/demo/demo1.tsx @@ -1,33 +1,37 @@ -import React from 'react'; +import { useMemo } from 'react'; +import { Button, Space } from 'antd'; import { useResetState } from 'ahooks'; -interface State { - hello: string; - count: number; -} - export default () => { - const [state, setState, resetState] = useResetState({ + const initialValue = { hello: '', - count: 0, - }); + value: Math.random(), + }; + const initialValueMemo = useMemo(() => { + return initialValue; + }, []); + + const [state, setState, resetState] = useResetState(initialValue); return (
+
initial state:
+
{JSON.stringify(initialValueMemo, null, 2)}
+
current state:
{JSON.stringify(state, null, 2)}
-

- - - -

+ set hello and value + + +
); }; diff --git a/packages/hooks/src/useResetState/index.ts b/packages/hooks/src/useResetState/index.ts index bcff86c842..eaa7d6000e 100644 --- a/packages/hooks/src/useResetState/index.ts +++ b/packages/hooks/src/useResetState/index.ts @@ -1,16 +1,25 @@ -import { useState } from 'react'; +import { useRef, useState } from 'react'; import type { Dispatch, SetStateAction } from 'react'; +import { isFunction } from '../utils'; import useMemoizedFn from '../useMemoizedFn'; +import useCreation from '../useCreation'; type ResetState = () => void; const useResetState = ( initialState: S | (() => S), ): [S, Dispatch>, ResetState] => { - const [state, setState] = useState(initialState); + const initialStateRef = useRef(initialState); + const initialStateMemo = useCreation( + () => + isFunction(initialStateRef.current) ? initialStateRef.current() : initialStateRef.current, + [], + ); + + const [state, setState] = useState(initialStateMemo); const resetState = useMemoizedFn(() => { - setState(initialState); + setState(initialStateMemo); }); return [state, setState, resetState]; diff --git a/packages/hooks/src/useResponsive/__tests__/__snapshots__/index.spec.ts.snap b/packages/hooks/src/useResponsive/__tests__/__snapshots__/index.spec.ts.snap new file mode 100644 index 0000000000..71fc9575ed --- /dev/null +++ b/packages/hooks/src/useResponsive/__tests__/__snapshots__/index.spec.ts.snap @@ -0,0 +1,121 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`useResponsive > should response to window width changes 1`] = ` +{ + "lg": true, + "md": true, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive > should response to window width changes 2`] = ` +{ + "lg": false, + "md": false, + "sm": false, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive > should response to window width changes 3`] = ` +{ + "lg": false, + "md": false, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive > should response to window width changes 4`] = ` +{ + "lg": false, + "md": true, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive > should response to window width changes 5`] = ` +{ + "lg": true, + "md": true, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive > should response to window width changes 6`] = ` +{ + "lg": true, + "md": true, + "sm": true, + "xl": true, + "xs": true, +} +`; + +exports[`useResponsive should response to window width changes 1`] = ` +{ + "lg": true, + "md": true, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive should response to window width changes 2`] = ` +{ + "lg": false, + "md": false, + "sm": false, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive should response to window width changes 3`] = ` +{ + "lg": false, + "md": false, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive should response to window width changes 4`] = ` +{ + "lg": false, + "md": true, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive should response to window width changes 5`] = ` +{ + "lg": true, + "md": true, + "sm": true, + "xl": false, + "xs": true, +} +`; + +exports[`useResponsive should response to window width changes 6`] = ` +{ + "lg": true, + "md": true, + "sm": true, + "xl": true, + "xs": true, +} +`; diff --git a/packages/hooks/src/useResponsive/__tests__/__snapshots__/index.test.ts.snap b/packages/hooks/src/useResponsive/__tests__/__snapshots__/index.test.ts.snap deleted file mode 100644 index 2122337981..0000000000 --- a/packages/hooks/src/useResponsive/__tests__/__snapshots__/index.test.ts.snap +++ /dev/null @@ -1,61 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`useResponsive should response to window width changes 1`] = ` -Object { - "lg": true, - "md": true, - "sm": true, - "xl": false, - "xs": true, -} -`; - -exports[`useResponsive should response to window width changes 2`] = ` -Object { - "lg": false, - "md": false, - "sm": false, - "xl": false, - "xs": true, -} -`; - -exports[`useResponsive should response to window width changes 3`] = ` -Object { - "lg": false, - "md": false, - "sm": true, - "xl": false, - "xs": true, -} -`; - -exports[`useResponsive should response to window width changes 4`] = ` -Object { - "lg": false, - "md": true, - "sm": true, - "xl": false, - "xs": true, -} -`; - -exports[`useResponsive should response to window width changes 5`] = ` -Object { - "lg": true, - "md": true, - "sm": true, - "xl": false, - "xs": true, -} -`; - -exports[`useResponsive should response to window width changes 6`] = ` -Object { - "lg": true, - "md": true, - "sm": true, - "xl": true, - "xs": true, -} -`; diff --git a/packages/hooks/src/useResponsive/__tests__/index.test.ts b/packages/hooks/src/useResponsive/__tests__/index.spec.ts similarity index 78% rename from packages/hooks/src/useResponsive/__tests__/index.test.ts rename to packages/hooks/src/useResponsive/__tests__/index.spec.ts index 1ada835191..834e400c7f 100644 --- a/packages/hooks/src/useResponsive/__tests__/index.test.ts +++ b/packages/hooks/src/useResponsive/__tests__/index.spec.ts @@ -1,5 +1,6 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import { useResponsive } from '../'; +import { describe, expect, test } from 'vitest'; +import { act, renderHook } from '../../utils/tests'; +import useResponsive from '../'; describe('useResponsive', () => { function changeWidth(width: number) { @@ -12,7 +13,7 @@ describe('useResponsive', () => { const hook = renderHook(() => useResponsive()); - it('should response to window width changes', () => { + test('should response to window width changes', () => { expect(hook.result.current).toMatchSnapshot(); changeWidth(300); expect(hook.result.current).toMatchSnapshot(); diff --git a/packages/hooks/src/useResponsive/demo/demo1.tsx b/packages/hooks/src/useResponsive/demo/demo1.tsx index 64a9655668..eb44eccf0a 100644 --- a/packages/hooks/src/useResponsive/demo/demo1.tsx +++ b/packages/hooks/src/useResponsive/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 在组件中调用 useResponsive 可以获取并订阅浏览器窗口的响应式信息。 */ -import React from 'react'; import { configResponsive, useResponsive } from 'ahooks'; configResponsive({ diff --git a/packages/hooks/src/useResponsive/index.ts b/packages/hooks/src/useResponsive/index.ts index 7b508e4123..ad045d11f1 100644 --- a/packages/hooks/src/useResponsive/index.ts +++ b/packages/hooks/src/useResponsive/index.ts @@ -21,7 +21,9 @@ let responsiveConfig: ResponsiveConfig = { function handleResize() { const oldInfo = info; calculate(); - if (oldInfo === info) return; + if (oldInfo === info) { + return; + } for (const subscriber of subscribers) { subscriber(); } @@ -49,7 +51,7 @@ export function configResponsive(config: ResponsiveConfig) { if (info) calculate(); } -export function useResponsive() { +function useResponsive() { if (isBrowser && !listening) { info = {}; calculate(); @@ -59,11 +61,20 @@ export function useResponsive() { const [state, setState] = useState(info); useEffect(() => { - if (!isBrowser) return; + if (!isBrowser) { + return; + } + + // In React 18's StrictMode, useEffect perform twice, resize listener is remove, so handleResize is never perform. + // https://github.com/alibaba/hooks/issues/1910 + if (!listening) { + window.addEventListener('resize', handleResize); + } const subscriber = () => { setState(info); }; + subscribers.add(subscriber); return () => { subscribers.delete(subscriber); @@ -76,3 +87,5 @@ export function useResponsive() { return state; } + +export default useResponsive; diff --git a/packages/hooks/src/useSafeState/__tests__/index.test.ts b/packages/hooks/src/useSafeState/__tests__/index.spec.ts similarity index 59% rename from packages/hooks/src/useSafeState/__tests__/index.test.ts rename to packages/hooks/src/useSafeState/__tests__/index.spec.ts index 5484a9864d..0ff4afd99d 100644 --- a/packages/hooks/src/useSafeState/__tests__/index.test.ts +++ b/packages/hooks/src/useSafeState/__tests__/index.spec.ts @@ -1,8 +1,9 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useSafeState from '../index'; describe('useSetState', () => { - const setUp = (initialValue: any) => + const setUp = (initialValue: S | (() => S)) => renderHook(() => { const [state, setState] = useSafeState(initialValue); return { @@ -11,27 +12,27 @@ describe('useSetState', () => { } as const; }); - it('should support initialValue', () => { + test('should support initialValue', () => { const hook = setUp({ hello: 'world', }); expect(hook.result.current.state).toEqual({ hello: 'world' }); }); - it('should support update', () => { + test('should support update', () => { const hook = setUp(0); act(() => { hook.result.current.setState(5); }); - expect(hook.result.current.state).toEqual(5); + expect(hook.result.current.state).toBe(5); }); - it('should not support update when unmount', () => { + test('should not support update when unmount', () => { const hook = setUp(0); hook.unmount(); act(() => { hook.result.current.setState(5); }); - expect(hook.result.current.state).toEqual(0); + expect(hook.result.current.state).toBe(0); }); }); diff --git a/packages/hooks/src/useSafeState/demo/demo1.tsx b/packages/hooks/src/useSafeState/demo/demo1.tsx index 887fde431f..9cfabc4047 100644 --- a/packages/hooks/src/useSafeState/demo/demo1.tsx +++ b/packages/hooks/src/useSafeState/demo/demo1.tsx @@ -1,5 +1,5 @@ import { useSafeState } from 'ahooks'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; const Child = () => { const [value, setValue] = useSafeState(); diff --git a/packages/hooks/src/useSafeState/index.ts b/packages/hooks/src/useSafeState/index.ts index cc04af3e4f..e4125ad9ca 100644 --- a/packages/hooks/src/useSafeState/index.ts +++ b/packages/hooks/src/useSafeState/index.ts @@ -9,9 +9,11 @@ function useSafeState(): [S | undefined, Dispatch< function useSafeState(initialState?: S | (() => S)) { const unmountedRef = useUnmountedRef(); const [state, setState] = useState(initialState); - const setCurrentState = useCallback((currentState) => { + const setCurrentState = useCallback((currentState: S) => { /** if component is unmounted, stop update */ - if (unmountedRef.current) return; + if (unmountedRef.current) { + return; + } setState(currentState); }, []); diff --git a/packages/hooks/src/useScroll/__tests__/index.spec.ts b/packages/hooks/src/useScroll/__tests__/index.spec.ts new file mode 100644 index 0000000000..5ebde4b1b4 --- /dev/null +++ b/packages/hooks/src/useScroll/__tests__/index.spec.ts @@ -0,0 +1,10 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import useScroll from '../index'; + +describe('useScroll', () => { + test('document body', () => { + const hook = renderHook(() => useScroll(document)); + expect(hook.result.current).toBeUndefined(); + }); +}); diff --git a/packages/hooks/src/useScroll/__tests__/index.test.ts b/packages/hooks/src/useScroll/__tests__/index.test.ts deleted file mode 100644 index 2a19cdeb80..0000000000 --- a/packages/hooks/src/useScroll/__tests__/index.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useScroll from '../index'; - -describe('useScroll', () => { - it('document body', () => { - const hook = renderHook(() => useScroll(document)); - expect(hook.result.current).toEqual(undefined); - }); -}); diff --git a/packages/hooks/src/useScroll/demo/demo1.tsx b/packages/hooks/src/useScroll/demo/demo1.tsx index d0fa08bd89..750848c0b6 100644 --- a/packages/hooks/src/useScroll/demo/demo1.tsx +++ b/packages/hooks/src/useScroll/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 尝试滚动一下文字内容。 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useScroll } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useScroll/demo/demo2.tsx b/packages/hooks/src/useScroll/demo/demo2.tsx index 605913b142..7d3e4aceec 100644 --- a/packages/hooks/src/useScroll/demo/demo2.tsx +++ b/packages/hooks/src/useScroll/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 尝试滚动一下页面。 */ -import React from 'react'; import { useScroll } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useScroll/demo/demo3.tsx b/packages/hooks/src/useScroll/demo/demo3.tsx index e0e5174d0b..35e5a7632e 100644 --- a/packages/hooks/src/useScroll/demo/demo3.tsx +++ b/packages/hooks/src/useScroll/demo/demo3.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 在垂直方向 100px 到 200px 的滚动范围内监听 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useScroll } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useScroll/index.en-US.md b/packages/hooks/src/useScroll/index.en-US.md index d583b1d357..ed85bfbd58 100644 --- a/packages/hooks/src/useScroll/index.en-US.md +++ b/packages/hooks/src/useScroll/index.en-US.md @@ -29,10 +29,10 @@ const position = useScroll(target, shouldUpdate); ### Params -| Property | Description | Type | Default | -| ------------ | ------------------------- | --------------------------------------------------------------------------- | ---------- | -| target | DOM element or ref object | `Element` \| `Document` \| `(() => Element)` \| `MutableRefObject` | `document` | -| shouldUpdate | Whether update position | `({ top: number, left: number }) => boolean` | `-` | +| Property | Description | Type | Default | +| ------------ | ------------------------- | --------------------------------------------------------------------------- | ------------ | +| target | DOM element or ref object | `Element` \| `Document` \| `(() => Element)` \| `MutableRefObject` | `document` | +| shouldUpdate | Whether update position | `({ top: number, left: number }) => boolean` | `() => true` | ### Result diff --git a/packages/hooks/src/useScroll/index.zh-CN.md b/packages/hooks/src/useScroll/index.zh-CN.md index 4f0109ce25..a8fbf78698 100644 --- a/packages/hooks/src/useScroll/index.zh-CN.md +++ b/packages/hooks/src/useScroll/index.zh-CN.md @@ -29,10 +29,10 @@ const position = useScroll(target, shouldUpdate); ### Params -| 参数 | 说明 | 类型 | 默认值 | -| ------------ | -------------------- | --------------------------------------------------------------------------- | ---------- | -| target | DOM 节点或者 ref | `Element` \| `Document` \| `(() => Element)` \| `MutableRefObject` | `document` | -| shouldUpdate | 控制是否更新滚动信息 | `({ top: number, left: number }) => boolean` | - | +| 参数 | 说明 | 类型 | 默认值 | +| ------------ | -------------------- | --------------------------------------------------------------------------- | ------------ | +| target | DOM 节点或者 ref | `Element` \| `Document` \| `(() => Element)` \| `MutableRefObject` | `document` | +| shouldUpdate | 控制是否更新滚动信息 | `({ top: number, left: number }) => boolean` | `() => true` | ### Result diff --git a/packages/hooks/src/useSelections/__tests__/index.spec.ts b/packages/hooks/src/useSelections/__tests__/index.spec.ts new file mode 100644 index 0000000000..43597dd955 --- /dev/null +++ b/packages/hooks/src/useSelections/__tests__/index.spec.ts @@ -0,0 +1,243 @@ +import { act, renderHook } from '@testing-library/react'; +import { useState } from 'react'; +import { describe, expect, test } from 'vitest'; +import type { Options } from '../index'; +import useSelections from '../index'; + +const _data = [1, 2, 3]; +const _selected = [1]; +const _selectedItem = 1; + +const _dataObj = [{ id: 1 }, { id: 2 }, { id: 3 }]; +const _selectedObj = [{ id: 1 }]; +const _selectedItemObj = { id: 1 }; + +const setup = (items: T[], options?: T[] | Options) => { + return renderHook(() => useSelections(items, options)); +}; + +type CaseCallback = (data: T[], selected: T[], selectedItem: T) => void; + +const runCaseCallback = ( + dataCallback: CaseCallback, + objDataCallback: CaseCallback, +) => { + dataCallback(_data, _selected, _selectedItem); + objDataCallback(_dataObj, _selectedObj, _selectedItemObj); +}; + +describe('useSelections', () => { + test('defaultSelected should work correct', () => { + const caseCallback: CaseCallback = (data, selected, selectedItem) => { + const { result } = setup(data, { + defaultSelected: selected, + itemKey: 'id', + }); + + expect(result.current.selected).toEqual(selected); + expect(result.current.isSelected(selectedItem)).toBe(true); + }; + + runCaseCallback(caseCallback, caseCallback); + }); + + test('select and unSelect should work correct', () => { + const caseCallback: CaseCallback = (data, selected, selectedItem) => { + const { result } = setup(data, { + defaultSelected: selected, + itemKey: 'id', + }); + const { unSelect, select } = result.current; + + act(() => { + unSelect(selectedItem); + }); + expect(result.current.selected).toEqual([]); + expect(result.current.isSelected(selectedItem)).toBe(false); + expect(result.current.allSelected).toBe(false); + + act(() => { + select(selectedItem); + }); + expect(result.current.selected).toEqual(selected); + expect(result.current.isSelected(selectedItem)).toBe(true); + expect(result.current.allSelected).toBe(false); + }; + + runCaseCallback(caseCallback, caseCallback); + }); + + test('toggle should work correct', () => { + const caseCallback: CaseCallback = (data, selected, selectedItem) => { + const { result } = setup(data, { + itemKey: 'id', + }); + const { toggle } = result.current; + + act(() => { + toggle(selectedItem); + }); + expect(result.current.selected).toEqual(selected); + expect(result.current.isSelected(selectedItem)).toBe(true); + expect(result.current.allSelected).toBe(false); + + act(() => { + toggle(selectedItem); + }); + expect(result.current.selected).toEqual([]); + expect(result.current.isSelected(selectedItem)).toBe(false); + expect(result.current.allSelected).toBe(false); + }; + + runCaseCallback(caseCallback, caseCallback); + }); + + test('selectAll and unSelectAll should work correct', async () => { + const caseCallback: CaseCallback = (data) => { + const { result } = setup(data, { + itemKey: 'id', + }); + const { selectAll, unSelectAll } = result.current; + + expect(result.current.noneSelected).toBe(true); + act(() => { + selectAll(); + }); + expect(result.current.selected).toEqual(data); + expect(result.current.allSelected).toBe(true); + expect(result.current.noneSelected).toBe(false); + expect(result.current.partiallySelected).toBe(false); + + act(() => { + unSelectAll(); + }); + expect(result.current.selected).toEqual([]); + expect(result.current.allSelected).toBe(false); + expect(result.current.noneSelected).toBe(true); + expect(result.current.partiallySelected).toBe(false); + }; + + runCaseCallback(caseCallback, caseCallback); + }); + + test('toggleAll should work correct', async () => { + const caseCallback: CaseCallback = (data) => { + const { result } = setup(data, { + itemKey: 'id', + }); + const { toggleAll } = result.current; + + expect(result.current.noneSelected).toBe(true); + act(() => { + toggleAll(); + }); + expect(result.current.selected).toEqual(data); + expect(result.current.allSelected).toBe(true); + expect(result.current.noneSelected).toBe(false); + expect(result.current.partiallySelected).toBe(false); + + act(() => { + toggleAll(); + }); + expect(result.current.selected).toEqual([]); + expect(result.current.allSelected).toBe(false); + expect(result.current.noneSelected).toBe(true); + expect(result.current.partiallySelected).toBe(false); + }; + + runCaseCallback(caseCallback, caseCallback); + }); + + test('setSelected should work correct', async () => { + const caseCallback: CaseCallback = (data, selected, selectedItem) => { + const { result } = setup(data, { + itemKey: 'id', + }); + const { setSelected } = result.current; + + expect(result.current.noneSelected).toBe(true); + act(() => { + setSelected(selected); + }); + expect(result.current.selected).toEqual(selected); + expect(result.current.isSelected(selectedItem)).toBe(true); + expect(result.current.noneSelected).toBe(false); + expect(result.current.allSelected).toBe(false); + expect(result.current.partiallySelected).toBe(true); + + act(() => { + setSelected([]); + }); + expect(result.current.selected).toEqual([]); + expect(result.current.isSelected(selectedItem)).toBe(false); + expect(result.current.noneSelected).toBe(true); + expect(result.current.allSelected).toBe(false); + expect(result.current.partiallySelected).toBe(false); + + act(() => { + setSelected(data); + }); + expect(result.current.selected).toEqual(data); + expect(result.current.isSelected(selectedItem)).toBe(true); + expect(result.current.noneSelected).toBe(false); + expect(result.current.allSelected).toBe(true); + expect(result.current.partiallySelected).toBe(false); + + // Keep compatible with older versions. + act(() => { + expect(() => setSelected(undefined!)).not.toThrowError(); + expect(() => setSelected(null!)).not.toThrowError(); + }); + }; + + runCaseCallback(caseCallback, caseCallback); + }); + + test('legacy parameter should work in <4.0', async () => { + const { result } = setup(_data, _selected); + + expect(result.current.selected).toEqual(_selected); + expect(result.current.isSelected(_selectedItem)).toBe(true); + }); + + test('clearAll should work correct', async () => { + const runCase = (data: any, newData: any, remainData: any) => { + const { result } = renderHook(() => { + const [list, setList] = useState(data); + const hook = useSelections(list, { + itemKey: 'id', + }); + + return { setList, hook }; + }); + const { setSelected, unSelectAll, clearAll } = result.current.hook; + + act(() => { + setSelected(data); + }); + expect(result.current.hook.selected).toEqual(data); + expect(result.current.hook.allSelected).toBe(true); + + act(() => { + result.current.setList(newData); + }); + expect(result.current.hook.allSelected).toBe(false); + + act(() => { + unSelectAll(); + }); + expect(result.current.hook.selected).toEqual(remainData); + + act(() => { + clearAll(); + }); + expect(result.current.hook.selected).toEqual([]); + expect(result.current.hook.allSelected).toEqual(false); + expect(result.current.hook.noneSelected).toBe(true); + expect(result.current.hook.partiallySelected).toBe(false); + }; + + runCase(_data, [3, 4, 5], [1, 2]); + runCase(_dataObj, [{ id: 3 }, { id: 4 }, { id: 5 }], [{ id: 1 }, { id: 2 }]); + }); +}); diff --git a/packages/hooks/src/useSelections/__tests__/index.test.ts b/packages/hooks/src/useSelections/__tests__/index.test.ts deleted file mode 100644 index 3ffd1856aa..0000000000 --- a/packages/hooks/src/useSelections/__tests__/index.test.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useSelections from '../index'; - -const data = [1, 2, 3]; - -const setup = (items: T[], defaultSelected?: T[]) => { - return renderHook(() => useSelections(items, defaultSelected)); -}; - -describe('useSelections', () => { - it('defaultSelected should work correct', () => { - const { result } = setup(data, [1]); - expect(result.current.selected).toEqual([1]); - expect(result.current.isSelected(1)).toEqual(true); - }); - - it('select and unSelect should work correct', () => { - const { result } = setup(data, [1]); - const { unSelect, select } = result.current; - act(() => { - unSelect(1); - }); - expect(result.current.selected).toEqual([]); - expect(result.current.isSelected(1)).toEqual(false); - expect(result.current.allSelected).toEqual(false); - act(() => { - select(1); - }); - expect(result.current.selected).toEqual([1]); - expect(result.current.isSelected(1)).toEqual(true); - expect(result.current.allSelected).toEqual(false); - }); - - it('toggle should work correct', () => { - const { result } = setup(data); - const { toggle } = result.current; - act(() => { - toggle(1); - }); - expect(result.current.selected).toEqual([1]); - expect(result.current.isSelected(1)).toEqual(true); - expect(result.current.allSelected).toEqual(false); - act(() => { - toggle(1); - }); - expect(result.current.selected).toEqual([]); - expect(result.current.isSelected(1)).toEqual(false); - expect(result.current.allSelected).toEqual(false); - }); - - it('selectAll and unSelectAll should work correct', async () => { - const { result } = setup(data); - const { selectAll, unSelectAll } = result.current; - - expect(result.current.noneSelected).toEqual(true); - act(() => { - selectAll(); - }); - expect(result.current.selected).toEqual([1, 2, 3]); - expect(result.current.allSelected).toEqual(true); - expect(result.current.noneSelected).toEqual(false); - expect(result.current.partiallySelected).toEqual(false); - - act(() => { - unSelectAll(); - }); - expect(result.current.selected).toEqual([]); - expect(result.current.allSelected).toEqual(false); - expect(result.current.noneSelected).toEqual(true); - expect(result.current.partiallySelected).toEqual(false); - }); - - it('toggleAll should work correct', async () => { - const { result } = setup(data); - const { toggleAll } = result.current; - expect(result.current.noneSelected).toEqual(true); - act(() => { - toggleAll(); - }); - expect(result.current.selected).toEqual([1, 2, 3]); - expect(result.current.allSelected).toEqual(true); - expect(result.current.noneSelected).toEqual(false); - expect(result.current.partiallySelected).toEqual(false); - - act(() => { - toggleAll(); - }); - expect(result.current.selected).toEqual([]); - expect(result.current.allSelected).toEqual(false); - expect(result.current.noneSelected).toEqual(true); - expect(result.current.partiallySelected).toEqual(false); - }); - - it('setSelected should work correct', async () => { - const { result } = setup(data); - const { setSelected } = result.current; - expect(result.current.noneSelected).toEqual(true); - act(() => { - setSelected([1]); - }); - expect(result.current.selected).toEqual([1]); - expect(result.current.isSelected(1)).toEqual(true); - expect(result.current.noneSelected).toEqual(false); - expect(result.current.allSelected).toEqual(false); - expect(result.current.partiallySelected).toEqual(true); - - act(() => { - setSelected([]); - }); - expect(result.current.selected).toEqual([]); - expect(result.current.isSelected(1)).toEqual(false); - expect(result.current.noneSelected).toEqual(true); - expect(result.current.allSelected).toEqual(false); - expect(result.current.partiallySelected).toEqual(false); - - act(() => { - setSelected([1, 2, 3]); - }); - expect(result.current.selected).toEqual([1, 2, 3]); - expect(result.current.isSelected(1)).toEqual(true); - expect(result.current.noneSelected).toEqual(false); - expect(result.current.allSelected).toEqual(true); - expect(result.current.partiallySelected).toEqual(false); - }); -}); diff --git a/packages/hooks/src/useSelections/demo/demo1.tsx b/packages/hooks/src/useSelections/demo/demo1.tsx index 2390f9ecba..0516cda3ab 100644 --- a/packages/hooks/src/useSelections/demo/demo1.tsx +++ b/packages/hooks/src/useSelections/demo/demo1.tsx @@ -7,7 +7,7 @@ */ import { Checkbox, Col, Row } from 'antd'; -import React, { useMemo, useState } from 'react'; +import { useMemo, useState } from 'react'; import { useSelections } from 'ahooks'; export default () => { @@ -21,12 +21,14 @@ export default () => { const { selected, allSelected, isSelected, toggle, toggleAll, partiallySelected } = useSelections( list, - [1], + { + defaultSelected: [1], + }, ); return (
-
Selected : {selected.join(',')}
+
Selected: {selected.join(',')}
Check all diff --git a/packages/hooks/src/useSelections/demo/demo2.tsx b/packages/hooks/src/useSelections/demo/demo2.tsx new file mode 100644 index 0000000000..903f05abea --- /dev/null +++ b/packages/hooks/src/useSelections/demo/demo2.tsx @@ -0,0 +1,52 @@ +/** + * title: Object array + * desc: When array items are object, you need to specify the field name for the unique key. + * + * title.zh-CN: 对象数组 + * desc.zh-CN: 数组项是对象时,需要指定唯一 key 的字段名称。 + */ + +import { Checkbox, Col, Row } from 'antd'; +import { useMemo, useState } from 'react'; +import { useSelections } from 'ahooks'; + +export default () => { + const [hideOdd, setHideOdd] = useState(false); + const list = useMemo(() => { + if (hideOdd) { + return [2, 4, 6, 8].map((id) => ({ id })); + } + return [1, 2, 3, 4, 5, 6, 7, 8].map((id) => ({ id })); + }, [hideOdd]); + + const { selected, allSelected, isSelected, toggle, toggleAll, partiallySelected } = useSelections( + list, + { + defaultSelected: [{ id: 1 }], + itemKey: 'id', + }, + ); + + return ( +
+
Selected: {JSON.stringify(selected)}
+
+ + Check all + + setHideOdd((v) => !v)}> + Hide Odd + +
+ + {list.map((item) => ( + + toggle(item)}> + {item.id} + + + ))} + +
+ ); +}; diff --git a/packages/hooks/src/useSelections/demo/demo3.tsx b/packages/hooks/src/useSelections/demo/demo3.tsx new file mode 100644 index 0000000000..7e7fcdaa2a --- /dev/null +++ b/packages/hooks/src/useSelections/demo/demo3.tsx @@ -0,0 +1,130 @@ +/** + * title: Pagination + * desc: Load data with pagination and enable cross-page selection. + * + * title.zh-CN: 分页多选 + * desc.zh-CN: 分页加载数据,并跨页选择。 + */ + +import { Checkbox, Divider, Pagination, Spin } from 'antd'; +import { useEffect, useState } from 'react'; +import { useSelections } from 'ahooks'; + +interface DataType { + id: number; + title: string; +} + +interface PaginationType { + current: number; + pageSize: number; + total?: number; +} + +const dataSource = Array.from({ length: 50 }, (item, index) => ({ + id: index, + title: `title ${index}`, +})); + +const getDataFromServer = (props: PaginationType) => { + const { current, pageSize } = props; + const data = dataSource.slice((current - 1) * pageSize, current * pageSize); + + return new Promise<{ + data: DataType[]; + total: PaginationType['total']; + }>((resolve) => { + setTimeout( + () => + resolve({ + data, + total: dataSource.length, + }), + 500, + ); + }); +}; + +export default () => { + const [dataList, setDataList] = useState([]); + const [loading, setLoading] = useState(false); + const [pagination, setPagination] = useState({ + current: 1, + pageSize: 10, + total: 0, + }); + + const getData = async (params: PaginationType) => { + setLoading(true); + + const { data, total } = await getDataFromServer(params); + + setLoading(false); + setDataList(data); + setPagination({ ...params, total }); + }; + + useEffect(() => { + getData(pagination); + }, []); + + const { selected, allSelected, isSelected, toggle, toggleAll, partiallySelected } = useSelections( + dataList, + { + itemKey: 'id', + }, + ); + + return ( + + {dataList.map((item) => { + const { id, title } = item; + + return ( +
+ toggle(item)} + checked={isSelected(item)} + > + {title} + +
+ ); + })} + { + getData({ + current: page, + pageSize: size, + }); + }} + /> +
+ + Check all + + Selected: {selected.length} +
+ {!!selected.length && ( + <> + + {JSON.stringify(selected)} + + )} +
+ ); +}; diff --git a/packages/hooks/src/useSelections/index.en-US.md b/packages/hooks/src/useSelections/index.en-US.md index c757895b0f..b934ba7df4 100644 --- a/packages/hooks/src/useSelections/index.en-US.md +++ b/packages/hooks/src/useSelections/index.en-US.md @@ -13,25 +13,57 @@ This hook is used for Checkbox group, supports multiple selection, single select +### Object array + + + +### Pagination + + + ## API ```typescript +interface Options { + defaultSelected?: T[]; + itemKey?: string | ((item: T) => Key); +} + +// works when >=3.8.0, recommended ✅ +const result: Result = useSelections(items: T[], options?: Options); + +// works when <4.0.0, will be removed in ahooks 4.0 🙅🏻‍♀️ const result: Result = useSelections(items: T[], defaultSelected?: T[]); ``` +### Params + +| Property | Description | Type | Default | +| --- | --- | --- | --- | +| items | Data items | `T[]` | - | +| options | Optional configuration | `Options` | - | + +### Options + +| Property | Description | Type | Default | +| --- | --- | --- | --- | +| defaultSelected | Default selected data | `T[]` | `[]` | +| itemKey | The unique key of data item. Typically, this parameter needs to be specified when the data source is an array of object | `string` \| `(item: T) => React.Key` | - | + ### Result -| Property | Description | Type | -| ----------------- | --------------------------- | ----------------------- | -| selected | Selected Items | `array` | -| allSelected | Is all items selected | `boolean` | -| noneSelected | Is no item selected | `boolean` | -| partiallySelected | Is partially items selected | `boolean` | -| isSelected | Whether item is selected | `(value: T) => boolean` | -| setSelected | Set selected items | `(value: T[]) => void` | -| select | Select item | `(value: T) => void` | -| unSelect | UnSelect item | `(value: T) => void` | -| toggle | Toggle item select status | `(value: T) => void` | -| selectAll | Select all items | `() => void` | -| unSelectAll | UnSelect all items | `() => void` | -| toggleAll | Toggle select all items | `() => void` | +| Property | Description | Type | +| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| selected | Selected items | `T[]` | +| allSelected | Is all items selected | `boolean` | +| noneSelected | Is no item selected | `boolean` | +| partiallySelected | Is partially items selected | `boolean` | +| isSelected | Whether item is selected | `(value: T) => boolean` | +| setSelected | Select multiple items. When executed multiple times, the later return value overwrites the previous one, so if you want to merge the results of multiple operations, you need to do this manually: `setSelected((oldArray) => oldArray.concat(newArray))` | `(value: T[]) => void \| (value: (prevState: T[]) => T[]) => void` | +| select | Select single item | `(value: T) => void` | +| unSelect | UnSelect single item | `(value: T) => void` | +| toggle | Toggle single item select status | `(value: T) => void` | +| selectAll | Select all items | `() => void` | +| unSelectAll | UnSelect all items | `() => void` | +| toggleAll | Toggle select all items | `() => void` | +| clearAll | Clear all selected (In general, `clearAll` is equivalent to `unSelectAll`. If the items is dynamic, `clearAll` will clear "all selected data", while `unSelectAll` will only clear "the currently selected data in the items") | `() => void` | diff --git a/packages/hooks/src/useSelections/index.ts b/packages/hooks/src/useSelections/index.ts index e9b5b4e9a5..facbb1597f 100644 --- a/packages/hooks/src/useSelections/index.ts +++ b/packages/hooks/src/useSelections/index.ts @@ -1,21 +1,61 @@ -import { useMemo, useState } from 'react'; +import isPlainObject from 'lodash/isPlainObject'; import useMemoizedFn from '../useMemoizedFn'; +import { isFunction, isString } from '../utils'; +import { useMemo, useState } from 'react'; + +export interface Options { + defaultSelected?: T[]; + itemKey?: string | ((item: T) => React.Key); +} + +function useSelections(items: T[], options?: T[] | Options) { + let defaultSelected: T[] = []; + let itemKey: Options['itemKey']; + + if (Array.isArray(options)) { + defaultSelected = options; + } else if (isPlainObject(options)) { + defaultSelected = options?.defaultSelected ?? defaultSelected; + itemKey = options?.itemKey ?? itemKey; + } + + const getKey = (item: T) => { + if (isFunction(itemKey)) { + return itemKey(item); + } + if (isString(itemKey) && isPlainObject(item)) { + return (item as any)[itemKey]; + } + + return item as React.Key; + }; -export default function useSelections(items: T[], defaultSelected: T[] = []) { const [selected, setSelected] = useState(defaultSelected); - const selectedSet = useMemo(() => new Set(selected), [selected]); + const selectedMap = useMemo(() => { + const keyToItemMap = new Map(); + + if (!Array.isArray(selected)) { + return keyToItemMap; + } + + selected.forEach((item) => { + keyToItemMap.set(getKey(item), item); + }); + + return keyToItemMap; + }, [selected]); - const isSelected = (item: T) => selectedSet.has(item); + const isSelected = (item: T) => selectedMap.has(getKey(item)); const select = (item: T) => { - selectedSet.add(item); - return setSelected(Array.from(selectedSet)); + selectedMap.set(getKey(item), item); + setSelected(Array.from(selectedMap.values())); }; const unSelect = (item: T) => { - selectedSet.delete(item); - return setSelected(Array.from(selectedSet)); + selectedMap.delete(getKey(item)); + setSelected(Array.from(selectedMap.values())); }; const toggle = (item: T) => { @@ -27,33 +67,41 @@ export default function useSelections(items: T[], defaultSelected: T[] = []) }; const selectAll = () => { - items.forEach((o) => { - selectedSet.add(o); + items.forEach((item) => { + selectedMap.set(getKey(item), item); }); - setSelected(Array.from(selectedSet)); + setSelected(Array.from(selectedMap.values())); }; const unSelectAll = () => { - items.forEach((o) => { - selectedSet.delete(o); + items.forEach((item) => { + selectedMap.delete(getKey(item)); }); - setSelected(Array.from(selectedSet)); + setSelected(Array.from(selectedMap.values())); }; - const noneSelected = useMemo(() => items.every((o) => !selectedSet.has(o)), [items, selectedSet]); + const noneSelected = useMemo( + () => items.every((item) => !selectedMap.has(getKey(item))), + [items, selectedMap], + ); - const allSelected = useMemo( - () => items.every((o) => selectedSet.has(o)) && !noneSelected, - [items, selectedSet, noneSelected], + const allSelected = useMemo( + () => items.every((item) => selectedMap.has(getKey(item))) && !noneSelected, + [items, selectedMap, noneSelected], ); - const partiallySelected = useMemo( + const partiallySelected = useMemo( () => !noneSelected && !allSelected, [noneSelected, allSelected], ); const toggleAll = () => (allSelected ? unSelectAll() : selectAll()); + const clearAll = () => { + selectedMap.clear(); + setSelected([]); + }; + return { selected, noneSelected, @@ -66,6 +114,9 @@ export default function useSelections(items: T[], defaultSelected: T[] = []) toggle: useMemoizedFn(toggle), selectAll: useMemoizedFn(selectAll), unSelectAll: useMemoizedFn(unSelectAll), + clearAll: useMemoizedFn(clearAll), toggleAll: useMemoizedFn(toggleAll), } as const; } + +export default useSelections; diff --git a/packages/hooks/src/useSelections/index.zh-CN.md b/packages/hooks/src/useSelections/index.zh-CN.md index 84c79048f5..8ce05e0476 100644 --- a/packages/hooks/src/useSelections/index.zh-CN.md +++ b/packages/hooks/src/useSelections/index.zh-CN.md @@ -13,25 +13,57 @@ nav: +### 对象数组 + + + +### 分页多选 + + + ## API ```typescript +interface Options { + defaultSelected?: T[]; + itemKey?: string | ((item: T) => Key); +} + +// >=3.8.0 可用,推荐的写法 ✅ +const result: Result = useSelections(items: T[], options?: Options); + +// <4.0.0 可用,将会在 ahooks 4.0 中移除 🙅🏻‍♀️ const result: Result = useSelections(items: T[], defaultSelected?: T[]); ``` +### Params + +| 参数 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| items | 元素列表 | `T[]` | - | +| options | 可选配置项 | `Options` | - | + +### Options + +| 参数 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| defaultSelected | 默认选择的数据 | `T[]` | `[]` | +| itemKey | 数据项的唯一 key。一般来说,数据源是对象数组时,才需要指定该参数 | `string` \| `(item: T) => React.Key` | - | + ### Result -| 参数 | 说明 | 类型 | -| ----------------- | ------------------ | ----------------------- | -| selected | 已经选择的元素 | `array` | -| allSelected | 是否全选 | `boolean` | -| noneSelected | 是否一个都没有选择 | `boolean` | -| partiallySelected | 是否半选 | `boolean` | -| isSelected | 是否被选择 | `(value: T) => boolean` | -| setSelected | 设置选择的元素 | `(value: T[]) => void` | -| select | 选择元素 | `(value: T) => void` | -| unSelect | 取消选择元素 | `(value: T) => void` | -| toggle | 反选元素 | `(value: T) => void` | -| selectAll | 选择全部元素 | `() => void` | -| unSelectAll | 取消选择全部元素 | `() => void` | -| toggleAll | 反选全部元素 | `() => void` | +| 参数 | 说明 | 类型 | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| selected | 已经选择的元素 | `T[]` | +| allSelected | 是否全选 | `boolean` | +| noneSelected | 是否一个都没有选择 | `boolean` | +| partiallySelected | 是否半选 | `boolean` | +| isSelected | 是否被选择 | `(value: T) => boolean` | +| setSelected | 选择多个元素。多次执行时,后面的返回值会覆盖前面的,因此如果希望合并多次操作的结果,需要手动处理:`setSelected((oldArray) => oldArray.concat(newArray))` | `(value: T[]) => void \| (value: (prevState: T[]) => T[]) => void` | +| select | 选择单个元素 | `(value: T) => void` | +| unSelect | 取消选择单个元素 | `(value: T) => void` | +| toggle | 反选单个元素 | `(value: T) => void` | +| selectAll | 选择全部元素 | `() => void` | +| unSelectAll | 取消选择全部元素 | `() => void` | +| toggleAll | 反选全部元素 | `() => void` | +| clearAll | 清除所有选中元素(一般情况下,`clearAll` 等价于 `unSelectAll`。如果元素列表是动态的,则 `clearAll` 会清除掉“所有选中过的元素”,而 `unSelectAll` 只会清除掉“当前元素列表里选中的元素”) | `() => void` | diff --git a/packages/hooks/src/useSessionStorageState/__tests__/index.test.ts b/packages/hooks/src/useSessionStorageState/__tests__/index.spec.ts similarity index 79% rename from packages/hooks/src/useSessionStorageState/__tests__/index.test.ts rename to packages/hooks/src/useSessionStorageState/__tests__/index.spec.ts index 6370b1f984..006935c64c 100644 --- a/packages/hooks/src/useSessionStorageState/__tests__/index.test.ts +++ b/packages/hooks/src/useSessionStorageState/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useSessionStorageState from '../index'; describe('useSessionStorageState', () => { @@ -11,7 +12,7 @@ describe('useSessionStorageState', () => { } as const; }); - it('should support object', () => { + test('should support object', () => { const LOCAL_STORAGE_KEY = 'test-object-key'; const hook = setUp<{ name: string }>(LOCAL_STORAGE_KEY, { name: 'A', @@ -34,13 +35,13 @@ describe('useSessionStorageState', () => { expect(hook.result.current.state).toEqual({ name: 'B' }); }); - it('should support function updater', () => { + test('should support function updater', () => { const LOCAL_STORAGE_KEY = 'test-func-updater'; const hook = setUp(LOCAL_STORAGE_KEY, 'hello world'); - expect(hook.result.current.state).toEqual('hello world'); + expect(hook.result.current.state).toBe('hello world'); act(() => { hook.result.current.setState((state) => `${state}, zhangsan`); }); - expect(hook.result.current.state).toEqual('hello world, zhangsan'); + expect(hook.result.current.state).toBe('hello world, zhangsan'); }); }); diff --git a/packages/hooks/src/useSet/__tests__/index.test.ts b/packages/hooks/src/useSet/__tests__/index.spec.ts similarity index 73% rename from packages/hooks/src/useSet/__tests__/index.test.ts rename to packages/hooks/src/useSet/__tests__/index.spec.ts index b60a51b485..719ffbdf19 100644 --- a/packages/hooks/src/useSet/__tests__/index.test.ts +++ b/packages/hooks/src/useSet/__tests__/index.spec.ts @@ -1,10 +1,11 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useSet from '../index'; const setUp = (initialSet?: Iterable) => renderHook(() => useSet(initialSet)); describe('useSet', () => { - it('should init set and utils', () => { + test('should init set and utils', () => { const { result } = setUp([1, 2]); const [set, utils] = result.current; @@ -16,17 +17,19 @@ describe('useSet', () => { }); }); - it('should init empty set if no initial set provided', () => { + test('should init empty set if no initial set provided', () => { const { result } = setUp(); - expect(result.current[0]).toEqual(new Set()); + + const { result: result1 } = setUp(undefined); + expect(result1.current[0]).toEqual(new Set()); }); - it('should have an initially provided key', () => { + test('should have an initially provided key', () => { const { result } = setUp(['a']); - const [set, utils] = result.current; + const [set] = result.current; - let value; + let value = false; act(() => { value = set.has('a'); }); @@ -34,14 +37,14 @@ describe('useSet', () => { expect(value).toBe(true); }); - it('should have an added key', () => { + test('should have an added key', () => { const { result } = setUp(); act(() => { result.current[1].add('newKey'); }); - let value; + let value = false; act(() => { value = result.current[0].has('newKey'); }); @@ -49,11 +52,11 @@ describe('useSet', () => { expect(value).toBe(true); }); - it('should get false for non-existing key', () => { + test('should get false for non-existing key', () => { const { result } = setUp(['a']); const [set] = result.current; - let value; + let value = true; act(() => { value = set.has('nonExisting'); }); @@ -61,7 +64,7 @@ describe('useSet', () => { expect(value).toBe(false); }); - it('should add a new key', () => { + test('should add a new key', () => { const { result } = setUp(['oldKey']); const [, utils] = result.current; @@ -72,7 +75,7 @@ describe('useSet', () => { expect(result.current[0]).toEqual(new Set(['oldKey', 'newKey'])); }); - it('should work if setting existing key', () => { + test('should work if setting existing key', () => { const { result } = setUp(['oldKey']); const [, utils] = result.current; @@ -83,7 +86,7 @@ describe('useSet', () => { expect(result.current[0]).toEqual(new Set(['oldKey'])); }); - it('should remove existing key', () => { + test('should remove existing key', () => { const { result } = setUp([1, 2]); const [, utils] = result.current; @@ -94,7 +97,7 @@ describe('useSet', () => { expect(result.current[0]).toEqual(new Set([1])); }); - it('should do nothing if removing non-existing key', () => { + test('should do nothing if removing non-existing key', () => { const { result } = setUp(['a', 'b']); const [, utils] = result.current; @@ -105,7 +108,7 @@ describe('useSet', () => { expect(result.current[0]).toEqual(new Set(['a', 'b'])); }); - it('should reset to initial set provided', () => { + test('should reset to initial set provided', () => { const { result } = setUp([1]); const [, utils] = result.current; @@ -122,7 +125,7 @@ describe('useSet', () => { expect(result.current[0]).toEqual(new Set([1])); }); - it('should memoized its utils methods', () => { + test('should memoized its utils methods', () => { const { result } = setUp(['a', 'b']); const [, utils] = result.current; const { add, remove, reset } = utils; diff --git a/packages/hooks/src/useSet/demo/demo1.tsx b/packages/hooks/src/useSet/demo/demo1.tsx index 5be8c4ea97..81d8995089 100644 --- a/packages/hooks/src/useSet/demo/demo1.tsx +++ b/packages/hooks/src/useSet/demo/demo1.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useSet } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useSet/index.en-US.md b/packages/hooks/src/useSet/index.en-US.md index 1e64a40774..dd9d97d905 100644 --- a/packages/hooks/src/useSet/index.en-US.md +++ b/packages/hooks/src/useSet/index.en-US.md @@ -23,17 +23,17 @@ const [ remove, reset } -] = useSet(initialValue?: Iterable); +] = useSet(initialValue); ``` ### Result -| Property | Description | Type | -| -------- | ---------------- | -------------------- | -| set | Set object | `Set` | -| add | Add item | `(key: any) => void` | -| remove | Remove item | `(key: any) => void` | -| reset | Reset to default | `() => void` | +| Property | Description | Type | +| -------- | ---------------- | ------------------ | +| set | Set object | `Set` | +| add | Add item | `(key: K) => void` | +| remove | Remove item | `(key: K) => void` | +| reset | Reset to default | `() => void` | ### Params diff --git a/packages/hooks/src/useSet/index.ts b/packages/hooks/src/useSet/index.ts index e7bd7cadb6..894a28e8ad 100644 --- a/packages/hooks/src/useSet/index.ts +++ b/packages/hooks/src/useSet/index.ts @@ -2,20 +2,20 @@ import { useState } from 'react'; import useMemoizedFn from '../useMemoizedFn'; function useSet(initialValue?: Iterable) { - const getInitValue = () => { - return initialValue === undefined ? new Set() : new Set(initialValue); - }; + const getInitValue = () => new Set(initialValue); + const [set, setSet] = useState>(getInitValue); - const [set, setSet] = useState>(() => getInitValue()); + const updateSet = (updater: (set: Set) => Set) => { + setSet((prevSet) => updater(new Set(prevSet))); + }; const add = (key: K) => { if (set.has(key)) { return; } - setSet((prevSet) => { - const temp = new Set(prevSet); - temp.add(key); - return temp; + updateSet((newSet) => { + newSet.add(key); + return newSet; }); }; @@ -23,10 +23,9 @@ function useSet(initialValue?: Iterable) { if (!set.has(key)) { return; } - setSet((prevSet) => { - const temp = new Set(prevSet); - temp.delete(key); - return temp; + updateSet((newSet) => { + newSet.delete(key); + return newSet; }); }; diff --git a/packages/hooks/src/useSet/index.zh-CN.md b/packages/hooks/src/useSet/index.zh-CN.md index 4ada063e7c..11db5ba7ea 100644 --- a/packages/hooks/src/useSet/index.zh-CN.md +++ b/packages/hooks/src/useSet/index.zh-CN.md @@ -21,17 +21,17 @@ const [ remove, reset } -] = useSet(initialValue?: Iterable); +] = useSet(initialValue); ``` ### Result -| 参数 | 说明 | 类型 | -| ------ | ------------ | -------------------- | -| set | Set 对象 | `Set` | -| add | 添加元素 | `(key: any) => void` | -| remove | 移除元素 | `(key: any) => void` | -| reset | 重置为默认值 | `() => void` | +| 参数 | 说明 | 类型 | +| ------ | ------------ | ------------------ | +| set | Set 对象 | `Set` | +| add | 添加元素 | `(key: K) => void` | +| remove | 移除元素 | `(key: K) => void` | +| reset | 重置为默认值 | `() => void` | ### Params diff --git a/packages/hooks/src/useSetState/__tests__/index.test.ts b/packages/hooks/src/useSetState/__tests__/index.spec.ts similarity index 77% rename from packages/hooks/src/useSetState/__tests__/index.test.ts rename to packages/hooks/src/useSetState/__tests__/index.spec.ts index 9a457b36bf..dd58721335 100644 --- a/packages/hooks/src/useSetState/__tests__/index.test.ts +++ b/packages/hooks/src/useSetState/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useSetState from '../index'; describe('useSetState', () => { @@ -11,14 +12,14 @@ describe('useSetState', () => { } as const; }); - it('should support initialValue', () => { + test('should support initialValue', () => { const hook = setUp({ hello: 'world', }); expect(hook.result.current.state).toEqual({ hello: 'world' }); }); - it('should support object', () => { + test('should support object', () => { const hook = setUp({ hello: 'world', }); @@ -28,7 +29,7 @@ describe('useSetState', () => { expect(hook.result.current.state).toEqual({ hello: 'world', foo: 'bar' }); }); - it('should support function update', () => { + test('should support function update', () => { const hook = setUp({ count: 0, }); diff --git a/packages/hooks/src/useSetState/demo/demo1.tsx b/packages/hooks/src/useSetState/demo/demo1.tsx index 51b16632a2..a8efae8da6 100644 --- a/packages/hooks/src/useSetState/demo/demo1.tsx +++ b/packages/hooks/src/useSetState/demo/demo1.tsx @@ -1,16 +1,21 @@ -import React from 'react'; +/** + * title: Default usage + * desc: Automatically merge object. + * + * title.zh-CN: 基础用法 + * desc.zh-CN: 自动合并对象。 + */ + import { useSetState } from 'ahooks'; interface State { hello: string; - count: number; [key: string]: any; } export default () => { const [state, setState] = useSetState({ hello: '', - count: 0, }); return ( @@ -23,9 +28,6 @@ export default () => { -

); diff --git a/packages/hooks/src/useSetState/demo/demo2.tsx b/packages/hooks/src/useSetState/demo/demo2.tsx new file mode 100644 index 0000000000..47b2427a2e --- /dev/null +++ b/packages/hooks/src/useSetState/demo/demo2.tsx @@ -0,0 +1,32 @@ +/** + * title: Updating with callback + * desc: When using the callback to update, the previous state can be received, and the return value will be automatically merged. + * + * title.zh-CN: 使用回调更新 + * desc.zh-CN: 通过回调进行更新,可以获取上一次的状态,并且也会自动合并返回的对象。 + */ + +import { useSetState } from 'ahooks'; + +interface State { + hello: string; + count: number; +} + +export default () => { + const [state, setState] = useSetState({ + hello: 'world', + count: 0, + }); + + return ( +
+
{JSON.stringify(state, null, 2)}
+

+ +

+
+ ); +}; diff --git a/packages/hooks/src/useSetState/index.en-US.md b/packages/hooks/src/useSetState/index.en-US.md index a09dee549f..6bfbf2d2f7 100644 --- a/packages/hooks/src/useSetState/index.en-US.md +++ b/packages/hooks/src/useSetState/index.en-US.md @@ -13,10 +13,25 @@ useSetState works similar to `this.setState` of class component, used to manage +### Updating with callback + + + ## API ```typescript -const [state, setState] = useSetState>( - initialState: T = {} as T -): [T, (patch: Partial | ((prevState: T) => Partial)) => void] +const [state, setState] = useSetState(initialState); ``` + +### Result + +| Property | Description | Type | Default | +| -------- | -------------------- | ----------------------------------------------------------------------------------------- | ------- | +| state | Current state | `T` | - | +| setState | Update current state | `(state: Partial \| null) => void` \| `((prevState: T) => Partial \| null) => void` | - | + +### Params + +| Property | Description | Type | Default | +| ------------ | ------------- | -------------- | ------- | +| initialState | Initial state | `T \| () => T` | - | diff --git a/packages/hooks/src/useSetState/index.ts b/packages/hooks/src/useSetState/index.ts index 495bcfd243..ca8b0db2ba 100644 --- a/packages/hooks/src/useSetState/index.ts +++ b/packages/hooks/src/useSetState/index.ts @@ -1,4 +1,5 @@ -import { useCallback, useState } from 'react'; +import { useState } from 'react'; +import useMemoizedFn from '../useMemoizedFn'; import { isFunction } from '../utils'; export type SetState> = ( @@ -10,12 +11,12 @@ const useSetState = >( ): [S, SetState] => { const [state, setState] = useState(initialState); - const setMergeState = useCallback((patch) => { + const setMergeState = useMemoizedFn((patch) => { setState((prevState) => { const newState = isFunction(patch) ? patch(prevState) : patch; return newState ? { ...prevState, ...newState } : prevState; }); - }, []); + }); return [state, setMergeState]; }; diff --git a/packages/hooks/src/useSetState/index.zh-CN.md b/packages/hooks/src/useSetState/index.zh-CN.md index 5a24ee1599..c06c148b0f 100644 --- a/packages/hooks/src/useSetState/index.zh-CN.md +++ b/packages/hooks/src/useSetState/index.zh-CN.md @@ -13,10 +13,25 @@ nav: +### 使用回调更新 + + + ## API ```typescript -const [state, setState] = useSetState>( - initialState: T = {} as T -): [T, (patch: Partial | ((prevState: T) => Partial)) => void] +const [state, setState] = useSetState(initialState); ``` + +### Result + +| 参数 | 说明 | 类型 | 默认值 | +| -------- | ------------ | ----------------------------------------------------------------------------------------- | ------ | +| state | 当前状态 | `T` | - | +| setState | 设置当前状态 | `(state: Partial \| null) => void` \| `((prevState: T) => Partial \| null) => void` | - | + +### Params + +| 参数 | 说明 | 类型 | 默认值 | +| ------------ | -------- | -------------- | ------ | +| initialState | 初始状态 | `T \| () => T` | - | diff --git a/packages/hooks/src/useSize/__tests__/index.spec.tsx b/packages/hooks/src/useSize/__tests__/index.spec.tsx new file mode 100644 index 0000000000..18fd472bd8 --- /dev/null +++ b/packages/hooks/src/useSize/__tests__/index.spec.tsx @@ -0,0 +1,90 @@ +import { act, render, renderHook, screen } from '@testing-library/react'; +import { useRef } from 'react'; +import { describe, expect, test, vi } from 'vitest'; +import useSize from '../index'; + +let callback: any; +vi.mock('resize-observer-polyfill', () => { + return { + default: vi.fn().mockImplementation((cb) => { + callback = cb; + return { + observe: () => {}, + disconnect: () => {}, + }; + }), + }; +}); + +// test about Resize Observer see https://github.com/que-etc/resize-observer-polyfill/tree/master/tests +describe('useSize', () => { + test('should work when target is a mounted DOM', () => { + const hook = renderHook(() => useSize(document.body)); + expect(hook.result.current).toEqual({ height: 0, width: 0 }); + }); + + test('should work when target is a `MutableRefObject`', async () => { + const mockRaf = vi + .spyOn(window, 'requestAnimationFrame') + .mockImplementation((cb: FrameRequestCallback) => { + cb(0); + return 0; + }); + + function Setup() { + const ref = useRef(null); + const size = useSize(ref); + + return ( +
+
width: {String(size?.width)}
+
height: {String(size?.height)}
+
+ ); + } + + render(); + expect((await screen.findByText(/^width/)).textContent).toBe('width: undefined'); + expect((await screen.findByText(/^height/)).textContent).toBe('height: undefined'); + + act(() => callback([{ target: { clientWidth: 10, clientHeight: 10 } }])); + expect((await screen.findByText(/^width/)).textContent).toBe('width: 10'); + expect((await screen.findByText(/^height/)).textContent).toBe('height: 10'); + mockRaf.mockRestore(); + }); + + test('should not work when target is null', () => { + expect(() => { + renderHook(() => useSize(null)); + }).not.toThrowError(); + }); + + test('should work', () => { + const mockRaf = vi + .spyOn(window, 'requestAnimationFrame') + .mockImplementation((cb: FrameRequestCallback) => { + cb(0); + return 0; + }); + const targetEl = document.createElement('div'); + const { result } = renderHook(() => useSize(targetEl)); + + act(() => { + callback([ + { + target: { + clientWidth: 100, + clientHeight: 50, + }, + }, + ]); + }); + + expect(result.current).toMatchObject({ + width: 100, + height: 50, + }); + + mockRaf.mockRestore(); + }); +}); diff --git a/packages/hooks/src/useSize/__tests__/index.test.ts b/packages/hooks/src/useSize/__tests__/index.test.ts deleted file mode 100644 index c819a47ff6..0000000000 --- a/packages/hooks/src/useSize/__tests__/index.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useSize from '../index'; - -let callback; -jest.mock('resize-observer-polyfill', () => { - return jest.fn().mockImplementation((cb) => { - callback = cb; - return { - observe: () => {}, - disconnect: () => {}, - }; - }); -}); - -// test about Resize Observer see https://github.com/que-etc/resize-observer-polyfill/tree/master/tests -describe('useSize', () => { - it('with argument', () => { - const hook = renderHook(() => useSize(document.body)); - expect(hook.result.current).toEqual(undefined); - }); - - it('should not work when target is null', () => { - renderHook(() => useSize(null)); - }); - - it('should work', () => { - const mockRaf = jest - .spyOn(window, 'requestAnimationFrame') - .mockImplementation((cb: FrameRequestCallback) => { - cb(0); - return 0; - }); - const targetEl = document.createElement('div'); - const { result } = renderHook(() => useSize(targetEl)); - - act(() => { - callback([ - { - target: { - clientWidth: 100, - clientHeight: 50, - }, - }, - ]); - }); - - expect(result.current).toMatchObject({ - width: 100, - height: 50, - }); - - mockRaf.mockRestore(); - }); -}); diff --git a/packages/hooks/src/useSize/demo/demo1.tsx b/packages/hooks/src/useSize/demo/demo1.tsx index d81874ae18..f12538d3f6 100644 --- a/packages/hooks/src/useSize/demo/demo1.tsx +++ b/packages/hooks/src/useSize/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: useSize 可以接收 ref 参数 */ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { useSize } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useSize/demo/demo2.tsx b/packages/hooks/src/useSize/demo/demo2.tsx index e1f9b5a975..b54e39f497 100644 --- a/packages/hooks/src/useSize/demo/demo2.tsx +++ b/packages/hooks/src/useSize/demo/demo2.tsx @@ -1,12 +1,11 @@ /** * title: pass in the DOM element - * desc: useSize can receive a dom element as parameter. In SSR scenarios, you can pass in function `()=>dom` + * desc: useSize can receive a dom element as parameter. In SSR scenarios, you can pass in function `() => dom` * * title.zh-CN: 传入 DOM 元素 - * desc.zh-CN: useSize 可以接收 dom,在 SSR 场景可以传入函数 `()=> dom` + * desc.zh-CN: useSize 可以接收 dom,在 SSR 场景可以传入函数 `() => dom` */ -import React from 'react'; import { useSize } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useSize/index.en-US.md b/packages/hooks/src/useSize/index.en-US.md index 0c0d3599b8..8d38060d2f 100644 --- a/packages/hooks/src/useSize/index.en-US.md +++ b/packages/hooks/src/useSize/index.en-US.md @@ -31,6 +31,6 @@ const size = useSize(target); ### Result -| Property | Description | Type | -| -------- | ------------------- | ------------------------------------------------ | -| size | Size of the element | `{ width: number, height: number } \| undefined` | +| Property | Description | Type | Default | +| -------- | ------------------- | ------------------------------------------------ | ------------------------------------------------------------------------- | +| size | Size of the element | `{ width: number, height: number } \| undefined` | `{ width: target.clientWidth, height: target.clientHeight } \| undefined` | diff --git a/packages/hooks/src/useSize/index.ts b/packages/hooks/src/useSize/index.ts index c2aab0d112..471d0194b2 100644 --- a/packages/hooks/src/useSize/index.ts +++ b/packages/hooks/src/useSize/index.ts @@ -7,7 +7,10 @@ import useIsomorphicLayoutEffectWithTarget from '../utils/useIsomorphicLayoutEff type Size = { width: number; height: number }; function useSize(target: BasicTarget): Size | undefined { - const [state, setState] = useRafState(); + const [state, setState] = useRafState(() => { + const el = getTargetElement(target); + return el ? { width: el.clientWidth, height: el.clientHeight } : undefined; + }); useIsomorphicLayoutEffectWithTarget( () => { @@ -20,13 +23,9 @@ function useSize(target: BasicTarget): Size | undefined { const resizeObserver = new ResizeObserver((entries) => { entries.forEach((entry) => { const { clientWidth, clientHeight } = entry.target; - setState({ - width: clientWidth, - height: clientHeight, - }); + setState({ width: clientWidth, height: clientHeight }); }); }); - resizeObserver.observe(el); return () => { resizeObserver.disconnect(); diff --git a/packages/hooks/src/useSize/index.zh-CN.md b/packages/hooks/src/useSize/index.zh-CN.md index d6da41b161..efd4c815f7 100644 --- a/packages/hooks/src/useSize/index.zh-CN.md +++ b/packages/hooks/src/useSize/index.zh-CN.md @@ -31,6 +31,6 @@ const size = useSize(target); ### Result -| 参数 | 说明 | 类型 | -| ---- | -------------- | ------------------------------------------------ | -| size | DOM 节点的尺寸 | `{ width: number, height: number } \| undefined` | +| 参数 | 说明 | 类型 | 默认值 | +| ---- | -------------- | ------------------------------------------------ | ------------------------------------------------------------------------- | +| size | DOM 节点的尺寸 | `{ width: number, height: number } \| undefined` | `{ width: target.clientWidth, height: target.clientHeight } \| undefined` | diff --git a/packages/hooks/src/useTextSelection/__tests__/index.test.ts b/packages/hooks/src/useTextSelection/__tests__/index.spec.ts similarity index 59% rename from packages/hooks/src/useTextSelection/__tests__/index.test.ts rename to packages/hooks/src/useTextSelection/__tests__/index.spec.ts index 6ba03d32ed..6a762e43d7 100644 --- a/packages/hooks/src/useTextSelection/__tests__/index.test.ts +++ b/packages/hooks/src/useTextSelection/__tests__/index.spec.ts @@ -1,22 +1,10 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useTextSelection from '../index'; // test about Resize Observer see https://github.com/que-etc/resize-observer-polyfill/tree/master/tests describe('useTextSelection', () => { - function moveMouse(x: number, y: number) { - act(() => { - document.dispatchEvent( - new MouseEvent('mousemove', { - clientX: x, - clientY: y, - screenX: x, - screenY: y, - }), - ); - }); - } - - function downMouse(x: number, y: number) { + function downMouse(x: number, y: number, options?: MouseEventInit) { act(() => { document.dispatchEvent( new MouseEvent('mousedown', { @@ -24,6 +12,7 @@ describe('useTextSelection', () => { clientY: y, screenX: x, screenY: y, + ...options, }), ); }); @@ -70,7 +59,7 @@ describe('useTextSelection', () => { }; } - it('on textSelection', async () => { + test('on textSelection', async () => { initGetSelection({ left: 10, top: 10, height: 100, width: 100, text: 'on textSelection' }); // TODO @@ -78,12 +67,12 @@ describe('useTextSelection', () => { const hook = renderHook(() => useTextSelection(() => document)); expect(hook.result.current.text).toBe(''); - expect(hook.result.current.left).toBe(NaN); - expect(hook.result.current.right).toBe(NaN); - expect(hook.result.current.top).toBe(NaN); - expect(hook.result.current.bottom).toBe(NaN); - expect(hook.result.current.height).toBe(NaN); - expect(hook.result.current.width).toBe(NaN); + expect(hook.result.current.left).toBeNaN(); + expect(hook.result.current.right).toBeNaN(); + expect(hook.result.current.top).toBeNaN(); + expect(hook.result.current.bottom).toBeNaN(); + expect(hook.result.current.height).toBeNaN(); + expect(hook.result.current.width).toBeNaN(); downMouse(0, 0); upMouse(100, 100); @@ -92,4 +81,25 @@ describe('useTextSelection', () => { expect(hook.result.current.text).toBe('on textSelection'); hook.unmount(); }); + + test('keep/cancel the selected text range', async () => { + initGetSelection({ text: 'aaa' }); + + const hook = renderHook(() => useTextSelection(() => document)); + + expect(hook.result.current.text).toBe(''); + downMouse(0, 0); + upMouse(100, 100); + expect(hook.result.current.text).toBe('aaa'); + + // trigger the secondary button of mouse (usually the right button) + downMouse(0, 0, { button: 2 }); + expect(hook.result.current.text).toBe('aaa'); + + // // trigger the main button of mouse (usually the left button) + downMouse(0, 0, { button: 0 }); + expect(hook.result.current.text).toBe(''); + + hook.unmount(); + }); }); diff --git a/packages/hooks/src/useTextSelection/demo/demo1.tsx b/packages/hooks/src/useTextSelection/demo/demo1.tsx index ab3a0cb246..8b2edeeaff 100644 --- a/packages/hooks/src/useTextSelection/demo/demo1.tsx +++ b/packages/hooks/src/useTextSelection/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 实时获取页面上选择的文本 */ -import React from 'react'; import { useTextSelection } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useTextSelection/demo/demo2.tsx b/packages/hooks/src/useTextSelection/demo/demo2.tsx index 4fd379f517..75e8c0c91b 100644 --- a/packages/hooks/src/useTextSelection/demo/demo2.tsx +++ b/packages/hooks/src/useTextSelection/demo/demo2.tsx @@ -8,7 +8,7 @@ import { useRequest, useTextSelection } from 'ahooks'; import { Popover, Spin } from 'antd'; -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; const getResult = (keyword: string): Promise => { const trimedText = keyword.trim() !== ''; @@ -21,11 +21,15 @@ const getResult = (keyword: string): Promise => { }; export default () => { - const { text = '', left = 0, top = 0, height = 0, width = 0 } = useTextSelection(() => - document.querySelector('#translate-dom'), - ); + const { + text = '', + left = 0, + top = 0, + height = 0, + width = 0, + } = useTextSelection(() => document.querySelector('#translate-dom')); - const [visible, setVisible] = useState(false); + const [open, setOpen] = useState(false); const { data, run, loading } = useRequest(getResult, { manual: true, @@ -33,10 +37,10 @@ export default () => { useEffect(() => { if (text.trim() === '') { - setVisible(false); + setOpen(false); return; } - setVisible(true); + setOpen(true); run(text); }, [text]); @@ -47,7 +51,7 @@ export default () => {

{loading ? 'Translating……' : data}} - visible={visible} + open={open} > { diff --git a/packages/hooks/src/useTextSelection/index.ts b/packages/hooks/src/useTextSelection/index.ts index ffd41f3fc1..1df19aba56 100644 --- a/packages/hooks/src/useTextSelection/index.ts +++ b/packages/hooks/src/useTextSelection/index.ts @@ -67,7 +67,9 @@ function useTextSelection(target?: BasicTarget): State { let selObj: Selection | null = null; let text = ''; let rect = initRect; - if (!window.getSelection) return; + if (!window.getSelection) { + return; + } selObj = window.getSelection(); text = selObj ? selObj.toString() : ''; if (text && isInRangeRef.current) { @@ -77,16 +79,24 @@ function useTextSelection(target?: BasicTarget): State { }; // 任意点击都需要清空之前的 range - const mousedownHandler = (e) => { - if (!window.getSelection) return; + const mousedownHandler = (e: MouseEvent) => { + // 如果是鼠标右键需要跳过 这样选中的数据就不会被清空 + if (e.button === 2) { + return; + } + if (!window.getSelection) { + return; + } if (stateRef.current.text) { setState({ ...initState }); } isInRangeRef.current = false; const selObj = window.getSelection(); - if (!selObj) return; + if (!selObj) { + return; + } selObj.removeAllRanges(); - isInRangeRef.current = el.contains(e.target); + isInRangeRef.current = el.contains(e.target as Node); }; el.addEventListener('mouseup', mouseupHandler); diff --git a/packages/hooks/src/useTheme/__tests__/index.spec.ts b/packages/hooks/src/useTheme/__tests__/index.spec.ts new file mode 100644 index 0000000000..facb3ae8dd --- /dev/null +++ b/packages/hooks/src/useTheme/__tests__/index.spec.ts @@ -0,0 +1,47 @@ +import { act, renderHook } from '@testing-library/react'; +import { beforeAll, describe, expect, test, vi } from 'vitest'; +import useTheme from '../index'; + +describe('useTheme', () => { + beforeAll(() => { + // Mock window.matchMedia + Object.defineProperty(window, 'matchMedia', { + writable: true, + value: vi.fn().mockImplementation((query) => ({ + matches: false, // Default value, can be overridden for specific tests + media: query, + onchange: null, + addListener: vi.fn(), // Deprecated but often still present + removeListener: vi.fn(), // Deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })), + }); + }); + + test('themeMode init', () => { + const { result } = renderHook(useTheme); + expect(result.current.themeMode).toBe('system'); + }); + + test('setThemeMode light', () => { + const { result } = renderHook(useTheme); + act(() => result.current.setThemeMode('light')); + expect(result.current.theme).toBe('light'); + expect(result.current.themeMode).toBe('light'); + }); + + test('setThemeMode dark', () => { + const { result } = renderHook(useTheme); + act(() => result.current.setThemeMode('dark')); + expect(result.current.theme).toBe('dark'); + expect(result.current.themeMode).toBe('dark'); + }); + + test('setThemeMode system', () => { + const { result } = renderHook(useTheme); + act(() => result.current.setThemeMode('system')); + expect(result.current.themeMode).toBe('system'); + }); +}); diff --git a/packages/hooks/src/useTheme/demo/demo1.tsx b/packages/hooks/src/useTheme/demo/demo1.tsx new file mode 100644 index 0000000000..78f1f0164c --- /dev/null +++ b/packages/hooks/src/useTheme/demo/demo1.tsx @@ -0,0 +1,45 @@ +/** + * title: Basic usage + * desc: The 'theme' is the system display theme ("light" or "dark"), the 'themeMode' can set 'theme' to "light" or "dark" or follow the system setting. + * + * title.zh-CN: 基础用法 + * desc.zh-CN: 'theme' 为系统当前显示主题("light" 或 "dark"),'themeMode' 为当前主题设置("light" 或 "dark" 或 "system")。 + */ + +import { useTheme } from 'ahooks'; +export default () => { + const { theme, themeMode, setThemeMode } = useTheme({ + localStorageKey: 'themeMode', + }); + + return ( + <> +
theme: {theme}
+
themeMode: {themeMode}
+ + + + + ); +}; diff --git a/packages/hooks/src/useTheme/index.en-US.md b/packages/hooks/src/useTheme/index.en-US.md new file mode 100644 index 0000000000..f5bdb1c2fe --- /dev/null +++ b/packages/hooks/src/useTheme/index.en-US.md @@ -0,0 +1,36 @@ +--- +nav: + path: /hooks +--- + +# useTheme + +This hook is used to get and set the theme, and store the `themeMode` into `localStorage`. + +## Examples + +### Default usage + + + +## API + +```typescript +const { theme, themeMode, setThemeMode } = useTheme({ + localStorageKey?: string; +}); +``` + +### Params + +| Property | Description | Type | Default | +| --------------- | ----------------------------------------------------- | -------- | --------- | +| localStorageKey | The key in localStorage to store selected theme mode | `string` | `undefined` | + +### Result + +| Property | Description | Type | Default | +| ------------ | --------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------- | +| theme | current display theme | `"light" \| "dark"` | if themeMode is "system" then equals to system setting,otherwise equals to themeMode | +| themeMode | selected theme mode | `"light" \| "dark" \| "system"` | equals to localStorage "themeMode", otherwise equals to "system" | +| setThemeMode | select theme mode | `(mode: "light" \| "dark" \| "system") => void` | | diff --git a/packages/hooks/src/useTheme/index.ts b/packages/hooks/src/useTheme/index.ts new file mode 100644 index 0000000000..0db1d66ca8 --- /dev/null +++ b/packages/hooks/src/useTheme/index.ts @@ -0,0 +1,74 @@ +import { useEffect, useState } from 'react'; +import useMemoizedFn from '../useMemoizedFn'; +import isBrowser from '../utils/isBrowser'; + +export enum ThemeMode { + LIGHT = 'light', + DARK = 'dark', + SYSTEM = 'system', +} + +export type ThemeModeType = `${ThemeMode}`; + +export type ThemeType = 'light' | 'dark'; + +const useCurrentTheme = () => { + const matchMedia = isBrowser ? window.matchMedia('(prefers-color-scheme: dark)') : undefined; + const [theme, setTheme] = useState(() => { + if (isBrowser) { + return matchMedia?.matches ? ThemeMode.DARK : ThemeMode.LIGHT; + } else { + return ThemeMode.LIGHT; + } + }); + + useEffect(() => { + const onThemeChange: MediaQueryList['onchange'] = (event) => { + if (event.matches) { + setTheme(ThemeMode.DARK); + } else { + setTheme(ThemeMode.LIGHT); + } + }; + + matchMedia?.addEventListener('change', onThemeChange); + + return () => { + matchMedia?.removeEventListener('change', onThemeChange); + }; + }, []); + + return theme; +}; + +type Options = { + localStorageKey?: string; +}; + +export default function useTheme(options: Options = {}) { + const { localStorageKey } = options; + + const [themeMode, setThemeMode] = useState(() => { + const preferredThemeMode = + localStorageKey?.length && (localStorage.getItem(localStorageKey) as ThemeModeType | null); + + return preferredThemeMode || ThemeMode.SYSTEM; + }); + + const setThemeModeWithLocalStorage = (mode: ThemeModeType) => { + setThemeMode(mode); + + if (localStorageKey?.length) { + localStorage.setItem(localStorageKey, mode); + } + }; + + const currentTheme = useCurrentTheme(); + const theme = themeMode === ThemeMode.SYSTEM ? currentTheme : themeMode; + + return { + theme, + themeMode, + setThemeMode: useMemoizedFn(setThemeModeWithLocalStorage), + }; +} diff --git a/packages/hooks/src/useTheme/index.zh-CN.md b/packages/hooks/src/useTheme/index.zh-CN.md new file mode 100644 index 0000000000..37c90800d9 --- /dev/null +++ b/packages/hooks/src/useTheme/index.zh-CN.md @@ -0,0 +1,36 @@ +--- +nav: + path: /hooks +--- + +# useTheme + +获取并设置当前主题,并将 `themeMode` 存储在 `localStorage` 中。 + +## 代码演示 + +### 基础用法 + + + +## API + +```typescript +const { theme, themeMode, setThemeMode } = useTheme({ + localStorageKey?: string; +}); +``` + +### 参数 + +| 参数 | 说明 | 类型 | 默认值 | +| --------------- | ------------------------------------ | -------- | --------- | +| localStorageKey | localStorage 中用于存放主题模式的键 | `string` | `undefined` | + +### 返回值 + +| 值 | 说明 | 类型 | 默认值 | +| ------------ | -------------- | ----------------------------------------------- | ---------------------------------------------------------------------- | +| theme | 当前显示的主题 | `"light" \| "dark"` | 若 themeMode 为 "system" 则为系统当前使用主题,否则与 themeMode 值相同 | +| themeMode | 选择的主题模式 | `"light" \| "dark" \| "system"` | 等于 localStorage "themeMode" 字段的值,否则为 "system" | +| setThemeMode | 选择主题模式 | `(mode: "light" \| "dark" \| "system") => void` | | diff --git a/packages/hooks/src/useThrottle/__tests__/index.spec.ts b/packages/hooks/src/useThrottle/__tests__/index.spec.ts new file mode 100644 index 0000000000..ee8719e507 --- /dev/null +++ b/packages/hooks/src/useThrottle/__tests__/index.spec.ts @@ -0,0 +1,116 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import { sleep } from '../../utils/testingHelpers'; +import useThrottle from '../index'; + +let hook: RenderHookResult; + +describe('useThrottle', () => { + test('default useThrottle should work', async () => { + let mountedState = 1; + act(() => { + hook = renderHook(() => useThrottle(mountedState, { wait: 500 })); + }); + + expect(hook.result.current).toBe(1); + mountedState = 2; + hook.rerender(); + mountedState = 3; + hook.rerender(); + await act(async () => { + await sleep(250); + }); + expect(hook.result.current).toBe(1); + mountedState = 4; + hook.rerender(); + await act(async () => { + await sleep(260); + }); + expect(hook.result.current).toBe(4); + }); + + test('leading:false & trailing:false of options useThrottle should work', async () => { + let mountedState = 0; + act(() => { + hook = renderHook(() => + useThrottle(mountedState, { + wait: 500, + leading: false, + trailing: false, + }), + ); + }); + + //Never get the latest value + mountedState = 1; + expect(hook.result.current).toBe(0); + mountedState = 2; + hook.rerender(); + mountedState = 3; + hook.rerender(); + await sleep(250); + expect(hook.result.current).toBe(0); + mountedState = 4; + hook.rerender(); + await sleep(260); + expect(hook.result.current).toBe(0); + }); + + test('leading:true & trailing:false of options useThrottle should work', async () => { + let mountedState = 0; + act(() => { + hook = renderHook(() => + useThrottle(mountedState, { wait: 500, leading: true, trailing: false }), + ); + }); + + expect(hook.result.current).toBe(0); + mountedState = 1; + hook.rerender(); + await sleep(0); + expect(hook.result.current).toBe(0); + + mountedState = 2; + await sleep(200); + hook.rerender(); + await sleep(0); + expect(hook.result.current).toBe(0); + + mountedState = 3; + //Need to wait more than 500ms to get the latest value + await act(async () => { + await sleep(300); + }); + hook.rerender(); + await sleep(0); + expect(hook.result.current).toBe(3); + }); + + test('leading:false & trailing:true of options useThrottle should work', async () => { + let mountedState = 0; + act(() => { + hook = renderHook(() => + useThrottle(mountedState, { wait: 500, leading: false, trailing: true }), + ); + }); + + expect(hook.result.current).toBe(0); + mountedState = 1; + hook.rerender(); + await sleep(0); + expect(hook.result.current).toBe(0); + + mountedState = 2; + hook.rerender(); + await sleep(250); + expect(hook.result.current).toBe(0); + + mountedState = 3; + hook.rerender(); + await act(async () => { + await sleep(260); + }); + await sleep(260); + expect(hook.result.current).toBe(3); + }); +}); diff --git a/packages/hooks/src/useThrottle/__tests__/index.test.ts b/packages/hooks/src/useThrottle/__tests__/index.test.ts deleted file mode 100644 index 6d69bbf971..0000000000 --- a/packages/hooks/src/useThrottle/__tests__/index.test.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; -import useThrottle from '../index'; -import { sleep } from '../../utils/testingHelpers'; - -interface ParamsObj { - value: any; - wait: number; -} - -let hook: RenderHookResult; - -describe('useThrottle', () => { - it('default useThrottle should work', async () => { - let mountedState = 1; - act(() => { - hook = renderHook(() => useThrottle(mountedState, { wait: 500 })); - }); - await act(async () => { - expect(hook.result.current).toEqual(1); - mountedState = 2; - hook.rerender(); - mountedState = 3; - hook.rerender(); - await sleep(250); - expect(hook.result.current).toEqual(1); - mountedState = 4; - hook.rerender(); - await sleep(260); - expect(hook.result.current).toEqual(4); - }); - }); - - it('leading:false & trailing:false of options useThrottle should work', async () => { - let mountedState = 0; - act(() => { - hook = renderHook(() => - useThrottle(mountedState, { wait: 500, leading: false, trailing: false }), - ); - }); - await act(async () => { - //Never get the latest value - mountedState = 1; - expect(hook.result.current).toEqual(0); - mountedState = 2; - hook.rerender(); - mountedState = 3; - hook.rerender(); - await sleep(250); - expect(hook.result.current).toEqual(0); - mountedState = 4; - hook.rerender(); - await sleep(260); - expect(hook.result.current).toEqual(0); - }); - }); - - it('leading:true & trailing:false of options useThrottle should work', async () => { - let mountedState = 0; - act(() => { - hook = renderHook(() => - useThrottle(mountedState, { wait: 500, leading: true, trailing: false }), - ); - }); - await act(async () => { - expect(hook.result.current).toEqual(0); - mountedState = 1; - hook.rerender(); - await sleep(0); - expect(hook.result.current).toEqual(0); - - mountedState = 2; - await sleep(200); - hook.rerender(); - await sleep(0); - expect(hook.result.current).toEqual(0); - - mountedState = 3; - //Need to wait more than 500ms to get the latest value - await sleep(300); - hook.rerender(); - await sleep(0); - expect(hook.result.current).toEqual(3); - }); - }); - - it('leading:false & trailing:true of options useThrottle should work', async () => { - let mountedState = 0; - act(() => { - hook = renderHook(() => - useThrottle(mountedState, { wait: 500, leading: false, trailing: true }), - ); - }); - await act(async () => { - expect(hook.result.current).toEqual(0); - mountedState = 1; - hook.rerender(); - await sleep(0); - expect(hook.result.current).toEqual(0); - - mountedState = 2; - hook.rerender(); - await sleep(250); - expect(hook.result.current).toEqual(0); - - mountedState = 3; - hook.rerender(); - await sleep(260); - expect(hook.result.current).toEqual(3); - }); - }); -}); diff --git a/packages/hooks/src/useThrottle/demo/demo1.tsx b/packages/hooks/src/useThrottle/demo/demo1.tsx index fdf2762b11..ab99a8d7a1 100644 --- a/packages/hooks/src/useThrottle/demo/demo1.tsx +++ b/packages/hooks/src/useThrottle/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: ThrottledValue 每隔 500ms 变化一次。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useThrottle } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useThrottleEffect/__tests__/index.spec.ts b/packages/hooks/src/useThrottleEffect/__tests__/index.spec.ts new file mode 100644 index 0000000000..6210dd3738 --- /dev/null +++ b/packages/hooks/src/useThrottleEffect/__tests__/index.spec.ts @@ -0,0 +1,81 @@ +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import { sleep } from '../../utils/testingHelpers'; +import useThrottleEffect from '../index'; + +let hook: RenderHookResult; + +describe('useThrottleEffect', () => { + test('useThrottleEffect should work', async () => { + const mockEffect = vi.fn(() => {}); + const mockCleanUp = vi.fn(() => {}); + act(() => { + hook = renderHook( + ({ value, wait }) => + useThrottleEffect( + () => { + mockEffect(); + return () => { + mockCleanUp(); + }; + }, + [value], + { wait }, + ), + { initialProps: { value: 1, wait: 200 } }, + ); + }); + + hook.rerender({ value: 2, wait: 200 }); + await sleep(100); + expect(mockEffect.mock.calls.length).toBe(1); + expect(mockCleanUp.mock.calls.length).toBe(0); + await act(async () => { + await sleep(150); + }); + expect(mockEffect.mock.calls.length).toBe(2); + expect(mockCleanUp.mock.calls.length).toBe(1); + + hook.rerender({ value: 3, wait: 100 }); + await sleep(50); + expect(mockEffect.mock.calls.length).toBe(3); + expect(mockCleanUp.mock.calls.length).toBe(2); + await act(async () => { + await sleep(100); + }); + expect(mockEffect.mock.calls.length).toBe(3); + expect(mockCleanUp.mock.calls.length).toBe(2); + }); + + test('should cancel timeout on unmount', async () => { + const mockEffect = vi.fn(() => {}); + const mockCleanUp = vi.fn(() => {}); + + const hook2 = renderHook( + (props) => + useThrottleEffect( + () => { + mockEffect(); + return () => { + mockCleanUp(); + }; + }, + [props], + { wait: 200 }, + ), + { initialProps: 0 }, + ); + + await act(async () => { + expect(mockEffect.mock.calls.length).toBe(1); + expect(mockCleanUp.mock.calls.length).toBe(0); + + hook2.rerender(1); + await sleep(50); + hook2.unmount(); + + expect(mockEffect.mock.calls.length).toBe(1); + expect(mockCleanUp.mock.calls.length).toBe(1); + }); + }); +}); diff --git a/packages/hooks/src/useThrottleEffect/__tests__/index.test.ts b/packages/hooks/src/useThrottleEffect/__tests__/index.test.ts deleted file mode 100644 index 8357010d3d..0000000000 --- a/packages/hooks/src/useThrottleEffect/__tests__/index.test.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; -import useThrottleEffect from '../index'; -import { sleep } from '../../utils/testingHelpers'; - -interface ParamsObj { - value: any; - wait: number; -} - -let hook: RenderHookResult; - -describe('useThrottleEffect', () => { - it('useThrottleEffect should work', async () => { - const mockEffect = jest.fn(() => {}); - const mockCleanUp = jest.fn(() => {}); - act(() => { - hook = renderHook( - ({ value, wait }) => - useThrottleEffect( - () => { - mockEffect(); - return () => { - mockCleanUp(); - }; - }, - [value], - { wait }, - ), - { initialProps: { value: 1, wait: 200 } }, - ); - }); - - await act(async () => { - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(0); - - hook.rerender({ value: 2, wait: 200 }); - await sleep(100); - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(0); - await sleep(150); - expect(mockEffect.mock.calls.length).toEqual(2); - expect(mockCleanUp.mock.calls.length).toEqual(1); - - hook.rerender({ value: 3, wait: 100 }); - await sleep(50); - expect(mockEffect.mock.calls.length).toEqual(3); - expect(mockCleanUp.mock.calls.length).toEqual(2); - await sleep(100); - expect(mockEffect.mock.calls.length).toEqual(3); - expect(mockCleanUp.mock.calls.length).toEqual(2); - }); - }); - - it('should cancel timeout on unmount', async () => { - const mockEffect = jest.fn(() => {}); - const mockCleanUp = jest.fn(() => {}); - - const hook = renderHook( - (props) => - useThrottleEffect( - () => { - mockEffect(); - return () => { - mockCleanUp(); - }; - }, - [props], - { wait: 200 }, - ), - { initialProps: 0 }, - ); - - await act(async () => { - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(0); - - hook.rerender(1); - await sleep(50); - hook.unmount(); - - expect(mockEffect.mock.calls.length).toEqual(1); - expect(mockCleanUp.mock.calls.length).toEqual(1); - }); - }); -}); diff --git a/packages/hooks/src/useThrottleEffect/demo/demo1.tsx b/packages/hooks/src/useThrottleEffect/demo/demo1.tsx index 363fb94ac9..4c48a6406a 100644 --- a/packages/hooks/src/useThrottleEffect/demo/demo1.tsx +++ b/packages/hooks/src/useThrottleEffect/demo/demo1.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useThrottleEffect } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useThrottleFn/__tests__/index.test.ts b/packages/hooks/src/useThrottleFn/__tests__/index.spec.ts similarity index 73% rename from packages/hooks/src/useThrottleFn/__tests__/index.test.ts rename to packages/hooks/src/useThrottleFn/__tests__/index.spec.ts index 896c4c3308..d9d4bdcdfa 100644 --- a/packages/hooks/src/useThrottleFn/__tests__/index.test.ts +++ b/packages/hooks/src/useThrottleFn/__tests__/index.spec.ts @@ -1,6 +1,7 @@ -import { act, renderHook, RenderHookResult } from '@testing-library/react-hooks'; -import useThrottleFn from '../index'; +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import { sleep } from '../../utils/testingHelpers'; +import useThrottleFn from '../index'; interface ParamsObj { fn: (...arg: any) => any; @@ -10,10 +11,10 @@ interface ParamsObj { const setUp = ({ fn, wait }: ParamsObj) => renderHook(() => useThrottleFn(fn, { wait })); -let hook: RenderHookResult>; +let hook: RenderHookResult; describe('useThrottleFn', () => { - it('run, cancel and flush should work', async () => { + test('run, cancel and flush should work', async () => { let count = 0; const throttleFn = (gap: number) => { count += gap; @@ -55,11 +56,4 @@ describe('useThrottleFn', () => { expect(count).toBe(9); }); }); - - it('should output error when fn is not a function', () => { - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - renderHook(() => useThrottleFn(1 as any)); - expect(errSpy).toBeCalledWith('useThrottleFn expected parameter is a function, got number'); - errSpy.mockRestore(); - }); }); diff --git a/packages/hooks/src/useThrottleFn/demo/demo1.tsx b/packages/hooks/src/useThrottleFn/demo/demo1.tsx index a5781b3200..add0474952 100644 --- a/packages/hooks/src/useThrottleFn/demo/demo1.tsx +++ b/packages/hooks/src/useThrottleFn/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 频繁调用 run,但只会每隔 500ms 执行一次相关函数。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useThrottleFn } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useTimeout/__tests__/index.test.ts b/packages/hooks/src/useTimeout/__tests__/index.spec.ts similarity index 59% rename from packages/hooks/src/useTimeout/__tests__/index.test.ts rename to packages/hooks/src/useTimeout/__tests__/index.spec.ts index d76623347d..83c39902dc 100644 --- a/packages/hooks/src/useTimeout/__tests__/index.test.ts +++ b/packages/hooks/src/useTimeout/__tests__/index.spec.ts @@ -1,47 +1,48 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; import useTimeout from '../index'; interface ParamsObj { fn: (...arg: any) => any; - delay: number | undefined; + delay?: number; } const setUp = ({ fn, delay }: ParamsObj) => renderHook(() => useTimeout(fn, delay)); describe('useTimeout', () => { - jest.useFakeTimers(); - jest.spyOn(global, 'clearTimeout'); + vi.useFakeTimers(); + vi.spyOn(global, 'clearTimeout'); - it('timeout should work', () => { - const callback = jest.fn(); + test('timeout should work', () => { + const callback = vi.fn(); setUp({ fn: callback, delay: 20 }); expect(callback).not.toBeCalled(); - jest.advanceTimersByTime(70); + vi.advanceTimersByTime(70); expect(callback).toHaveBeenCalledTimes(1); }); - it('timeout should stop', () => { - const callback = jest.fn(); + test('timeout should stop', () => { + const callback = vi.fn(); setUp({ fn: callback, delay: undefined }); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); expect(callback).toHaveBeenCalledTimes(0); setUp({ fn: callback, delay: -2 }); - jest.advanceTimersByTime(50); + vi.advanceTimersByTime(50); expect(callback).toHaveBeenCalledTimes(0); }); - it('timeout should be clear', () => { - const callback = jest.fn(); + test('timeout should be clear', () => { + const callback = vi.fn(); const hook = setUp({ fn: callback, delay: 20 }); expect(callback).not.toBeCalled(); hook.result.current(); - jest.advanceTimersByTime(30); + vi.advanceTimersByTime(30); expect(callback).toHaveBeenCalledTimes(0); expect(clearTimeout).toHaveBeenCalledTimes(1); }); diff --git a/packages/hooks/src/useTimeout/demo/demo1.tsx b/packages/hooks/src/useTimeout/demo/demo1.tsx index 912b385aaf..86e3ac18f9 100644 --- a/packages/hooks/src/useTimeout/demo/demo1.tsx +++ b/packages/hooks/src/useTimeout/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 3000ms 后执行一次 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useTimeout } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useTimeout/demo/demo2.tsx b/packages/hooks/src/useTimeout/demo/demo2.tsx index b4b5914661..809f9f5574 100644 --- a/packages/hooks/src/useTimeout/demo/demo2.tsx +++ b/packages/hooks/src/useTimeout/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 动态修改 delay 以实现定时器间隔变化与暂停。 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useTimeout } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useTimeout/index.en-US.md b/packages/hooks/src/useTimeout/index.en-US.md index 6cab1fb859..2fbe0fb123 100644 --- a/packages/hooks/src/useTimeout/index.en-US.md +++ b/packages/hooks/src/useTimeout/index.en-US.md @@ -19,7 +19,7 @@ A hook that handles the `setTimeout` timer function. ```typescript useTimeout( fn: () => void, - delay?: number | null + delay?: number | undefined ): fn: () => void; ``` diff --git a/packages/hooks/src/useTimeout/index.ts b/packages/hooks/src/useTimeout/index.ts index 8b9019b3b0..e3f901a66c 100644 --- a/packages/hooks/src/useTimeout/index.ts +++ b/packages/hooks/src/useTimeout/index.ts @@ -1,24 +1,10 @@ import { useCallback, useEffect, useRef } from 'react'; -import useLatest from '../useLatest'; +import useMemoizedFn from '../useMemoizedFn'; import { isNumber } from '../utils'; -function useTimeout(fn: () => void, delay: number | undefined) { - const fnRef = useLatest(fn); - const timerRef = useRef(null); - - useEffect(() => { - if (!isNumber(delay) || delay < 0) { - return; - } - timerRef.current = setTimeout(() => { - fnRef.current(); - }, delay); - return () => { - if (timerRef.current) { - clearTimeout(timerRef.current); - } - }; - }, [delay]); +const useTimeout = (fn: () => void, delay?: number) => { + const timerCallback = useMemoizedFn(fn); + const timerRef = useRef | null>(null); const clear = useCallback(() => { if (timerRef.current) { @@ -26,7 +12,15 @@ function useTimeout(fn: () => void, delay: number | undefined) { } }, []); + useEffect(() => { + if (!isNumber(delay) || delay < 0) { + return; + } + timerRef.current = setTimeout(timerCallback, delay); + return clear; + }, [delay]); + return clear; -} +}; export default useTimeout; diff --git a/packages/hooks/src/useTimeout/index.zh-CN.md b/packages/hooks/src/useTimeout/index.zh-CN.md index 875f1547b2..a1a0b45210 100644 --- a/packages/hooks/src/useTimeout/index.zh-CN.md +++ b/packages/hooks/src/useTimeout/index.zh-CN.md @@ -19,7 +19,7 @@ nav: ```typescript useTimeout( fn: () => void, - delay?: number | null + delay?: number | undefined ): fn: () => void; ``` diff --git a/packages/hooks/src/useTitle/__tests__/index.test.ts b/packages/hooks/src/useTitle/__tests__/index.spec.ts similarity index 77% rename from packages/hooks/src/useTitle/__tests__/index.test.ts rename to packages/hooks/src/useTitle/__tests__/index.spec.ts index 448d5e5749..95fa1f9251 100644 --- a/packages/hooks/src/useTitle/__tests__/index.test.ts +++ b/packages/hooks/src/useTitle/__tests__/index.spec.ts @@ -1,8 +1,9 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useTitle from '../index'; describe('useTitle', () => { - it('should update document title', () => { + test('should update document title', () => { const hook = renderHook((props) => useTitle(props), { initialProps: 'Current Page Title' }); expect(document.title).toBe('Current Page Title'); @@ -12,7 +13,7 @@ describe('useTitle', () => { expect(document.title).toBe('Other Page Title'); }); - it('should restore document title on unmount', () => { + test('should restore document title on unmount', () => { document.title = 'Old Title'; const hook = renderHook((props) => useTitle(props, { restoreOnUnmount: true }), { @@ -25,7 +26,7 @@ describe('useTitle', () => { expect(document.title).toBe('Old Title'); }); - it('should not restore document title on unmount', () => { + test('should not restore document title on unmount', () => { document.title = 'Old Title'; const hook = renderHook((props) => useTitle(props, { restoreOnUnmount: false }), { diff --git a/packages/hooks/src/useTitle/demo/demo1.tsx b/packages/hooks/src/useTitle/demo/demo1.tsx index 07fd5befa5..b38266d341 100644 --- a/packages/hooks/src/useTitle/demo/demo1.tsx +++ b/packages/hooks/src/useTitle/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 设置页面标题 */ -import React from 'react'; import { useTitle } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useToggle/__tests__/index.test.ts b/packages/hooks/src/useToggle/__tests__/index.spec.ts similarity index 59% rename from packages/hooks/src/useToggle/__tests__/index.test.ts rename to packages/hooks/src/useToggle/__tests__/index.spec.ts index 284a80b317..402d5ba670 100644 --- a/packages/hooks/src/useToggle/__tests__/index.test.ts +++ b/packages/hooks/src/useToggle/__tests__/index.spec.ts @@ -1,4 +1,5 @@ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useToggle from '../index'; const callToggle = (hook: any) => { @@ -8,37 +9,35 @@ const callToggle = (hook: any) => { }; describe('useToggle', () => { - it('test on init', async () => { + test('test on init', async () => { const hook = renderHook(() => useToggle()); expect(hook.result.current[0]).toBeFalsy(); }); - it('test on methods', async () => { + test('test on methods', async () => { const hook = renderHook(() => useToggle('Hello')); - expect(hook.result.current[0]).toEqual('Hello'); - act(() => { - hook.result.current[1].toggle(); - }); + expect(hook.result.current[0]).toBe('Hello'); + callToggle(hook); expect(hook.result.current[0]).toBeFalsy(); act(() => { hook.result.current[1].setLeft(); }); - expect(hook.result.current[0]).toEqual('Hello'); + expect(hook.result.current[0]).toBe('Hello'); act(() => { hook.result.current[1].setRight(); }); expect(hook.result.current[0]).toBeFalsy(); }); - it('test on optional', () => { + test('test on optional', () => { const hook = renderHook(() => useToggle('Hello', 'World')); callToggle(hook); - expect(hook.result.current[0]).toEqual('World'); + expect(hook.result.current[0]).toBe('World'); act(() => { hook.result.current[1].set('World'); }); - expect(hook.result.current[0]).toEqual('World'); + expect(hook.result.current[0]).toBe('World'); callToggle(hook); - expect(hook.result.current[0]).toEqual('Hello'); + expect(hook.result.current[0]).toBe('Hello'); }); }); diff --git a/packages/hooks/src/useToggle/demo/demo1.tsx b/packages/hooks/src/useToggle/demo/demo1.tsx index 1f8a5ba284..80c855f254 100644 --- a/packages/hooks/src/useToggle/demo/demo1.tsx +++ b/packages/hooks/src/useToggle/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 默认为 boolean 切换,基础用法与 useBoolean 一致。 */ -import React from 'react'; import { useToggle } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useToggle/demo/demo2.tsx b/packages/hooks/src/useToggle/demo/demo2.tsx index 29a1b15c25..363f20898e 100644 --- a/packages/hooks/src/useToggle/demo/demo2.tsx +++ b/packages/hooks/src/useToggle/demo/demo2.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 接受两个可选参数,在它们之间进行切换。 */ -import React from 'react'; import { useToggle } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useTrackedEffect/__tests__/index.spec.ts b/packages/hooks/src/useTrackedEffect/__tests__/index.spec.ts new file mode 100644 index 0000000000..e4d667cd4c --- /dev/null +++ b/packages/hooks/src/useTrackedEffect/__tests__/index.spec.ts @@ -0,0 +1,120 @@ +import { renderHook } from '@testing-library/react'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import useTrackedEffect from '../index'; + +describe('useTrackedEffect', () => { + //We use a array to store which dependency has changed + let changedDepIndexes: number[] = []; + let prevDependencies: any[] = []; + let currentDependencies: any[] = []; + let mockEffectCleanup: any; + let mockEffectCallback: any; + let mockEffectWithTracked: any; + + beforeEach(() => { + changedDepIndexes = []; + prevDependencies = []; + currentDependencies = []; + mockEffectCleanup = vi.fn(); + mockEffectCallback = vi.fn().mockReturnValue(mockEffectCleanup); + mockEffectWithTracked = vi.fn().mockImplementation((changes, prevDeps, curDeps) => { + //This effect callback accept an addition parameter which contains indexes of dependencies which changed their equalities. + changedDepIndexes = changes; + prevDependencies = prevDeps; + currentDependencies = curDeps; + return mockEffectCleanup; + }); + }); + + test("should run provided effect and return single changed dependency's index ", () => { + const deps = { var1: 0, var2: '0', var3: { value: 0 } }; + const { rerender } = renderHook(() => + useTrackedEffect(mockEffectWithTracked, [deps.var1, deps.var2, deps.var3]), + ); + expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); + rerender(); + expect(changedDepIndexes).toHaveLength(3); + changedDepIndexes = []; + deps.var1++; + rerender(); + expect(changedDepIndexes).toHaveLength(1); + expect(changedDepIndexes[0]).toBe(0); + }); + test('should run provided effect and return correct dependencies (previous and current)', () => { + const deps = { var1: 0, var2: '0', var3: { value: 0 } }; + const { rerender } = renderHook(() => + useTrackedEffect(mockEffectWithTracked, [deps.var1, deps.var2, deps.var3]), + ); + expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); + rerender(); + expect(changedDepIndexes).toHaveLength(3); + changedDepIndexes = []; + deps.var1++; + deps.var2 = '1'; + rerender(); + expect(prevDependencies[0]).toBe(0); + expect(currentDependencies[0]).toBe(1); + expect(prevDependencies[1] === '0').toBe(true); + expect(currentDependencies[1] === '1').toBe(true); + changedDepIndexes = []; + deps.var2 = '2'; + rerender(); + expect(prevDependencies[1]).toBe('1'); + expect(currentDependencies[1]).toBe('2'); + }); + test(" should run provided effect and return multiple changed dependecy's indexes", () => { + const deps = { var1: 0, var2: '0', var3: { value: 0 } }; + const { rerender } = renderHook(() => + useTrackedEffect(mockEffectWithTracked, [deps.var1, deps.var2, deps.var3]), + ); + expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); + rerender(); + expect(changedDepIndexes).toHaveLength(3); + changedDepIndexes = []; + deps.var1++; + deps.var2 = '1'; + rerender(); + expect(changedDepIndexes).toHaveLength(2); + expect(changedDepIndexes[0]).toBe(0); + expect(changedDepIndexes[1]).toBe(1); + changedDepIndexes = []; + deps.var2 = '2'; + rerender(); + expect(changedDepIndexes).toHaveLength(1); + expect(changedDepIndexes[0]).toBe(1); + }); + test('should run provided effect and return empty if no dependency changed', () => { + const deps = { var1: 0, var2: '0', var3: { value: 0 } }; + const { rerender } = renderHook(() => + useTrackedEffect(mockEffectWithTracked, [deps.var1, deps.var2, deps.var3]), + ); + expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); + rerender(); + expect(changedDepIndexes).toHaveLength(3); + changedDepIndexes = []; + deps.var1 = 0; + rerender(); + expect(changedDepIndexes).toHaveLength(0); + }); + test('should run provided effect and make sure reference equality is correct', () => { + const deps = { var1: 0, var2: '0', var3: { value: 0 } }; + const { rerender } = renderHook(() => + useTrackedEffect(mockEffectWithTracked, [deps.var1, deps.var2, deps.var3]), + ); + expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); + rerender(); + expect(changedDepIndexes).toHaveLength(3); + changedDepIndexes = []; + deps.var3.value = 123; + rerender(); + expect(changedDepIndexes).toHaveLength(0); + }); + + test('should run clean-up provided on unmount as a normal useEffect', () => { + const { unmount } = renderHook(() => useTrackedEffect(mockEffectCallback)); + expect(mockEffectCleanup).not.toHaveBeenCalled(); + + unmount(); + expect(mockEffectCleanup).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/hooks/src/useTrackedEffect/__tests__/index.test.ts b/packages/hooks/src/useTrackedEffect/__tests__/index.test.ts deleted file mode 100644 index 50853162e5..0000000000 --- a/packages/hooks/src/useTrackedEffect/__tests__/index.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useTrackedEffect from '../index'; - -describe('useTrackedEffect', () => { - //We use a array to store which dependency has changed - let changedDepIndexes = []; - let prevDependencies = []; - let currentDependencies = []; - const mockEffectCleanup = jest.fn(); - const mockEffectCallback = jest.fn().mockReturnValue(mockEffectCleanup); - const mockEffectWithTracked = jest.fn().mockImplementation((changes, prevDeps, curDeps) => { - //This effect callback accept an addition parameter which contains indexes of dependecies which changed their equalities. - changedDepIndexes = changes; - prevDependencies = prevDeps; - currentDependencies = curDeps; - return mockEffectCleanup; - }); - it("should run provided effect and return single changed dependecy's index ", () => { - let var1 = 0; - let var2 = '0'; - let var3 = { value: 0 }; - const { rerender } = renderHook(() => - useTrackedEffect(mockEffectWithTracked, [var1, var2, var3]), - ); - expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); - rerender(); - expect(changedDepIndexes).toHaveLength(3); - changedDepIndexes = []; - var1++; - rerender(); - expect(changedDepIndexes).toHaveLength(1); - expect(changedDepIndexes[0]).toEqual(0); - }); - it('should run provided effect and return correct dependencies (previous and current)', () => { - let var1 = 0; - let var2 = '0'; - let var3 = { value: 0 }; - const { rerender } = renderHook(() => - useTrackedEffect(mockEffectWithTracked, [var1, var2, var3]), - ); - expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); - rerender(); - expect(changedDepIndexes).toHaveLength(3); - changedDepIndexes = []; - var1++; - var2 = '1'; - rerender(); - expect(prevDependencies[0]).toEqual(0); - expect(currentDependencies[0]).toEqual(1); - expect(prevDependencies[1] === '0').toEqual(true); - expect(currentDependencies[1] === '1').toEqual(true); - changedDepIndexes = []; - var2 = '2'; - rerender(); - expect(prevDependencies[1]).toEqual('1'); - expect(currentDependencies[1]).toEqual('2'); - }); - it(" should run provided effect and return multiple changed dependecy's indexes", () => { - let var1 = 0; - let var2 = '0'; - let var3 = { value: 0 }; - const { rerender } = renderHook(() => - useTrackedEffect(mockEffectWithTracked, [var1, var2, var3]), - ); - expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); - rerender(); - expect(changedDepIndexes).toHaveLength(3); - changedDepIndexes = []; - var1++; - var2 = '1'; - rerender(); - expect(changedDepIndexes).toHaveLength(2); - expect(changedDepIndexes[0]).toEqual(0); - expect(changedDepIndexes[1]).toEqual(1); - changedDepIndexes = []; - var2 = '2'; - rerender(); - expect(changedDepIndexes).toHaveLength(1); - expect(changedDepIndexes[0]).toEqual(1); - }); - it('should run provided effect and return empty if no dependency changed', () => { - let var1 = 0; - let var2 = '0'; - let var3 = { value: 0 }; - const { rerender } = renderHook(() => - useTrackedEffect(mockEffectWithTracked, [var1, var2, var3]), - ); - expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); - rerender(); - expect(changedDepIndexes).toHaveLength(3); - changedDepIndexes = []; - var1 = 0; - rerender(); - expect(changedDepIndexes).toHaveLength(0); - }); - it('should run provided effect and make sure reference equality is correct', () => { - let var1 = 0; - let var2 = '0'; - let var3 = { value: 0 }; - const { rerender } = renderHook(() => - useTrackedEffect(mockEffectWithTracked, [var1, var2, var3]), - ); - expect(mockEffectWithTracked).toHaveBeenCalledTimes(1); - rerender(); - expect(changedDepIndexes).toHaveLength(3); - changedDepIndexes = []; - var3.value = 123; - rerender(); - expect(changedDepIndexes).toHaveLength(0); - }); - - it('should run clean-up provided on unmount as a normal useEffect', () => { - const { unmount } = renderHook(() => useTrackedEffect(mockEffectCallback)); - expect(mockEffectCleanup).not.toHaveBeenCalled(); - - unmount(); - expect(mockEffectCleanup).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/hooks/src/useTrackedEffect/demo/demo1.tsx b/packages/hooks/src/useTrackedEffect/demo/demo1.tsx index e18e7ec51c..730660fee4 100644 --- a/packages/hooks/src/useTrackedEffect/demo/demo1.tsx +++ b/packages/hooks/src/useTrackedEffect/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 查看每次 effect 执行时发生变化的依赖项 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { useTrackedEffect } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useTrackedEffect/index.ts b/packages/hooks/src/useTrackedEffect/index.ts index 07ec5a7bac..284c305415 100644 --- a/packages/hooks/src/useTrackedEffect/index.ts +++ b/packages/hooks/src/useTrackedEffect/index.ts @@ -1,28 +1,27 @@ import type { DependencyList } from 'react'; import { useEffect, useRef } from 'react'; -type Effect = ( +type Effect = ( changes?: number[], - previousDeps?: DependencyList, - currentDeps?: DependencyList, + previousDeps?: T, + currentDeps?: T, ) => void | (() => void); const diffTwoDeps = (deps1?: DependencyList, deps2?: DependencyList) => { - //Let's do a reference equality check on 2 dependency list. - //If deps1 is defined, we iterate over deps1 and do comparison on each element with equivalent element from deps2 - //As this func is used only in this hook, we assume 2 deps always have same length. + // Let's do a reference equality check on 2 dependency list. + // If deps1 is defined, we iterate over deps1 and do comparison on each element with equivalent element from deps2 + // As this func is used only in this hook, we assume 2 deps always have same length. return deps1 ? deps1 - .map((_ele, idx) => (!Object.is(deps1[idx], deps2?.[idx]) ? idx : -1)) + .map((_, idx) => (!Object.is(deps1[idx], deps2?.[idx]) ? idx : -1)) .filter((ele) => ele >= 0) : deps2 - ? deps2.map((_ele, idx) => idx) - : []; + ? deps2.map((_, idx) => idx) + : []; }; -const useTrackedEffect = (effect: Effect, deps?: DependencyList) => { - const previousDepsRef = useRef(); - +const useTrackedEffect = (effect: Effect, deps?: [...T]) => { + const previousDepsRef = useRef(undefined); useEffect(() => { const changes = diffTwoDeps(previousDepsRef.current, deps); const previousDeps = previousDepsRef.current; diff --git a/packages/hooks/src/useUnmount/__tests__/index.spec.ts b/packages/hooks/src/useUnmount/__tests__/index.spec.ts new file mode 100644 index 0000000000..329b4a0e2e --- /dev/null +++ b/packages/hooks/src/useUnmount/__tests__/index.spec.ts @@ -0,0 +1,15 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, test, vi } from 'vitest'; +import useUnmount from '../index'; + +describe('useUnmount', () => { + test('useUnmount should work', async () => { + const fn = vi.fn(); + const hook = renderHook(() => useUnmount(fn)); + expect(fn).toBeCalledTimes(0); + hook.rerender(); + expect(fn).toBeCalledTimes(0); + hook.unmount(); + expect(fn).toBeCalledTimes(1); + }); +}); diff --git a/packages/hooks/src/useUnmount/__tests__/index.test.ts b/packages/hooks/src/useUnmount/__tests__/index.test.ts deleted file mode 100644 index 5ef39bdabd..0000000000 --- a/packages/hooks/src/useUnmount/__tests__/index.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import useUnmount from '../index'; - -describe('useUnmount', () => { - it('useUnmount should work', async () => { - const fn = jest.fn(); - const hook = renderHook(() => useUnmount(fn)); - expect(fn).toBeCalledTimes(0); - hook.rerender(); - expect(fn).toBeCalledTimes(0); - hook.unmount(); - expect(fn).toBeCalledTimes(1); - }); - - it('should output error when fn is not a function', () => { - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - renderHook(() => useUnmount(1 as any)); - expect(errSpy).toBeCalledWith('useUnmount expected parameter is a function, got number'); - errSpy.mockRestore(); - }); -}); diff --git a/packages/hooks/src/useUnmount/demo/demo1.tsx b/packages/hooks/src/useUnmount/demo/demo1.tsx index 7296c71f6d..d398d1cde4 100644 --- a/packages/hooks/src/useUnmount/demo/demo1.tsx +++ b/packages/hooks/src/useUnmount/demo/demo1.tsx @@ -8,8 +8,6 @@ import { useBoolean, useUnmount } from 'ahooks'; import { message } from 'antd'; -import React from 'react'; - const MyComponent = () => { useUnmount(() => { message.info('unmount'); diff --git a/packages/hooks/src/useUnmountedRef/__tests__/index.test.ts b/packages/hooks/src/useUnmountedRef/__tests__/index.spec.ts similarity index 71% rename from packages/hooks/src/useUnmountedRef/__tests__/index.test.ts rename to packages/hooks/src/useUnmountedRef/__tests__/index.spec.ts index b240bdda7e..c86e7a0096 100644 --- a/packages/hooks/src/useUnmountedRef/__tests__/index.test.ts +++ b/packages/hooks/src/useUnmountedRef/__tests__/index.spec.ts @@ -1,8 +1,9 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { describe, expect, test } from 'vitest'; +import { renderHook } from '../../utils/tests'; import useUnmountedRef from '../index'; describe('useUnmountedRef', () => { - it('should work', async () => { + test('should work', async () => { const hook = renderHook(() => useUnmountedRef()); expect(hook.result.current.current).toBe(false); hook.rerender(); diff --git a/packages/hooks/src/useUnmountedRef/demo/demo1.tsx b/packages/hooks/src/useUnmountedRef/demo/demo1.tsx index d1e3e80edc..46512b3944 100644 --- a/packages/hooks/src/useUnmountedRef/demo/demo1.tsx +++ b/packages/hooks/src/useUnmountedRef/demo/demo1.tsx @@ -8,7 +8,7 @@ import { useBoolean, useUnmountedRef } from 'ahooks'; import { message } from 'antd'; -import React, { useEffect } from 'react'; +import { useEffect } from 'react'; const MyComponent = () => { const unmountedRef = useUnmountedRef(); diff --git a/packages/hooks/src/useUnmountedRef/index.ts b/packages/hooks/src/useUnmountedRef/index.tsx similarity index 88% rename from packages/hooks/src/useUnmountedRef/index.ts rename to packages/hooks/src/useUnmountedRef/index.tsx index 1f09abd049..540786bf78 100644 --- a/packages/hooks/src/useUnmountedRef/index.ts +++ b/packages/hooks/src/useUnmountedRef/index.tsx @@ -3,6 +3,7 @@ import { useEffect, useRef } from 'react'; const useUnmountedRef = () => { const unmountedRef = useRef(false); useEffect(() => { + unmountedRef.current = false; return () => { unmountedRef.current = true; }; diff --git a/packages/hooks/src/useUpdate/__tests__/index.test.ts b/packages/hooks/src/useUpdate/__tests__/index.spec.ts similarity index 66% rename from packages/hooks/src/useUpdate/__tests__/index.test.ts rename to packages/hooks/src/useUpdate/__tests__/index.spec.ts index 66a81e8f83..8241e1f4f6 100644 --- a/packages/hooks/src/useUpdate/__tests__/index.test.ts +++ b/packages/hooks/src/useUpdate/__tests__/index.spec.ts @@ -1,9 +1,10 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useUpdate from '..'; +import { act, renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useMemoizedFn from '../../useMemoizedFn'; +import useUpdate from '..'; describe('useUpdate', () => { - it('should update', () => { + test('should update', () => { let count = 0; const hooks = renderHook(() => { const update = useUpdate(); @@ -16,11 +17,11 @@ describe('useUpdate', () => { }), }; }); - expect(hooks.result.current.count).toEqual(0); + expect(hooks.result.current.count).toBe(0); act(hooks.result.current.onChange); - expect(hooks.result.current.count).toEqual(1); + expect(hooks.result.current.count).toBe(1); }); - it('should return same update function', () => { + test('should return same update function', () => { const hooks = renderHook(() => useUpdate()); const preUpdate = hooks.result.current; hooks.rerender(); diff --git a/packages/hooks/src/useUpdate/demo/demo1.tsx b/packages/hooks/src/useUpdate/demo/demo1.tsx index 3dc6af9f59..bf574f39f6 100644 --- a/packages/hooks/src/useUpdate/demo/demo1.tsx +++ b/packages/hooks/src/useUpdate/demo/demo1.tsx @@ -6,7 +6,6 @@ * desc.zh-CN: 强制组件重新渲染。 */ -import React from 'react'; import { useUpdate } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useUpdate/index.ts b/packages/hooks/src/useUpdate/index.ts index 34c6910fcf..3fa21b5b77 100644 --- a/packages/hooks/src/useUpdate/index.ts +++ b/packages/hooks/src/useUpdate/index.ts @@ -1,9 +1,10 @@ -import { useCallback, useState } from 'react'; +import { useState } from 'react'; +import useMemoizedFn from '../useMemoizedFn'; const useUpdate = () => { const [, setState] = useState({}); - return useCallback(() => setState({}), []); + return useMemoizedFn(() => setState({})); }; export default useUpdate; diff --git a/packages/hooks/src/useUpdateEffect/__tests__/index.test.ts b/packages/hooks/src/useUpdateEffect/__tests__/index.spec.ts similarity index 57% rename from packages/hooks/src/useUpdateEffect/__tests__/index.test.ts rename to packages/hooks/src/useUpdateEffect/__tests__/index.spec.ts index 3d58242dd0..54f9d006a6 100644 --- a/packages/hooks/src/useUpdateEffect/__tests__/index.test.ts +++ b/packages/hooks/src/useUpdateEffect/__tests__/index.spec.ts @@ -1,30 +1,31 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useUpdateEffect from '../index'; describe('useUpdateEffect', () => { - it('test on mounted', async () => { + test('test on mounted', async () => { let mountedState = 1; const hook = renderHook(() => useUpdateEffect(() => { mountedState = 2; }), ); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); hook.rerender(); - expect(mountedState).toEqual(2); + expect(mountedState).toBe(2); }); - it('test on optional', () => { + test('test on optional', () => { let mountedState = 1; const hook = renderHook(() => useUpdateEffect(() => { mountedState = 3; }, [mountedState]), ); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); hook.rerender(); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); mountedState = 2; hook.rerender(); - expect(mountedState).toEqual(3); + expect(mountedState).toBe(3); }); }); diff --git a/packages/hooks/src/useUpdateEffect/demo/demo1.tsx b/packages/hooks/src/useUpdateEffect/demo/demo1.tsx index 1dbd7d5926..4ace033073 100644 --- a/packages/hooks/src/useUpdateEffect/demo/demo1.tsx +++ b/packages/hooks/src/useUpdateEffect/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 使用上与 useEffect 完全相同,只是它忽略了首次执行,只在依赖项更新时执行。 */ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useUpdateEffect } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useUpdateLayoutEffect/__tests__/index.test.ts b/packages/hooks/src/useUpdateLayoutEffect/__tests__/index.spec.ts similarity index 58% rename from packages/hooks/src/useUpdateLayoutEffect/__tests__/index.test.ts rename to packages/hooks/src/useUpdateLayoutEffect/__tests__/index.spec.ts index 778a6b2a66..d1d911147d 100644 --- a/packages/hooks/src/useUpdateLayoutEffect/__tests__/index.test.ts +++ b/packages/hooks/src/useUpdateLayoutEffect/__tests__/index.spec.ts @@ -1,30 +1,31 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; import useUpdateLayoutEffect from '../index'; describe('useUpdateLayoutEffect', () => { - it('test on mounted', async () => { + test('test on mounted', async () => { let mountedState = 1; const hook = renderHook(() => useUpdateLayoutEffect(() => { mountedState = 2; }), ); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); hook.rerender(); - expect(mountedState).toEqual(2); + expect(mountedState).toBe(2); }); - it('test on optional', () => { + test('test on optional', () => { let mountedState = 1; const hook = renderHook(() => useUpdateLayoutEffect(() => { mountedState = 3; }, [mountedState]), ); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); hook.rerender(); - expect(mountedState).toEqual(1); + expect(mountedState).toBe(1); mountedState = 2; hook.rerender(); - expect(mountedState).toEqual(3); + expect(mountedState).toBe(3); }); }); diff --git a/packages/hooks/src/useUpdateLayoutEffect/demo/demo1.tsx b/packages/hooks/src/useUpdateLayoutEffect/demo/demo1.tsx index b0fae8b409..be2eb716a4 100644 --- a/packages/hooks/src/useUpdateLayoutEffect/demo/demo1.tsx +++ b/packages/hooks/src/useUpdateLayoutEffect/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 使用上与 useLayoutEffect 完全相同,只是它忽略了首次执行,且只在依赖项更新时执行。 */ -import React, { useLayoutEffect, useState } from 'react'; +import { useLayoutEffect, useState } from 'react'; import { useUpdateLayoutEffect } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useVirtualList/__tests__/index.test.ts b/packages/hooks/src/useVirtualList/__tests__/index.spec.ts similarity index 74% rename from packages/hooks/src/useVirtualList/__tests__/index.test.ts rename to packages/hooks/src/useVirtualList/__tests__/index.spec.ts index d6e943901e..194776f8f8 100644 --- a/packages/hooks/src/useVirtualList/__tests__/index.test.ts +++ b/packages/hooks/src/useVirtualList/__tests__/index.spec.ts @@ -1,9 +1,11 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import useVirtualList, { Options } from '../index'; +import { act, type RenderHookResult, renderHook } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import type { Options } from '../index'; +import useVirtualList from '../index'; describe('useVirtualList', () => { describe('virtual list render', () => { - let hook: any; + let hook: RenderHookResult; let container: HTMLDivElement; let wrapper: HTMLDivElement; @@ -13,8 +15,8 @@ describe('useVirtualList', () => { // mock clientheight, clientWidth // see: https://github.com/testing-library/react-testing-library/issues/353 - jest.spyOn(container, 'clientHeight', 'get').mockImplementation(() => 300); - jest.spyOn(container, 'clientWidth', 'get').mockImplementation(() => 300); + vi.spyOn(container, 'clientHeight', 'get').mockImplementation(() => 300); + vi.spyOn(container, 'clientWidth', 'get').mockImplementation(() => 300); wrapper = document.createElement('div'); container.appendChild(wrapper); @@ -27,11 +29,11 @@ describe('useVirtualList', () => { hook.unmount(); }); - const setup = (list: any[] = [], options: {}) => { - hook = renderHook(() => useVirtualList(list as unknown[], options as Options)); + const setup = (list: any[] = [], options: Options) => { + hook = renderHook(() => useVirtualList(list, options)); }; - it('test return list size', () => { + test('test return list size', () => { setup(Array.from(Array(99999).keys()), { containerTarget: () => container, wrapperTarget: () => wrapper, @@ -47,7 +49,7 @@ describe('useVirtualList', () => { expect(container.scrollTop).toBe(80 * 30); }); - it('test with fixed height', () => { + test('test with fixed height', () => { setup(Array.from(Array(99999).keys()), { overscan: 0, itemHeight: 30, @@ -61,9 +63,11 @@ describe('useVirtualList', () => { expect(hook.result.current[0].length).toBe(10); expect(container.scrollTop).toBe(20 * 30); + expect(hook.result.current[0][0].data).toBe(20); + expect(hook.result.current[0][0].index).toBe(20); }); - it('test with dynamic height', async () => { + test('test with dynamic height', async () => { const list = Array.from(Array(99999).keys()); setup(list, { overscan: 0, diff --git a/packages/hooks/src/useVirtualList/demo/demo1.tsx b/packages/hooks/src/useVirtualList/demo/demo1.tsx index e825fca182..d1ed1e2db1 100644 --- a/packages/hooks/src/useVirtualList/demo/demo1.tsx +++ b/packages/hooks/src/useVirtualList/demo/demo1.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 渲染大量数据 */ -import React, { useMemo, useRef } from 'react'; +import { useMemo, useRef } from 'react'; import { useVirtualList } from 'ahooks'; export default () => { diff --git a/packages/hooks/src/useVirtualList/demo/demo2.tsx b/packages/hooks/src/useVirtualList/demo/demo2.tsx index 666fd41aa3..bc16ec7d8c 100644 --- a/packages/hooks/src/useVirtualList/demo/demo2.tsx +++ b/packages/hooks/src/useVirtualList/demo/demo2.tsx @@ -6,7 +6,7 @@ * desc.zh-CN: 动态指定每个元素的高度 */ -import React, { useMemo, useRef } from 'react'; +import { useMemo, useRef, useState } from 'react'; import { useVirtualList } from 'ahooks'; export default () => { @@ -15,7 +15,7 @@ export default () => { const originalList = useMemo(() => Array.from(Array(99999).keys()), []); - const [value, onChange] = React.useState(0); + const [value, onChange] = useState(0); const [list, scrollTo] = useVirtualList(originalList, { containerTarget: containerRef, diff --git a/packages/hooks/src/useVirtualList/index.en-US.md b/packages/hooks/src/useVirtualList/index.en-US.md index 5f69fe4000..7129c8c367 100644 --- a/packages/hooks/src/useVirtualList/index.en-US.md +++ b/packages/hooks/src/useVirtualList/index.en-US.md @@ -33,10 +33,10 @@ const [list, scrollTo] = useVirtualList( ### Params -| Property | Description | Type | Default | -| ------------ | ----------------------------------------------------- | --------- | ------- | -| originalList | The original list that contains a lot of data entries | `T[]` | `[]` | -| options | config | `Options` | - | +| Property | Description | Type | Default | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ------- | +| originalList | The original list that contains a lot of data entries. **Attention: must undergo useMemo processing or never change, otherwise there will be a dead loop** | `T[]` | `[]` | +| options | config | `Options` | - | ### Options diff --git a/packages/hooks/src/useVirtualList/index.ts b/packages/hooks/src/useVirtualList/index.ts index 7bb55318a8..66da12b9df 100644 --- a/packages/hooks/src/useVirtualList/index.ts +++ b/packages/hooks/src/useVirtualList/index.ts @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState, useRef } from 'react'; +import type { CSSProperties } from 'react'; import useEventListener from '../useEventListener'; import useLatest from '../useLatest'; import useMemoizedFn from '../useMemoizedFn'; @@ -6,6 +7,7 @@ import useSize from '../useSize'; import { getTargetElement } from '../utils/domTarget'; import type { BasicTarget } from '../utils/domTarget'; import { isNumber } from '../utils'; +import useUpdateEffect from '../useUpdateEffect'; type ItemHeight = (index: number, data: T) => number; @@ -27,6 +29,8 @@ const useVirtualList = (list: T[], options: Options) => { const [targetList, setTargetList] = useState<{ index: number; data: T }[]>([]); + const [wrapperStyle, setWrapperStyle] = useState({}); + const getVisibleCount = (containerHeight: number, fromIndex: number) => { if (isNumber(itemHeightRef.current)) { return Math.ceil(containerHeight / itemHeightRef.current); @@ -47,7 +51,7 @@ const useVirtualList = (list: T[], options: Options) => { const getOffset = (scrollTop: number) => { if (isNumber(itemHeightRef.current)) { - return Math.floor(scrollTop / itemHeightRef.current) + 1; + return Math.floor(scrollTop / itemHeightRef.current); } let sum = 0; let offset = 0; @@ -70,7 +74,7 @@ const useVirtualList = (list: T[], options: Options) => { } const height = list .slice(0, index) - .reduce((sum, _, i) => sum + (itemHeightRef.current as ItemHeight)(i, list[i]), 0); + .reduce((sum, _, i) => sum + (itemHeightRef.current as ItemHeight)(i, list[i]), 0); return height; }; @@ -78,7 +82,7 @@ const useVirtualList = (list: T[], options: Options) => { if (isNumber(itemHeightRef.current)) { return list.length * itemHeightRef.current; } - return list.reduce( + return list.reduce( (sum, _, index) => sum + (itemHeightRef.current as ItemHeight)(index, list[index]), 0, ); @@ -86,9 +90,8 @@ const useVirtualList = (list: T[], options: Options) => { const calculateRange = () => { const container = getTargetElement(containerTarget); - const wrapper = getTargetElement(wrapperTarget) as HTMLElement; - if (container && wrapper) { + if (container) { const { scrollTop, clientHeight } = container; const offset = getOffset(scrollTop); @@ -99,8 +102,10 @@ const useVirtualList = (list: T[], options: Options) => { const offsetTop = getDistanceTop(start); - wrapper.style.height = totalHeight - offsetTop + 'px'; - wrapper.style.marginTop = offsetTop + 'px'; + setWrapperStyle({ + height: totalHeight - offsetTop + 'px', + marginTop: offsetTop + 'px', + }); setTargetList( list.slice(start, end).map((ele, index) => ({ @@ -111,6 +116,15 @@ const useVirtualList = (list: T[], options: Options) => { } }; + useUpdateEffect(() => { + const wrapper = getTargetElement(wrapperTarget) as HTMLElement; + if (wrapper) { + Object.keys(wrapperStyle).forEach( + (key) => ((wrapper.style as any)[key] = (wrapperStyle as any)[key]), + ); + } + }, [wrapperStyle]); + useEffect(() => { if (!size?.width || !size?.height) { return; diff --git a/packages/hooks/src/useVirtualList/index.zh-CN.md b/packages/hooks/src/useVirtualList/index.zh-CN.md index b3a6799e6d..62e2082b12 100644 --- a/packages/hooks/src/useVirtualList/index.zh-CN.md +++ b/packages/hooks/src/useVirtualList/index.zh-CN.md @@ -33,10 +33,10 @@ const [list, scrollTo] = useVirtualList( ### Params -| 参数 | 说明 | 类型 | 默认值 | -| ------------ | ------------------ | --------- | ------ | -| originalList | 包含大量数据的列表 | `T[]` | `[]` | -| options | 配置项 | `Options` | - | +| 参数 | 说明 | 类型 | 默认值 | +| ------------ | ------------------------------------------------------------------------------ | --------- | ------ | +| originalList | 包含大量数据的列表。 **注意:必须经过 useMemo 处理或者永不变化,否则会死循环** | `T[]` | `[]` | +| options | 配置项 | `Options` | - | ### Options diff --git a/packages/hooks/src/useWebSocket/__tests__/index.spec.ts b/packages/hooks/src/useWebSocket/__tests__/index.spec.ts new file mode 100644 index 0000000000..29958b79a8 --- /dev/null +++ b/packages/hooks/src/useWebSocket/__tests__/index.spec.ts @@ -0,0 +1,147 @@ +import { act, renderHook } from '@testing-library/react'; +import { afterEach, describe, expect, test, vi } from 'vitest'; +import WS from 'vitest-websocket-mock'; +import { sleep } from '../../utils/testingHelpers'; +import useWebSocket, { ReadyState } from '../index'; + +const promise: Promise = new Promise((resolve) => resolve()); +const wsUrl = 'ws://localhost:9999'; + +describe('useWebSocket', () => { + afterEach(() => { + WS.clean(); + }); + + test('should work', async () => { + const wsServer = new WS(wsUrl); + const hooks = renderHook(() => useWebSocket(wsUrl)); + + // connect + expect(hooks.result.current.readyState).toBe(ReadyState.Connecting); + expect(hooks.result.current.latestMessage).toBeUndefined(); + await act(async () => { + await wsServer.connected; + return promise; + }); + expect(hooks.result.current.readyState).toBe(ReadyState.Open); + + // send message + const nowTime = `${Date.now()}`; + hooks.result.current.sendMessage?.(nowTime); + await expect(wsServer).toReceiveMessage(nowTime); + + // receive message + act(() => { + wsServer.send(nowTime); + }); + expect(hooks.result.current.latestMessage?.data).toBe(nowTime); + + // disconnect + act(() => wsServer.close()); + await act(async () => { + await wsServer.closed; + return promise; + }); + expect(hooks.result.current.readyState).toBe(ReadyState.Closed); + }); + + test('disconnect should work', async () => { + const wsServer = new WS(wsUrl); + const hooks = renderHook(() => useWebSocket(wsUrl)); + + // connect + expect(hooks.result.current.readyState).toBe(ReadyState.Connecting); + await act(() => wsServer.connected); + expect(hooks.result.current.readyState).toBe(ReadyState.Open); + + // disconnect + act(() => hooks.result.current.disconnect()); + await act(() => wsServer.closed); + expect(hooks.result.current.readyState).toBe(ReadyState.Closed); + }); + + test('useWebSocket should be manually triggered', async () => { + const wsServer = new WS(wsUrl); + + new WebSocket(wsUrl); + + const hooks = renderHook(() => useWebSocket(wsUrl, { manual: true })); + + expect(hooks.result.current.readyState).toBe(ReadyState.Closed); + await act(async () => { + await wsServer.connected; + }); + + // We set "manual: true", so the connection status should be still closed. + expect(hooks.result.current.readyState).toBe(ReadyState.Closed); + + await act(async () => { + hooks.result.current.connect!(); + await sleep(100); // To make sure connection is established + }); + expect(hooks.result.current.readyState).toBe(ReadyState.Open); + + act(() => wsServer.close()); + }); + + test('should not call connect when initial socketUrl is empty', async () => { + const wsServer = new WS(wsUrl); + const onOpen = vi.fn(); + const onClose = vi.fn(); + + let url = ''; + const hooks = renderHook(() => useWebSocket(url, { onOpen, onClose })); + + await act(async () => { + await sleep(1000); + }); + + expect(hooks.result.current.readyState).toBe(ReadyState.Closed); + + url = wsUrl; + hooks.rerender(); + + await act(async () => { + await wsServer.connected; + }); + + expect(hooks.result.current.readyState).toBe(ReadyState.Open); + expect(onOpen).toBeCalledTimes(1); + + act(() => wsServer.close()); + }); + + test('change socketUrl should connect correctly', async () => { + const wsUrl1 = 'ws://localhost:8888'; + const wsServer1 = new WS(wsUrl); + const wsServer2 = new WS(wsUrl1); + + const onOpen = vi.fn(); + const onClose = vi.fn(); + + let url = wsUrl; + const hooks = renderHook(() => useWebSocket(url, { onOpen, onClose, reconnectInterval: 300 })); + + expect(hooks.result.current.readyState).toBe(ReadyState.Connecting); + await act(async () => { + await wsServer1.connected; + }); + expect(hooks.result.current.readyState).toBe(ReadyState.Open); + + url = wsUrl1; + hooks.rerender(); + await act(async () => { + await wsServer2.connected; + }); + expect(hooks.result.current.readyState).toBe(ReadyState.Open); + + await act(async () => { + await sleep(3000); + }); + expect(onOpen).toBeCalledTimes(2); + expect(onClose).toBeCalledTimes(1); + + act(() => wsServer1.close()); + act(() => wsServer2.close()); + }); +}); diff --git a/packages/hooks/src/useWebSocket/__tests__/index.test.ts b/packages/hooks/src/useWebSocket/__tests__/index.test.ts deleted file mode 100644 index 73b85a1fc0..0000000000 --- a/packages/hooks/src/useWebSocket/__tests__/index.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { act, renderHook } from '@testing-library/react-hooks'; -import WS from 'jest-websocket-mock'; -import { sleep } from '../../utils/testingHelpers'; -import useWebSocket, { ReadyState } from '../index'; - -const promise: Promise = new Promise((resolve) => resolve()); -const wsUrl = 'ws://localhost:9999'; - -describe('useWebSocket', () => { - afterAll(() => { - WS.clean(); - }); - - it('should work', async () => { - const wsServer = new WS(wsUrl); - const hooks = renderHook(() => useWebSocket(wsUrl)); - - // connect - expect(hooks.result.current.readyState).toBe(ReadyState.Connecting); - expect(hooks.result.current.latestMessage).toBe(undefined); - await act(async () => { - await wsServer.connected; - return promise; - }); - expect(hooks.result.current.readyState).toBe(ReadyState.Open); - - // send message - const nowTime = `${Date.now()}`; - hooks.result.current.sendMessage?.(nowTime); - await expect(wsServer).toReceiveMessage(nowTime); - - // receive message - act(() => { - wsServer.send(nowTime); - }); - expect(hooks.result.current.latestMessage?.data).toBe(nowTime); - - // disconnect - act(() => wsServer.close()); - await act(async () => { - await wsServer.closed; - return promise; - }); - expect(hooks.result.current.readyState).toBe(ReadyState.Closed); - }); - - it('useWebSocket should be manually triggered', async () => { - const wsServer = new WS(wsUrl); - - // This line is needed for jest-ws-mock to start - new WebSocket(wsUrl); - - const hooks = renderHook(() => useWebSocket(wsUrl, { manual: true })); - - expect(hooks.result.current.readyState).toBe(ReadyState.Closed); - await act(async () => { - await wsServer.connected; - }); - - // We set "manual: true", so the connection status should be still closed. - expect(hooks.result.current.readyState).toBe(ReadyState.Closed); - - await act(async () => { - hooks.result.current.connect!(); - await sleep(100); // To make sure connection is established - }); - expect(hooks.result.current.readyState).toBe(ReadyState.Open); - - act(() => wsServer.close()); - }); -}); diff --git a/packages/hooks/src/useWebSocket/demo/demo1.tsx b/packages/hooks/src/useWebSocket/demo/demo1.tsx index 80ffe08a84..e003863499 100644 --- a/packages/hooks/src/useWebSocket/demo/demo1.tsx +++ b/packages/hooks/src/useWebSocket/demo/demo1.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useMemo } from 'react'; +import { useRef, useMemo } from 'react'; import { useWebSocket } from 'ahooks'; enum ReadyState { @@ -12,7 +12,7 @@ export default () => { const messageHistory = useRef([]); const { readyState, sendMessage, latestMessage, disconnect, connect } = useWebSocket( - 'wss://demo.piesocket.com/v3/channel_1?api_key=VCXCEuvhGcBDP7XhiJJUDvR1e1D3eiVjgZ9VRiaV¬ify_self', + 'wss://ws.postman-echo.com/raw', ); messageHistory.current = useMemo( diff --git a/packages/hooks/src/useWebSocket/index.en-US.md b/packages/hooks/src/useWebSocket/index.en-US.md index 5e742f042f..763a18681e 100644 --- a/packages/hooks/src/useWebSocket/index.en-US.md +++ b/packages/hooks/src/useWebSocket/index.en-US.md @@ -35,9 +35,9 @@ interface Options { interface Result { latestMessage?: WebSocketEventMap['message']; - sendMessage?: WebSocket['send']; - disconnect?: () => void; - connect?: () => void; + sendMessage: WebSocket['send']; + disconnect: () => void; + connect: () => void; readyState: ReadyState; webSocketIns?: WebSocket; } diff --git a/packages/hooks/src/useWebSocket/index.ts b/packages/hooks/src/useWebSocket/index.ts index 751e60b0ac..14edb47695 100644 --- a/packages/hooks/src/useWebSocket/index.ts +++ b/packages/hooks/src/useWebSocket/index.ts @@ -24,14 +24,14 @@ export interface Options { export interface Result { latestMessage?: WebSocketEventMap['message']; - sendMessage?: WebSocket['send']; - disconnect?: () => void; - connect?: () => void; + sendMessage: WebSocket['send']; + disconnect: () => void; + connect: () => void; readyState: ReadyState; webSocketIns?: WebSocket; } -export default function useWebSocket(socketUrl: string, options: Options = {}): Result { +function useWebSocket(socketUrl: string, options: Options = {}): Result { const { reconnectLimit = 3, reconnectInterval = 3 * 1000, @@ -43,19 +43,19 @@ export default function useWebSocket(socketUrl: string, options: Options = {}): protocols, } = options; + const [latestMessage, setLatestMessage] = useState(); + const [readyState, setReadyState] = useState(ReadyState.Closed); + const onOpenRef = useLatest(onOpen); const onCloseRef = useLatest(onClose); const onMessageRef = useLatest(onMessage); const onErrorRef = useLatest(onError); + const readyStateRef = useLatest(readyState); const reconnectTimesRef = useRef(0); - const reconnectTimerRef = useRef>(); - const websocketRef = useRef(); + const reconnectTimerRef = useRef>(undefined); - const unmountedRef = useRef(false); - - const [latestMessage, setLatestMessage] = useState(); - const [readyState, setReadyState] = useState(ReadyState.Closed); + const websocketRef = useRef(undefined); const reconnect = () => { if ( @@ -87,7 +87,7 @@ export default function useWebSocket(socketUrl: string, options: Options = {}): setReadyState(ReadyState.Connecting); ws.onerror = (event) => { - if (unmountedRef.current) { + if (websocketRef.current !== ws) { return; } reconnect(); @@ -95,7 +95,7 @@ export default function useWebSocket(socketUrl: string, options: Options = {}): setReadyState(ws.readyState || ReadyState.Closed); }; ws.onopen = (event) => { - if (unmountedRef.current) { + if (websocketRef.current !== ws) { return; } onOpenRef.current?.(event, ws); @@ -103,26 +103,29 @@ export default function useWebSocket(socketUrl: string, options: Options = {}): setReadyState(ws.readyState || ReadyState.Open); }; ws.onmessage = (message: WebSocketEventMap['message']) => { - if (unmountedRef.current) { + if (websocketRef.current !== ws) { return; } onMessageRef.current?.(message, ws); setLatestMessage(message); }; ws.onclose = (event) => { - if (unmountedRef.current) { - return; - } - reconnect(); onCloseRef.current?.(event, ws); - setReadyState(ws.readyState || ReadyState.Closed); + // closed by server + if (websocketRef.current === ws) { + reconnect(); + } + // closed by disconnect or closed by server + if (!websocketRef.current || websocketRef.current === ws) { + setReadyState(ws.readyState || ReadyState.Closed); + } }; websocketRef.current = ws; }; const sendMessage: WebSocket['send'] = (message) => { - if (readyState === ReadyState.Open) { + if (readyStateRef.current === ReadyState.Open) { websocketRef.current?.send(message); } else { throw new Error('WebSocket disconnected'); @@ -141,16 +144,16 @@ export default function useWebSocket(socketUrl: string, options: Options = {}): reconnectTimesRef.current = reconnectLimit; websocketRef.current?.close(); + websocketRef.current = undefined; }; useEffect(() => { - if (!manual) { + if (!manual && socketUrl) { connect(); } }, [socketUrl, manual]); useUnmount(() => { - unmountedRef.current = true; disconnect(); }); @@ -163,3 +166,5 @@ export default function useWebSocket(socketUrl: string, options: Options = {}): webSocketIns: websocketRef.current, }; } + +export default useWebSocket; diff --git a/packages/hooks/src/useWebSocket/index.zh-CN.md b/packages/hooks/src/useWebSocket/index.zh-CN.md index 5d21a2b41e..4d7f52a84d 100644 --- a/packages/hooks/src/useWebSocket/index.zh-CN.md +++ b/packages/hooks/src/useWebSocket/index.zh-CN.md @@ -35,9 +35,9 @@ interface Options { interface Result { latestMessage?: WebSocketEventMap['message']; - sendMessage?: WebSocket['send']; - disconnect?: () => void; - connect?: () => void; + sendMessage: WebSocket['send']; + disconnect: () => void; + connect: () => void; readyState: ReadyState; webSocketIns?: WebSocket; } diff --git a/packages/hooks/src/useWhyDidYouUpdate/__tests__/index.test.ts b/packages/hooks/src/useWhyDidYouUpdate/__tests__/index.spec.ts similarity index 79% rename from packages/hooks/src/useWhyDidYouUpdate/__tests__/index.test.ts rename to packages/hooks/src/useWhyDidYouUpdate/__tests__/index.spec.ts index 3069bf27c3..12bec746a0 100644 --- a/packages/hooks/src/useWhyDidYouUpdate/__tests__/index.test.ts +++ b/packages/hooks/src/useWhyDidYouUpdate/__tests__/index.spec.ts @@ -1,10 +1,11 @@ -import { renderHook, act } from '@testing-library/react-hooks'; -import useWhyDidYouUpdate from '../index'; +import { act, renderHook } from '@testing-library/react'; import { useState } from 'react'; +import { describe, expect, test, vi } from 'vitest'; +import useWhyDidYouUpdate from '../index'; describe('useWhyDidYouUpdate', () => { - it('should work', () => { - console.log = jest.fn(); + test('should work', () => { + console.log = vi.fn(); const setup = () => renderHook(() => { const [count, setCount] = useState(100); diff --git a/packages/hooks/src/useWhyDidYouUpdate/demo/demo1.tsx b/packages/hooks/src/useWhyDidYouUpdate/demo/demo1.tsx index ee1c86f581..00a121ecb9 100644 --- a/packages/hooks/src/useWhyDidYouUpdate/demo/demo1.tsx +++ b/packages/hooks/src/useWhyDidYouUpdate/demo/demo1.tsx @@ -7,7 +7,7 @@ */ import { useWhyDidYouUpdate } from 'ahooks'; -import React, { useState } from 'react'; +import { useState } from 'react'; const Demo: React.FC<{ count: number }> = (props) => { const [randomNum, setRandomNum] = useState(Math.random()); diff --git a/packages/hooks/src/useWhyDidYouUpdate/index.ts b/packages/hooks/src/useWhyDidYouUpdate/index.ts index 197f0ddc83..10a9031f0b 100644 --- a/packages/hooks/src/useWhyDidYouUpdate/index.ts +++ b/packages/hooks/src/useWhyDidYouUpdate/index.ts @@ -2,7 +2,7 @@ import { useEffect, useRef } from 'react'; export type IProps = Record; -export default function useWhyDidYouUpdate(componentName: string, props: IProps) { +function useWhyDidYouUpdate(componentName: string, props: IProps) { const prevProps = useRef({}); useEffect(() => { @@ -27,3 +27,5 @@ export default function useWhyDidYouUpdate(componentName: string, props: IProps) prevProps.current = props; }); } + +export default useWhyDidYouUpdate; diff --git a/packages/hooks/src/useWhyDidYouUpdate/index.zh-CN.md b/packages/hooks/src/useWhyDidYouUpdate/index.zh-CN.md index be9de5fb0f..9a43faea06 100644 --- a/packages/hooks/src/useWhyDidYouUpdate/index.zh-CN.md +++ b/packages/hooks/src/useWhyDidYouUpdate/index.zh-CN.md @@ -5,7 +5,7 @@ nav: # useWhyDidYouUpdate -帮助开发者排查是那个属性改变导致了组件的 rerender。 +帮助开发者排查是哪个属性改变导致了组件的 rerender。 ## 代码演示 diff --git a/packages/hooks/src/utils/__test__/index.spec.ts b/packages/hooks/src/utils/__tests__/index.spec.ts similarity index 94% rename from packages/hooks/src/utils/__test__/index.spec.ts rename to packages/hooks/src/utils/__tests__/index.spec.ts index e4850c9ae4..fb63fc19f3 100644 --- a/packages/hooks/src/utils/__test__/index.spec.ts +++ b/packages/hooks/src/utils/__tests__/index.spec.ts @@ -1,3 +1,4 @@ +import { describe, expect, test } from 'vitest'; import { isBoolean, isFunction, isNumber, isObject, isString, isUndef } from '../index'; describe('shared utils methods', () => { @@ -29,7 +30,7 @@ describe('shared utils methods', () => { test('isObject', () => { expect(isObject({})).toBe(true); expect(isObject([])).toBe(true); - expect(isObject(new RegExp(''))).toBe(true); + expect(isObject(/(?:)/)).toBe(true); expect(isObject(new Date())).toBe(true); expect(isObject(null)).toBe(false); diff --git a/packages/hooks/src/utils/createEffectWithTarget.ts b/packages/hooks/src/utils/createEffectWithTarget.ts index 4b82b66437..ed88dc6808 100644 --- a/packages/hooks/src/utils/createEffectWithTarget.ts +++ b/packages/hooks/src/utils/createEffectWithTarget.ts @@ -22,7 +22,7 @@ const createEffectWithTarget = (useEffectType: typeof useEffect | typeof useLayo const lastElementRef = useRef<(Element | null)[]>([]); const lastDepsRef = useRef([]); - const unLoadRef = useRef(); + const unLoadRef = useRef(undefined); useEffectType(() => { const targets = Array.isArray(target) ? target : [target]; @@ -40,8 +40,8 @@ const createEffectWithTarget = (useEffectType: typeof useEffect | typeof useLayo if ( els.length !== lastElementRef.current.length || - !depsAreSame(els, lastElementRef.current) || - !depsAreSame(deps, lastDepsRef.current) + !depsAreSame(lastElementRef.current, els) || + !depsAreSame(lastDepsRef.current, deps) ) { unLoadRef.current?.(); diff --git a/packages/hooks/src/utils/depsAreSame.ts b/packages/hooks/src/utils/depsAreSame.ts index 83b4b74b38..b6dc185589 100644 --- a/packages/hooks/src/utils/depsAreSame.ts +++ b/packages/hooks/src/utils/depsAreSame.ts @@ -1,9 +1,15 @@ import type { DependencyList } from 'react'; -export default function depsAreSame(oldDeps: DependencyList, deps: DependencyList): boolean { - if (oldDeps === deps) return true; +function depsAreSame(oldDeps: DependencyList, deps: DependencyList): boolean { + if (oldDeps === deps) { + return true; + } for (let i = 0; i < oldDeps.length; i++) { - if (!Object.is(oldDeps[i], deps[i])) return false; + if (!Object.is(oldDeps[i], deps[i])) { + return false; + } } return true; } + +export default depsAreSame; diff --git a/packages/hooks/src/utils/depsEqual.ts b/packages/hooks/src/utils/depsEqual.ts new file mode 100644 index 0000000000..7a76ccc514 --- /dev/null +++ b/packages/hooks/src/utils/depsEqual.ts @@ -0,0 +1,5 @@ +import type { DependencyList } from 'react'; +import isEqual from 'react-fast-compare'; + +export const depsEqual = (aDeps: DependencyList = [], bDeps: DependencyList = []) => + isEqual(aDeps, bDeps); diff --git a/packages/hooks/src/utils/domTarget.ts b/packages/hooks/src/utils/domTarget.ts index b7de1f628b..7ed13d1263 100644 --- a/packages/hooks/src/utils/domTarget.ts +++ b/packages/hooks/src/utils/domTarget.ts @@ -1,6 +1,6 @@ -import type { MutableRefObject } from 'react'; import { isFunction } from './index'; import isBrowser from './isBrowser'; +import type { RefObject } from 'react'; type TargetValue = T | undefined | null; @@ -9,7 +9,7 @@ type TargetType = HTMLElement | Element | Window | Document; export type BasicTarget = | (() => TargetValue) | TargetValue - | MutableRefObject>; + | RefObject>; export function getTargetElement(target: BasicTarget, defaultElement?: T) { if (!isBrowser) { diff --git a/packages/hooks/src/utils/getDocumentOrShadow.ts b/packages/hooks/src/utils/getDocumentOrShadow.ts index f4b6f21f18..b0d2d09efa 100644 --- a/packages/hooks/src/utils/getDocumentOrShadow.ts +++ b/packages/hooks/src/utils/getDocumentOrShadow.ts @@ -3,11 +3,16 @@ import { getTargetElement } from '../utils/domTarget'; declare type TargetValue = T | undefined | null; -const checkIfAllInShadow = (targets: BasicTarget[]): boolean => { +const checkIfAllInShadow = (targets: BasicTarget[]) => { return targets.every((item) => { const targetElement = getTargetElement(item); - if (!targetElement) return false; - if (targetElement.getRootNode() instanceof ShadowRoot) return true; + if (!targetElement) { + return false; + } + if (targetElement.getRootNode() instanceof ShadowRoot) { + return true; + } + return false; }); }; diff --git a/packages/hooks/src/utils/index.ts b/packages/hooks/src/utils/index.ts index 7f0efb1ba8..9cc2bcc7d3 100644 --- a/packages/hooks/src/utils/index.ts +++ b/packages/hooks/src/utils/index.ts @@ -1,7 +1,7 @@ export const isObject = (value: unknown): value is Record => value !== null && typeof value === 'object'; -export const isFunction = (value: unknown): value is Function => typeof value === 'function'; - +export const isFunction = (value: unknown): value is (...args: any) => any => + typeof value === 'function'; export const isString = (value: unknown): value is string => typeof value === 'string'; export const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean'; export const isNumber = (value: unknown): value is number => typeof value === 'number'; diff --git a/packages/hooks/src/utils/isAppleDevice.ts b/packages/hooks/src/utils/isAppleDevice.ts new file mode 100644 index 0000000000..b49a50a86d --- /dev/null +++ b/packages/hooks/src/utils/isAppleDevice.ts @@ -0,0 +1,5 @@ +const isAppleDevice = /(mac|iphone|ipod|ipad)/i.test( + typeof navigator !== 'undefined' ? navigator?.platform : '', +); + +export default isAppleDevice; diff --git a/packages/hooks/src/utils/lodash-polyfill.ts b/packages/hooks/src/utils/lodash-polyfill.ts new file mode 100644 index 0000000000..a02dd2a563 --- /dev/null +++ b/packages/hooks/src/utils/lodash-polyfill.ts @@ -0,0 +1,17 @@ +import debounce from 'lodash/debounce'; + +function isNodeOrWeb() { + const freeGlobal = + (typeof global === 'undefined' ? 'undefined' : typeof global) == 'object' && + global && + global.Object === Object && + global; + const freeSelf = typeof self == 'object' && self && self.Object === Object && self; + return freeGlobal || freeSelf; +} + +if (!isNodeOrWeb()) { + global.Date = Date; +} + +export { debounce }; diff --git a/packages/hooks/src/utils/noop.ts b/packages/hooks/src/utils/noop.ts new file mode 100644 index 0000000000..77787df8dd --- /dev/null +++ b/packages/hooks/src/utils/noop.ts @@ -0,0 +1,3 @@ +const noop = () => {}; + +export default noop; diff --git a/packages/hooks/src/utils/rect.ts b/packages/hooks/src/utils/rect.ts index 8397762974..4affdf8e66 100644 --- a/packages/hooks/src/utils/rect.ts +++ b/packages/hooks/src/utils/rect.ts @@ -1,5 +1,5 @@ const getScrollTop = (el: Document | Element) => { - if (el === document || el === document.body) { + if (el === document || el === document.documentElement || el === document.body) { return Math.max( window.pageYOffset, document.documentElement.scrollTop, diff --git a/packages/hooks/src/utils/testingHelpers.ts b/packages/hooks/src/utils/testingHelpers.ts index 6495d8af6a..d2375d593e 100644 --- a/packages/hooks/src/utils/testingHelpers.ts +++ b/packages/hooks/src/utils/testingHelpers.ts @@ -6,8 +6,8 @@ export function sleep(time: number) { }); } -export function request(req) { - return new Promise((resolve, reject) => +export function request(req: any) { + return new Promise((resolve, reject) => setTimeout(() => { if (req === 0) { reject(new Error('fail')); diff --git a/packages/hooks/src/utils/tests.tsx b/packages/hooks/src/utils/tests.tsx new file mode 100644 index 0000000000..0dcfda20c5 --- /dev/null +++ b/packages/hooks/src/utils/tests.tsx @@ -0,0 +1,11 @@ +import { StrictMode } from 'react'; +import { renderHook } from '@testing-library/react'; + +export * from '@testing-library/react'; + +const Wrapper = process.env.REACT_MODE === 'strict' ? StrictMode : undefined; + +const customRender: typeof renderHook = (ui, options) => + renderHook(ui, { wrapper: Wrapper, ...options }); + +export { customRender as renderHook }; diff --git a/packages/hooks/src/utils/useDeepCompareWithTarget.ts b/packages/hooks/src/utils/useDeepCompareWithTarget.ts index 237d835619..23414e1e1d 100644 --- a/packages/hooks/src/utils/useDeepCompareWithTarget.ts +++ b/packages/hooks/src/utils/useDeepCompareWithTarget.ts @@ -1,25 +1,21 @@ -import isEqual from 'lodash/isEqual'; import type { DependencyList, EffectCallback } from 'react'; import { useRef } from 'react'; import type { BasicTarget } from './domTarget'; import useEffectWithTarget from './useEffectWithTarget'; - -const depsEqual = (aDeps: DependencyList, bDeps: DependencyList = []) => { - return isEqual(aDeps, bDeps); -}; +import { depsEqual } from './depsEqual'; const useDeepCompareEffectWithTarget = ( effect: EffectCallback, deps: DependencyList, target: BasicTarget | BasicTarget[], ) => { - const ref = useRef(); + const ref = useRef(undefined); const signalRef = useRef(0); if (!depsEqual(deps, ref.current)) { - ref.current = deps; signalRef.current += 1; } + ref.current = deps; useEffectWithTarget(effect, [signalRef.current], target); }; diff --git a/packages/hooks/tsconfig.json b/packages/hooks/tsconfig.json index 35cc81c1ab..9536a0f413 100644 --- a/packages/hooks/tsconfig.json +++ b/packages/hooks/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "lib", - "composite": true - } + "extends": "../../tsconfig.base.json" } diff --git a/packages/hooks/tsconfig.pro.json b/packages/hooks/tsconfig.pro.json index e1d263d634..44fe6bd5d5 100644 --- a/packages/hooks/tsconfig.pro.json +++ b/packages/hooks/tsconfig.pro.json @@ -1,6 +1,8 @@ { "extends": "../../tsconfig.pro.json", "compilerOptions": { - "rootDir": "src" - } + "rootDir": "src", + "sourceMap": false + }, + "include": ["src"] } diff --git a/packages/hooks/vitest.config.ts b/packages/hooks/vitest.config.ts new file mode 100644 index 0000000000..03168bf835 --- /dev/null +++ b/packages/hooks/vitest.config.ts @@ -0,0 +1,20 @@ +import { resolve } from 'node:path'; +import { defineConfig } from 'vitest/config'; + +// https://cn.vitest.dev/guide/ +export default defineConfig({ + resolve: { + alias: { + src: resolve(__dirname, 'src'), + }, + }, + test: { + reporters: ['default', 'verbose'], + environment: 'jsdom', + include: ['src/**/__tests__/*.spec.ts?(x)'], + coverage: { + provider: 'istanbul', + include: ['src/**/*.ts'], + }, + }, +}); diff --git a/packages/hooks/webpack.config.js b/packages/hooks/webpack.config.js index 946c4cf784..1bff08b75c 100644 --- a/packages/hooks/webpack.config.js +++ b/packages/hooks/webpack.config.js @@ -1,6 +1,6 @@ -const merge = require('webpack-merge'); +const { merge } = require('webpack-merge'); const common = require('../../webpack.common.js'); -const path = require('path'); +const path = require('node:path'); module.exports = merge(common, { entry: './es/index.js', diff --git a/packages/use-url-state/README.md b/packages/use-url-state/README.md index eb9a9e9d94..8b52334d82 100644 --- a/packages/use-url-state/README.md +++ b/packages/use-url-state/README.md @@ -2,30 +2,42 @@ A hook that stores the state into url query parameters. +> Important +> +> This package is now published as `@ahooks.js/use-url-state`. +> +> If you were using the previous package name, please migrate to the new package name as soon as possible. + ## Installing Inside your React project directory, run the following: ```bash -yarn add @ahooksjs/use-url-state -S +yarn add @ahooks.js/use-url-state -S ``` Or with npm: ```bash -npm install @ahooksjs/use-url-state -S +npm install @ahooks.js/use-url-state -S ``` Or with pnpm ```bash -pnpm add @ahooksjs/use-url-state +pnpm add @ahooks.js/use-url-state +``` + +Or with Bun + +```bash +bun add @ahooks.js/use-url-state ``` ## Example ```javascript -import useUrlState from '@ahooksjs/use-url-state'; +import useUrlState from '@ahooks.js/use-url-state'; const [state, setState] = useUrlState({ demoCount: '1' }); ``` diff --git a/packages/use-url-state/src/__tests__/browser.test.tsx b/packages/use-url-state/__tests__/browser.spec.tsx similarity index 61% rename from packages/use-url-state/src/__tests__/browser.test.tsx rename to packages/use-url-state/__tests__/browser.spec.tsx index 924a2c0d80..be54dbf1f2 100644 --- a/packages/use-url-state/src/__tests__/browser.test.tsx +++ b/packages/use-url-state/__tests__/browser.spec.tsx @@ -1,8 +1,9 @@ -import { act } from '@testing-library/react-hooks/dom'; -import { setup } from '.'; +import { act } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import { setup } from './setup'; describe('useUrlState', () => { - it('state should be url search params', () => { + test('state should be url search params', () => { const res = setup([ { pathname: '/index', @@ -12,7 +13,7 @@ describe('useUrlState', () => { expect(res.state).toMatchObject({ count: '1' }); }); - it('url shoule be changed when use setState', () => { + test('url shoule be changed when use setState', () => { const res = setup(['/index']); expect(res.state).toMatchObject({}); act(() => { @@ -21,7 +22,7 @@ describe('useUrlState', () => { expect(res.state).toMatchObject({ count: '1' }); }); - it('multiple states should be work', () => { + test('multiple states should be work', () => { const res = setup(['/index']); act(() => { res.setState({ page: 1 }); @@ -32,7 +33,7 @@ describe('useUrlState', () => { expect(res.state).toMatchObject({ page: '1', pageSize: '10' }); }); - it('query-string options should work', async () => { + test('query-string options should work', async () => { const res = setup( [ { @@ -57,4 +58,19 @@ describe('useUrlState', () => { }); expect(res.state).toMatchObject({ foo: ['4', '5', '6'] }); }); + + test('location.state should be remain', () => { + const res = setup([ + { + pathname: '/index', + state: 'state', + }, + ]); + expect(res.location.state).toBe('state'); + act(() => { + res.setState({ count: 1 }); + }); + expect(res.state).toMatchObject({ count: '1' }); + expect(res.location.state).toBe('state'); + }); }); diff --git a/packages/use-url-state/src/__tests__/router.test.tsx b/packages/use-url-state/__tests__/router.spec.tsx similarity index 52% rename from packages/use-url-state/src/__tests__/router.test.tsx rename to packages/use-url-state/__tests__/router.spec.tsx index 1e4aa306eb..b871c93e45 100644 --- a/packages/use-url-state/src/__tests__/router.test.tsx +++ b/packages/use-url-state/__tests__/router.spec.tsx @@ -1,8 +1,9 @@ -import { act } from '@testing-library/react-hooks/dom'; -import { setup } from '.'; +import { act } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import { setup } from './setup'; describe('React Router V6', () => { - it('useUrlState should be work', () => { + test('useUrlState should be work', () => { const res = setup(['/index']); act(() => { res.setState({ count: 1 }); diff --git a/packages/use-url-state/src/__tests__/index.tsx b/packages/use-url-state/__tests__/setup.tsx similarity index 54% rename from packages/use-url-state/src/__tests__/index.tsx rename to packages/use-url-state/__tests__/setup.tsx index 4e8e8c8a96..200024b36a 100644 --- a/packages/use-url-state/src/__tests__/index.tsx +++ b/packages/use-url-state/__tests__/setup.tsx @@ -1,20 +1,21 @@ -import React from 'react'; import { render } from '@testing-library/react'; import type { MemoryRouterProps } from 'react-router'; -import { MemoryRouter } from 'react-router'; -import useUrlState from '..'; -import type { Options } from '..'; +import { MemoryRouter, useLocation } from 'react-router'; +import type { Options } from 'src'; +import useUrlState from 'src'; +import { expect, test } from 'vitest'; export const setup = ( initialEntries: MemoryRouterProps['initialEntries'], - initialState: any = {}, + baseState: any = {}, options?: Options, ) => { const res = {} as any; const Component = () => { - const [state, setState] = useUrlState(initialState, options); - Object.assign(res, { state, setState }); + const [state, setState] = useUrlState(baseState, options); + const location = useLocation(); + Object.assign(res, { state, setState, location }); return null; }; @@ -27,6 +28,6 @@ export const setup = ( return res; }; -it('useUrlState should be defined', () => { +test('useUrlState should be defined', () => { expect(useUrlState).toBeDefined(); }); diff --git a/packages/use-url-state/demo/demo1.tsx b/packages/use-url-state/demo/demo1.tsx index faa627e27e..da30e47768 100644 --- a/packages/use-url-state/demo/demo1.tsx +++ b/packages/use-url-state/demo/demo1.tsx @@ -6,8 +6,7 @@ * desc.zh-CN: 将状态同步到 url query 中。通过设置值为 `undefined`, 可以从 url query 上彻底删除某个属性,从而使用默认值。 */ -import React from 'react'; -import useUrlState from '@ahooksjs/use-url-state'; +import useUrlState from '@ahooks.js/use-url-state'; export default () => { const [state, setState] = useUrlState({ count: '1' }); @@ -17,7 +16,7 @@ export default () => { diff --git a/packages/use-url-state/demo/demo2.tsx b/packages/use-url-state/demo/demo2.tsx index e32923380d..20a96e4cf6 100644 --- a/packages/use-url-state/demo/demo2.tsx +++ b/packages/use-url-state/demo/demo2.tsx @@ -6,8 +6,7 @@ * desc.zh-CN: useUrlState 可以同时管理多个状态 */ -import React from 'react'; -import useUrlState from '@ahooksjs/use-url-state'; +import useUrlState from '@ahooks.js/use-url-state'; export default () => { const [state, setState] = useUrlState({ page: '1', pageSize: '10' }); @@ -19,14 +18,14 @@ export default () => { + + + +
+
+
+ pageSize: {pageSize.pageSize} + + + + + +
+
+ +
+ + ); +}; diff --git a/packages/use-url-state/package.json b/packages/use-url-state/package.json index 5080909645..64fc029c62 100644 --- a/packages/use-url-state/package.json +++ b/packages/use-url-state/package.json @@ -1,11 +1,11 @@ { - "name": "@ahooksjs/use-url-state", - "version": "3.5.0", + "name": "@ahooks.js/use-url-state", + "version": "3.6.0", "description": "A hook that stores the state into url query parameters.", "main": "./lib/index.js", "module": "./es/index.js", "types": "./lib/index.d.ts", - "unpkg": "dist/ahooks-use-url-state.js", + "unpkg": "dist/ahooks.js-use-url-state.js", "files": [ "dist", "lib", @@ -17,7 +17,10 @@ "url": "git+https://github.com/alibaba/hooks.git" }, "scripts": { - "build": "gulp && webpack-cli" + "build": "gulp && webpack-cli", + "test": "vitest run --color", + "test:cov": "vitest run --color --coverage", + "tsc": "tsc --noEmit" }, "publishConfig": { "registry": "https://registry.npmjs.org/" @@ -27,13 +30,16 @@ "url": "https://github.com/alibaba/hooks/issues" }, "homepage": "https://github.com/alibaba/hooks", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-router": "^5.0.0 || ^6.0.0" - }, + "gitHead": "11f6ad571bd365c95ecb9409ca3050cbbfc9b34a", "dependencies": { + "@babel/runtime": "^7.21.0", "ahooks": "^3.4.1", - "query-string": "^6.9.0" + "query-string": "^8.1.0", + "tslib": "^2.4.1" }, - "gitHead": "11f6ad571bd365c95ecb9409ca3050cbbfc9b34a" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-router": "^5.0.0 || ^6.0.0 || ^7.0.0" + } } diff --git a/packages/use-url-state/src/index.ts b/packages/use-url-state/src/index.ts index 0e45891036..d06d71bae8 100644 --- a/packages/use-url-state/src/index.ts +++ b/packages/use-url-state/src/index.ts @@ -1,5 +1,5 @@ import { useMemoizedFn, useUpdate } from 'ahooks'; -import { parse, stringify } from 'query-string'; +import qs from 'query-string'; import type { ParseOptions, StringifyOptions } from 'query-string'; import { useMemo, useRef } from 'react'; import type * as React from 'react'; @@ -27,35 +27,40 @@ const baseStringifyConfig: StringifyOptions = { type UrlState = Record; const useUrlState = ( - initialState?: S | (() => S), + baseState?: S | (() => S), options?: Options, ) => { - type State = Partial<{ [key in keyof S]: any }>; + type State = Partial<{ + [key in keyof S]: Required[key] extends any[] ? string[] : string; + }>; + const { navigateMode = 'push', parseOptions, stringifyOptions } = options || {}; const mergedParseOptions = { ...baseParseConfig, ...parseOptions }; - const mergedStringifyOptions = { ...baseStringifyConfig, ...stringifyOptions }; + const mergedStringifyOptions = { + ...baseStringifyConfig, + ...stringifyOptions, + }; const location = rc.useLocation(); // react-router v5 const history = rc.useHistory?.(); - // react-router v6 + + // react-router v6 & v7 const navigate = rc.useNavigate?.(); const update = useUpdate(); - const initialStateRef = useRef( - typeof initialState === 'function' ? (initialState as () => S)() : initialState || {}, - ); + const baseStateRef = useRef(typeof baseState === 'function' ? baseState() : baseState || {}); const queryFromUrl = useMemo(() => { - return parse(location.search, mergedParseOptions); + return qs.parse(location.search, mergedParseOptions); }, [location.search]); - const targetQuery: State = useMemo( + const targetQuery = useMemo( () => ({ - ...initialStateRef.current, + ...baseStateRef.current, ...queryFromUrl, }), [queryFromUrl], @@ -68,19 +73,23 @@ const useUrlState = ( // 2. update 和 history 的更新会合并,不会造成多次更新 update(); if (history) { - history[navigateMode]({ - hash: location.hash, - search: stringify({ ...queryFromUrl, ...newQuery }, mergedStringifyOptions) || '?', - }); + history[navigateMode]( + { + hash: location.hash, + search: qs.stringify({ ...queryFromUrl, ...newQuery }, mergedStringifyOptions) || '?', + }, + location.state, + ); } if (navigate) { navigate( { hash: location.hash, - search: stringify({ ...queryFromUrl, ...newQuery }, mergedStringifyOptions) || '?', + search: qs.stringify({ ...queryFromUrl, ...newQuery }, mergedStringifyOptions) || '?', }, { replace: navigateMode === 'replace', + state: location.state, }, ); } diff --git a/packages/use-url-state/tsconfig.json b/packages/use-url-state/tsconfig.json index 3176325368..261ece0beb 100644 --- a/packages/use-url-state/tsconfig.json +++ b/packages/use-url-state/tsconfig.json @@ -1,6 +1,9 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { - "rootDir": "src" + "baseUrl": ".", + "paths": { + "@ahooks.js/use-url-state": ["./src/index.ts"] + } } } diff --git a/packages/use-url-state/tsconfig.pro.json b/packages/use-url-state/tsconfig.pro.json index 13a203ae32..85fefd3089 100644 --- a/packages/use-url-state/tsconfig.pro.json +++ b/packages/use-url-state/tsconfig.pro.json @@ -3,5 +3,5 @@ "compilerOptions": { "rootDir": "src" }, - "references": [{ "path": "../hooks" }] + "include": ["src"] } diff --git a/packages/use-url-state/use-url-state.en-US.md b/packages/use-url-state/use-url-state.en-US.md index 985eeff1fa..13aeb3e7f4 100644 --- a/packages/use-url-state/use-url-state.en-US.md +++ b/packages/use-url-state/use-url-state.en-US.md @@ -9,32 +9,37 @@ group: A hook that store the state into url query. +> Important +> +> This package is now published as `@ahooks.js/use-url-state`. +> +> If you were using the previous package name, please migrate to the new package name as soon as possible. + ## Install ```bash -npm i @ahooksjs/use-url-state -S +npm i @ahooks.js/use-url-state -S ``` > This hook relies on useLocation & useHistory & useNavigate from `react-router`, to use this hook, you need to ensure > > 1\. Your project is using `react-router` version 5.0 or 6.0 to manage routing > -> 2\. Installed @ahooksjs/use-url-state - +> 2\. Installed @ahooks.js/use-url-state ## Usage ```js -import useUrlState from '@ahooksjs/use-url-state'; +import useUrlState from '@ahooks.js/use-url-state'; ``` ## Examples ### CodeSandbox Demo -React Router V5:https://codesandbox.io/s/suspicious-feather-cz4e0?file=/App.tsx +React Router V5: https://codesandbox.io/s/suspicious-feather-cz4e0?file=/App.tsx -React Router V6:https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx +React Router V6: https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx ### Default usage @@ -44,6 +49,10 @@ React Router V6:https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx +### Multi-state management (split) + + + ### Custom query-string options @@ -51,27 +60,27 @@ React Router V6:https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx ## API ```typescript -const [state, setState] = useUrlState(initialState, options); +const [state, setState] = useUrlState(baseState, options); ``` ### Params -| Property | Description | Type | Default | -|--------------|--------------------------------|----------------|---------| -| initialState | InitialState, same as useState | `S \| () => S` | - | -| options | Url config | `Options` | - | +| Property | Description | Type | Default | +| --------- | ---------------------------------------------------------------------------------------------- | -------------- | ------- | +| baseState | URL search params will be merged into BaseState | `S \| () => S` | - | +| options | Url config | `Options` | - | ### Options -| Property | Description | Type | Default | -|------------------|--------------------------------------------------------------------------------------------------------------|-----------------------|----------| -| navigateMode | Type of history navigate mode | `'push' \| 'replace'` | `'push'` | -| parseOptions | [parse](https://github.com/sindresorhus/query-string#parsestring-options) options of `query-string` | `ParseOptions` | - | -| stringifyOptions | [stringify](https://github.com/sindresorhus/query-string#stringifyobject-options) options of `query-string` | `StringifyOptions` | - | +| Property | Description | Type | Default | +| ---------------- | ----------------------------------------------------------------------------------------------------------- | --------------------- | -------- | +| navigateMode | Type of history navigate mode | `'push' \| 'replace'` | `'push'` | +| parseOptions | [parse](https://github.com/sindresorhus/query-string#parsestring-options) options of `query-string` | `ParseOptions` | - | +| stringifyOptions | [stringify](https://github.com/sindresorhus/query-string#stringifyobject-options) options of `query-string` | `StringifyOptions` | - | ### Result | Property | Description | Type | -|----------|----------------------------------------------|---------------------------------------------------| +| -------- | -------------------------------------------- | ------------------------------------------------- | | state | Url query object | `object` | | setState | Same as useState, but state should be object | `(state: S) => void \| (() => ((state: S) => S))` | diff --git a/packages/use-url-state/use-url-state.zh-CN.md b/packages/use-url-state/use-url-state.zh-CN.md index fafabed687..54347466fc 100644 --- a/packages/use-url-state/use-url-state.zh-CN.md +++ b/packages/use-url-state/use-url-state.zh-CN.md @@ -9,31 +9,37 @@ group: 通过 url query 来管理 state 的 Hook。 +> 重要提示 +> +> 当前包已使用新包名 `@ahooks.js/use-url-state` 发布。 +> +> 如果你之前使用的是旧包名,请尽快迁移到新的包名。 + ## 安装 ```bash -npm i @ahooksjs/use-url-state -S +npm i @ahooks.js/use-url-state -S ``` > 该 Hooks 基于 `react-router` 的 useLocation & useHistory & useNavigate 进行 query 管理,所以使用该 Hooks 之前,你需要保证 > > 1\. 你项目正在使用 `react-router` 5.x 或 6.x 版本来管理路由 > -> 2\. 独立安装了 @ahooksjs/use-url-state +> 2\. 独立安装了 @ahooks.js/use-url-state ## 使用 ```js -import useUrlState from '@ahooksjs/use-url-state'; +import useUrlState from '@ahooks.js/use-url-state'; ``` ## 代码演示 ### 在线演示 -React Router V5:https://codesandbox.io/s/suspicious-feather-cz4e0?file=/App.tsx +React Router V5: https://codesandbox.io/s/suspicious-feather-cz4e0?file=/App.tsx -React Router V6:https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx +React Router V6: https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx ### 基础用法 @@ -43,6 +49,10 @@ React Router V6:https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx +### 多状态管理(拆分) + + + ### 自定义 query-string 配置 @@ -50,20 +60,20 @@ React Router V6:https://codesandbox.io/s/autumn-shape-odrt9?file=/App.tsx ## API ```typescript -const [state, setState] = useUrlState(initialState, options); +const [state, setState] = useUrlState(baseState, options); ``` ### Params -| 参数 | 说明 | 类型 | 默认值 | -|--------------|----------|----------------|--------| -| initialState | 初始状态 | `S \| () => S` | - | -| options | url 配置 | `Options` | - | +| 参数 | 说明 | 类型 | 默认值 | +| --------- | -------------------------------------------------------------- | -------------- | ------ | +| baseState | 基准状态,URL 查询参数会在此基础上进行合并 | `S \| () => S` | - | +| options | url 配置 | `Options` | - | ### Options | 参数 | 说明 | 类型 | 默认值 | -|------------------|---------------------------------------------------------------------------------------------------------|-----------------------|----------| +| ---------------- | ------------------------------------------------------------------------------------------------------- | --------------------- | -------- | | navigateMode | 状态变更时切换 history 的方式 | `'push' \| 'replace'` | `'push'` | | parseOptions | `query-string` [parse](https://github.com/sindresorhus/query-string#parsestring-options) 的配置 | `ParseOptions` | - | | stringifyOptions | `query-string` [stringify](https://github.com/sindresorhus/query-string#stringifyobject-options) 的配置 | `StringifyOptions` | - | @@ -71,6 +81,6 @@ const [state, setState] = useUrlState(initialState, options); ### Result | 参数 | 说明 | 类型 | -|----------|-----------------------------------------|---------------------------------------------------| +| -------- | --------------------------------------- | ------------------------------------------------- | | state | url query 对象 | `object` | | setState | 用法同 useState,但 state 需要是 object | `(state: S) => void \| (() => ((state: S) => S))` | diff --git a/packages/use-url-state/vitest.config.ts b/packages/use-url-state/vitest.config.ts new file mode 100644 index 0000000000..8f5542aad4 --- /dev/null +++ b/packages/use-url-state/vitest.config.ts @@ -0,0 +1,20 @@ +import { resolve } from 'node:path'; +import { defineConfig } from 'vitest/config'; + +// https://cn.vitest.dev/guide/ +export default defineConfig({ + resolve: { + alias: { + src: resolve(__dirname, 'src'), + }, + }, + test: { + reporters: ['default', 'verbose'], + environment: 'jsdom', + include: ['__tests__/**/*.spec.ts?(x)'], + coverage: { + provider: 'istanbul', + include: ['src/**/*.ts'], + }, + }, +}); diff --git a/packages/use-url-state/webpack.config.js b/packages/use-url-state/webpack.config.js index 8f436173dd..33f521b243 100644 --- a/packages/use-url-state/webpack.config.js +++ b/packages/use-url-state/webpack.config.js @@ -1,12 +1,12 @@ -const merge = require('webpack-merge'); +const { merge } = require('webpack-merge'); const common = require('../../webpack.common.js'); -const path = require('path'); +const path = require('node:path'); module.exports = merge(common, { entry: './es/index.js', output: { - filename: 'ahooks-use-url-state.js', - library: 'ahooksUseUrlState', + filename: 'ahooks.js-use-url-state.js', + library: 'ahooksJsUseUrlState', path: path.resolve(__dirname, './dist'), }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d57a9ceba3..5e0ffa241e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3711 +1,10419 @@ -lockfileVersion: 5.4 +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false importers: + .: - specifiers: - '@ant-design/icons': ^4.6.2 - '@babel/cli': ^7.10.1 - '@babel/core': ^7.10.2 - '@babel/plugin-transform-runtime': ^7.19.6 - '@commitlint/cli': ^17.1.2 - '@commitlint/config-conventional': ^17.1.0 - '@testing-library/react': ^10.0.4 - '@testing-library/react-hooks': ^8.0.1 - '@types/jest': ^27.4.1 - '@types/lodash.debounce': ^4.0.6 - '@types/lodash.isequal': ^4.5.5 - '@types/lodash.throttle': ^4.1.6 - '@types/react-router': ^5.1.18 - '@umijs/fabric': ^2.1.0 - '@umijs/plugin-sass': ^1.1.1 - antd: ^4.3.3 - babel-loader: ^8.1.0 - babel-plugin-import: ^1.12.0 - babel-plugin-transform-async-to-promises: ^0.8.15 - coveralls: ^3.1.1 - del: ^5.1.0 - dumi: ^1.1.48 - enzyme: ^3.10.0 - eslint: ^7.2.0 - eslint-plugin-react-hooks: ^4.0.8 - fast-glob: ^3.2.11 - fs-extra: ^10.0.1 - gray-matter: ^4.0.3 - gulp: ^4.0.2 - gulp-babel: ^8.0.0 - gulp-typescript: ^6.0.0-alpha.1 - husky: ^8.0.0 - jest: ^27.5.1 - jest-fetch-mock: ^3.0.3 - jest-localstorage-mock: ^2.4.18 - mockjs: ^1.1.0 - prettier: ^2.0.5 - pretty-quick: ^3.1.3 - react: ^16.8.6 - react-dom: ^16.8.6 - react-drag-listview: ^0.1.6 - react-shadow: ^19.0.3 - react-test-renderer: ^16.13.1 - rimraf: ^3.0.2 - surge: ^0.21.3 - ts-jest: ^27.1.5 - typescript: ^4.8.4 - umi-request: ^1.2.18 - webpack: ^4.43.0 - webpack-cli: ^3.3.10 - webpack-merge: ^4.2.2 devDependencies: - '@ant-design/icons': 4.7.0_wcqkhtmu7mswc6yz4uyexck3ty - '@babel/cli': 7.19.3_@babel+core@7.19.3 - '@babel/core': 7.19.3 - '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.19.3 - '@commitlint/cli': 17.1.2 - '@commitlint/config-conventional': 17.1.0 - '@testing-library/react': 10.4.9_wcqkhtmu7mswc6yz4uyexck3ty - '@testing-library/react-hooks': 8.0.1_dahwe3hk4b2k22ca2w2l5lt4hq - '@types/jest': 27.5.2 - '@types/lodash.debounce': 4.0.7 - '@types/lodash.isequal': 4.5.6 - '@types/lodash.throttle': 4.1.7 - '@types/react-router': 5.1.19 - '@umijs/fabric': 2.14.0 - '@umijs/plugin-sass': 1.1.1_umi@3.5.34+webpack@4.46.0 - antd: 4.23.5_wcqkhtmu7mswc6yz4uyexck3ty - babel-loader: 8.2.5_jeg5564y5etyvi3ajplf6yhqg4 - babel-plugin-import: 1.13.5 - babel-plugin-transform-async-to-promises: 0.8.18 - coveralls: 3.1.1 - del: 5.1.0 - dumi: 1.1.48_fjf7j24wwzs3gehcua7brldgwi - enzyme: 3.11.0 - eslint: 7.32.0 - eslint-plugin-react-hooks: 4.6.0_eslint@7.32.0 - fast-glob: 3.2.12 - fs-extra: 10.1.0 - gray-matter: 4.0.3 - gulp: 4.0.2 - gulp-babel: 8.0.0_@babel+core@7.19.3 - gulp-typescript: 6.0.0-alpha.1_typescript@4.8.4 - husky: 8.0.1 - jest: 27.5.1_ts-node@10.9.1 - jest-fetch-mock: 3.0.3 - jest-localstorage-mock: 2.4.22 - mockjs: 1.1.0 - prettier: 2.7.1 - pretty-quick: 3.1.3_prettier@2.7.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-drag-listview: 0.1.9 - react-shadow: 19.0.3_ccrd4luiijsxnlhe6bgkvyy2z4 - react-test-renderer: 16.14.0_react@16.14.0 - rimraf: 3.0.2 - surge: 0.21.7 - ts-jest: 27.1.5_zgo3ukr7wfsrfu7w73hol4lxpy - typescript: 4.8.4 - umi-request: 1.4.0 - webpack: 4.46.0_webpack-cli@3.3.12 - webpack-cli: 3.3.12_webpack@4.46.0 - webpack-merge: 4.2.2 + '@alifd/next': + specifier: ^1.27.32 + version: 1.27.32(@alifd/meet-react@2.9.9(rax@1.2.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(moment@2.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@ant-design/icons': + specifier: ^5.6.1 + version: 5.6.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@babel/cli': + specifier: ^7.10.1 + version: 7.28.3(@babel/core@7.28.3) + '@babel/core': + specifier: ^7.10.2 + version: 7.28.3 + '@babel/plugin-transform-runtime': + specifier: ^7.19.6 + version: 7.28.3(@babel/core@7.28.3) + '@biomejs/biome': + specifier: ^2.0.6 + version: 2.2.2 + '@commitlint/cli': + specifier: ^17.1.2 + version: 17.8.1 + '@commitlint/config-conventional': + specifier: ^17.1.0 + version: 17.8.1 + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.7(@types/react@19.1.11))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@types/lodash': + specifier: ^4.17.20 + version: 4.17.20 + '@types/mockjs': + specifier: ^1.0.7 + version: 1.0.10 + '@types/react': + specifier: ^19.1.8 + version: 19.1.11 + '@types/react-dom': + specifier: ^19.1.6 + version: 19.1.7(@types/react@19.1.11) + '@types/react-router': + specifier: ^5.1.19 + version: 5.1.20 + '@umijs/fabric': + specifier: ^2.1.0 + version: 2.14.1 + '@vitest/coverage-istanbul': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1)) + antd: + specifier: ^5.26.3 + version: 5.27.1(moment@2.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + babel-plugin-import: + specifier: ^1.12.0 + version: 1.13.8 + coveralls: + specifier: ^3.1.1 + version: 3.1.1 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + czg: + specifier: ^1.12.0 + version: 1.12.0 + del: + specifier: ^5.1.0 + version: 5.1.0 + dumi: + specifier: ^1.1.54 + version: 1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + fast-glob: + specifier: ^3.2.11 + version: 3.3.3 + fs-extra: + specifier: ^10.0.1 + version: 10.1.0 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + gulp: + specifier: ^4.0.2 + version: 4.0.2 + gulp-babel: + specifier: ^8.0.0 + version: 8.0.0(@babel/core@7.28.3) + gulp-typescript: + specifier: ^6.0.0-alpha.1 + version: 6.0.0-alpha.1(typescript@5.9.2) + husky: + specifier: ^8.0.0 + version: 8.0.3 + jsdom: + specifier: ^26.1.0 + version: 26.1.0 + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + react: + specifier: ^19.1.0 + version: 19.1.1 + react-dom: + specifier: ^19.1.0 + version: 19.1.1(react@19.1.1) + react-drag-listview: + specifier: ^0.1.6 + version: 0.1.9 + react-json-view: + specifier: ^1.21.3 + version: 1.21.3(@types/react@19.1.11)(encoding@0.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: + specifier: ^6.4.2 + version: 6.30.1(react@19.1.1) + react-shadow: + specifier: ^20.6.0 + version: 20.6.0(prop-types@15.8.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + surge: + specifier: ^0.21.3 + version: 0.21.7 + typescript: + specifier: ^5.8.3 + version: 5.9.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1) + vitest-websocket-mock: + specifier: ^0.5.0 + version: 0.5.0(vitest@3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1)) + webpack: + specifier: ^5.99.9 + version: 5.101.3(webpack-cli@6.0.1) + webpack-cli: + specifier: ^6.0.1 + version: 6.0.1(webpack@5.101.3) + webpack-merge: + specifier: ^6.0.1 + version: 6.0.1 packages/hooks: - specifiers: - '@alifd/next': ^1.20.6 - '@ant-design/icons': ^4.6.2 - '@types/enzyme': ^3.10.5 - '@types/js-cookie': ^2.x.x - ahooks-v3-count: ^1.0.0 - antd: ^4.16.9 - dayjs: ^1.9.1 - enzyme-adapter-react-16: ^1.15.4 - intersection-observer: ^0.12.0 - jest-websocket-mock: ^2.1.0 - js-cookie: ^2.x.x - lodash: ^4.17.21 - mock-socket: ^9.0.3 - mockjs: ^1.1.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-drag-listview: ^0.1.6 - resize-observer-polyfill: ^1.5.1 - screenfull: ^5.0.0 - dependencies: - '@types/js-cookie': 2.2.6 - ahooks-v3-count: 1.0.0 - dayjs: 1.11.5 - intersection-observer: 0.12.2 - js-cookie: 2.2.1 - lodash: 4.17.21 - react: 16.14.0 - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - devDependencies: - '@alifd/next': 1.26.3_rcrfyqkiphnw6njnjnll5ybc24 - '@ant-design/icons': 4.7.0_wcqkhtmu7mswc6yz4uyexck3ty - '@types/enzyme': 3.10.12 - antd: 4.23.5_wcqkhtmu7mswc6yz4uyexck3ty - enzyme-adapter-react-16: 1.15.6_j6bpv5pizkyfppcg2tmva6pmii - jest-websocket-mock: 2.4.0 - mock-socket: 9.1.5 - mockjs: 1.1.0 - react-drag-listview: 0.1.9 + dependencies: + '@babel/runtime': + specifier: ^7.21.0 + version: 7.28.3 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + dayjs: + specifier: ^1.9.1 + version: 1.11.13 + intersection-observer: + specifier: ^0.12.0 + version: 0.12.2 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + react: + specifier: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + version: 19.1.1 + react-dom: + specifier: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + version: 19.1.1(react@19.1.1) + react-fast-compare: + specifier: ^3.2.2 + version: 3.2.2 + resize-observer-polyfill: + specifier: ^1.5.1 + version: 1.5.1 + screenfull: + specifier: ^5.0.0 + version: 5.2.0 + tslib: + specifier: ^2.4.1 + version: 2.8.1 packages/use-url-state: - specifiers: - ahooks: ^3.4.1 - query-string: ^6.9.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-router: ^5.0.0 || ^6.0.0 dependencies: - ahooks: link:../hooks - query-string: 6.14.1 - react: 16.14.0 - react-router: 6.4.2_react@16.14.0 + '@babel/runtime': + specifier: ^7.21.0 + version: 7.28.3 + ahooks: + specifier: ^3.4.1 + version: 3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + query-string: + specifier: ^8.1.0 + version: 8.2.0 + react: + specifier: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + version: 19.1.1 + react-dom: + specifier: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + version: 19.1.1(react@19.1.1) + react-router: + specifier: ^5.0.0 || ^6.0.0 || ^7.0.0 + version: 6.30.1(react@19.1.1) + tslib: + specifier: ^2.4.1 + version: 2.8.1 packages: - /@alifd/field/1.5.8: - resolution: - { - integrity: sha512-RBbwEeex2lb9fFjsXU3wJp2FZGPS75svKzOcDb9ZtKHiVU3byD6zuB0/hzJ9Exb0DkOgykFc6gF76QoaYF4+Ug==, - } - dependencies: - '@alifd/validate': 1.2.3 - prop-types: 15.8.1 - dev: true - /@alifd/field/1.6.0: - resolution: - { - integrity: sha512-EI8rpMlD/JCdDSYF5z5Ssato6n4WDQgGSChC9rP1CVWS/++h4uTPSjYsoW4U9BPPMmm3grlOxWP4Fo03GlSc/Q==, - } - dependencies: - '@alifd/validate': 1.4.0 - prop-types: 15.8.1 - dev: true + '@alifd/babel-runtime-jsx-style-transform@1.0.0': + resolution: {integrity: sha512-+9K1r90w1XxN8b/Z45RxzH3NpwKgyi7BxyMg03vkF6LS4anKAuT3bPtamXBGDU871aGnjNelM8TndLkDQcKupA==} + + '@alifd/field@1.7.0': + resolution: {integrity: sha512-rXqtuJudWaSl+1EOjUqr1OHUh8PWnzvyMmm6sKev9uTbctrt+pHEkRh3fbXebJhtEXgZbqhh/UM2afqy1nIIeA==} + + '@alifd/field@2.0.4': + resolution: {integrity: sha512-CE+WsMmxuCYgJ6dlRnNexQA7pl172OF6SyaHXTs+cO3ITM3UgmFvl+G8urRjWFxCFGigzLv0IpPu8KeP07VZAA==} - /@alifd/meet-react-component-one/1.3.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-1gT+AAMR2SHmFQ2QbBeuLwWfdYfBbsM9FY82RLD7bG3l6G6pWD+BvDHolMWUHWDPc0fGwk2FfxmOk5ehtu7uyQ==, - } + '@alifd/meet-react-component-one@1.3.2': + resolution: {integrity: sha512-KxcBKh0q4hOubOL83jflfttPz5ikjL9HW1C5HDBhBHOGR1z9/vyi0feUL7XUrXvKcCcILq8DRXy1qTiJsP0MZw==} peerDependencies: - react: ^16.13.1 - react-dom: ^16.13.1 - dependencies: - '@gcanvas/core': 1.0.0 - classnames: 2.3.2 - omit.js: 2.0.2 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - style-unit: 2.0.1 - swiper: 6.5.0 - tslib: 2.4.0 - universal-env: 3.3.3 - universal-panresponder: 0.6.5 - universal-transition: 1.1.1 - dev: true + react: '>=16.13.1' + react-dom: '>=16.13.1' - /@alifd/meet-react/2.8.4_yldoxidluzkdxsgixbg2aq5mdu: - resolution: - { - integrity: sha512-7BK0MrjxbkRFSNOBOkvOOh2DTql/VPJdmx4jw10z09AoZZaiqnCswuj3izVJ6ec/AHBXJZYjzzOBg2y6TIOvwA==, - } + '@alifd/meet-react@2.9.9': + resolution: {integrity: sha512-l8xUMwMpgdMlwsC2+8apAu22MCiCYan5S/36RxT0SfAbHp2O5ggov5gw0uAA108DIsQd7cV/5adW+kWHnN8sOg==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - dependencies: - '@alifd/field': 1.6.0 - '@alifd/meet-react-component-one': 1.3.0_wcqkhtmu7mswc6yz4uyexck3ty - '@uni/clipboard': 1.0.9 - '@uni/env': 1.1.0 - '@uni/file': 1.1.1 - '@uni/image': 1.1.3 - '@uni/navigate': 1.0.10 - '@uni/page-scroll-to': 1.0.0 - '@uni/vibrate': 1.0.1 - babel-runtime-jsx-style-transform: 1.0.2 - classnames: 2.2.6 - dayjs: 1.11.5 - driver-universal: 3.5.0 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - tslib: 2.4.0 - universal-canvas-context: 1.0.0 - universal-choose-image: 1.3.0_rax@1.2.2 - universal-element: 0.0.6 - transitivePeerDependencies: - - rax - dev: true - /@alifd/next/1.26.3_rcrfyqkiphnw6njnjnll5ybc24: - resolution: - { - integrity: sha512-GPqh5ZFod7ei4mkYw341OkP4swHmwMTfkz+WuD1Q+d+OgoKrlLHVAs0L2CfAfslOR2BGAVkEtwV0LFzsw2LfsQ==, - } + '@alifd/next@1.27.32': + resolution: {integrity: sha512-IuPLCSseVnC20Sh/O56uM17wUZhFD6zsxteljE+MeyWdWkxV55OwlKV5ASzNsaC8WJAr4lVkwq9xNj4sgg8tcA==} peerDependencies: '@alifd/meet-react': ^2.0.0 moment: ^2.22.1 react: '>=16.0.0' react-dom: '>=16.0.0' - dependencies: - '@alifd/field': 1.5.8 - '@alifd/meet-react': 2.8.4_yldoxidluzkdxsgixbg2aq5mdu - '@alifd/overlay': 0.2.11 - '@alifd/validate': 1.2.3 - babel-runtime: 6.26.0 - big.js: 6.2.1 - classnames: 2.3.2 - dayjs: 1.11.5 - hoist-non-react-statics: 3.3.2 - lodash.clonedeep: 4.5.0 - moment: 2.29.4 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-lifecycles-compat: 3.0.4 - react-transition-group: 2.9.0_wcqkhtmu7mswc6yz4uyexck3ty - resize-observer-polyfill: 1.5.1 - shallow-element-equals: 1.0.1 - dev: true - /@alifd/overlay/0.2.11: - resolution: - { - integrity: sha512-O/UNWFYfsvHBMEd9xKEhSuU3DLK3MllqWr+PAhQUgbtdKKSvmOuCylNsR9eQDQ8NRG12qj6fmCq3UXZr5c4XTA==, - } - dependencies: - resize-observer-polyfill: 1.5.1 - dev: true - - /@alifd/validate/1.2.3: - resolution: - { - integrity: sha512-ggSBfpl3H8M2OEM95zC9NQc4cBvne/Eq4mTHZHWtqYI/6Vnz0k1fGx3hnYsdGu3c3hF4l6sUDPulactM6lSXtA==, - } - dev: true - - /@alifd/validate/1.4.0: - resolution: - { - integrity: sha512-RNayg1HVrJBhP5wOmjRq9x0xCC/2H1isDy038V69ggPyAP0k+3JAzIZKNkDoCLJlF4dWPCcsSwXaJafr0A60Wg==, - } - dev: true - - /@ampproject/remapping/2.2.0: - resolution: - { - integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.16 - dev: true - - /@ant-design/colors/6.0.0: - resolution: - { - integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==, - } - dependencies: - '@ctrl/tinycolor': 3.4.1 - dev: true - - /@ant-design/icons-svg/4.2.1: - resolution: - { - integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==, - } - dev: true - - /@ant-design/icons/4.7.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==, - } - engines: { node: '>=8' } + '@alifd/overlay@0.3.7': + resolution: {integrity: sha512-LZszG+YYR7A/yN/vXoiPjnr6Ppc8eanV8PaqDwuxvbSqqXM/CxRPdIsS5cvoOtiOBxeGHUYCYPONB+nJg52hhA==} + + '@alifd/validate@1.4.0': + resolution: {integrity: sha512-RNayg1HVrJBhP5wOmjRq9x0xCC/2H1isDy038V69ggPyAP0k+3JAzIZKNkDoCLJlF4dWPCcsSwXaJafr0A60Wg==} + + '@alifd/validate@2.0.3': + resolution: {integrity: sha512-xwA5XvpKhHIrYqpZ4gldppQ/bIIqqik1TMhtjLidi+LeIdRlxRc1NVC3FW9iF/6nPfiK3PhNpTYOjavQT0nKPQ==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@ant-design/colors@7.2.1': + resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==} + + '@ant-design/cssinjs-utils@1.1.3': + resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@ant-design/cssinjs@1.24.0': + resolution: {integrity: sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==} 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.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /@ant-design/react-slick/0.29.2_react@16.14.0: - resolution: - { - integrity: sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==, - } + + '@ant-design/fast-color@2.0.6': + resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} + engines: {node: '>=8.x'} + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons@5.6.1': + resolution: {integrity: sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + '@ant-design/react-slick@1.1.2': + resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} peerDependencies: react: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - json2mq: 0.2.0 - lodash: 4.17.21 - react: 16.14.0 - resize-observer-polyfill: 1.5.1 - dev: true - - /@babel/cli/7.19.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==, - } - engines: { node: '>=6.9.0' } + + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@babel/cli@7.28.3': + resolution: {integrity: sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg==} + engines: {node: '>=6.9.0'} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@jridgewell/trace-mapping': 0.3.16 - commander: 4.1.1 - convert-source-map: 1.9.0 - fs-readdir-recursive: 1.1.0 - glob: 7.2.3 - make-dir: 2.1.0 - slash: 2.0.0 - optionalDependencies: - '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 - chokidar: 3.5.3 - dev: true - - /@babel/code-frame/7.12.11: - resolution: - { - integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==, - } - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/code-frame/7.18.6: - resolution: - { - integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/compat-data/7.19.4: - resolution: - { - integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/core/7.19.3: - resolution: - { - integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.5 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helpers': 7.19.4 - '@babel/parser': 7.19.4 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/eslint-parser/7.19.1_mmbyq476xpa6tuwz6732ekfpz4: - resolution: - { - integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || >=14.0.0 } + + '@babel/code-frame@7.12.11': + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.18.6': + resolution: {integrity: sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.28.0': + resolution: {integrity: sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: - '@babel/core': '>=7.11.0' - eslint: ^7.5.0 || ^8.0.0 - dependencies: - '@babel/core': 7.19.3 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 7.32.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.0 - dev: true - - /@babel/generator/7.19.5: - resolution: - { - integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: true - - /@babel/helper-annotate-as-pure/7.18.6: - resolution: - { - integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: - resolution: - { - integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==, - } - engines: { node: '>=6.9.0' } + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + + '@babel/generator@7.18.6': + resolution: {integrity: sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.4 - '@babel/core': 7.19.3 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - semver: 6.3.0 - dev: true - - /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==, - } - engines: { node: '>=6.9.0' } + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==, - } - engines: { node: '>=6.9.0' } + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.2.1 - dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==, - } + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-environment-visitor/7.18.9: - resolution: - { - integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-explode-assignable-expression/7.18.6: - resolution: - { - integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-function-name/7.19.0: - resolution: - { - integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-hoist-variables/7.18.6: - resolution: - { - integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-member-expression-to-functions/7.18.9: - resolution: - { - integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-module-imports/7.18.6: - resolution: - { - integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-module-transforms/7.19.0: - resolution: - { - integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.19.4 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-optimise-call-expression/7.18.6: - resolution: - { - integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-plugin-utils/7.19.0: - resolution: - { - integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==, - } - engines: { node: '>=6.9.0' } + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-replace-supers/7.19.1: - resolution: - { - integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-simple-access/7.19.4: - resolution: - { - integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers/7.18.9: - resolution: - { - integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-split-export-declaration/7.18.6: - resolution: - { - integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-string-parser/7.19.4: - resolution: - { - integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-validator-identifier/7.19.1: - resolution: - { - integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-validator-option/7.18.6: - resolution: - { - integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==, - } - engines: { node: '>=6.9.0' } - dev: true - - /@babel/helper-wrap-function/7.19.0: - resolution: - { - integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-function-name': 7.19.0 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helpers/7.19.4: - resolution: - { - integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/highlight/7.18.6: - resolution: - { - integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser/7.19.4: - resolution: - { - integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==, - } - engines: { node: '>=6.0.0' } + '@babel/helper-simple-access@7.27.1': + resolution: {integrity: sha512-OU4zVQrJgFBNXMjrHs1yFSdlTgufO4tefcUZoqNhukVfw0p8x1Asht/gcGZ3bpHbi8gu/76m4JhrlKPqkrs/WQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.19.4 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.19.3: - resolution: - { - integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==, - } - engines: { node: '>=6.9.0' } + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, - } - engines: { node: '>=6.9.0' } + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==, - } - engines: { node: '>=6.9.0' } + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-decorators/7.19.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-MbgXtNXqo7RTKYIXVchVJGPvaVufQH3pxvQyfbGvNw1DObIhph+PesYXJTcd8J4DdWibvf6Z2eanOyItX8WnJg==, - } - engines: { node: '>=6.9.0' } + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-syntax-decorators': 7.19.0_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-object-rest-spread/7.19.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.4 - '@babel/core': 7.19.3 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.3 - dev: true - - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==, - } - engines: { node: '>=4' } + + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.3': + resolution: {integrity: sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.19.3: - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.19.3: - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-decorators/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, - } + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, - } + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.19.3: - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-modules-commonjs@7.18.6': + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.19.3: - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-block-scoping/7.19.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==, - } - engines: { node: '>=6.9.0' } - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-destructuring/7.19.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.19.3: - resolution: - { - integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.19.4 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-regenerator@7.28.3': + resolution: {integrity: sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.19.3: - resolution: - { - integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-runtime@7.28.3': + resolution: {integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.19.3: - resolution: - { - integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 - dev: true - /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3 - '@babel/types': 7.19.4 - dev: true - - /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==, - } - engines: { node: '>=6.9.0' } + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.19.3 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.19.3 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.19.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==, - } - engines: { node: '>=6.9.0' } + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true + '@babel/core': ^7.0.0 - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==, - } - engines: { node: '>=6.9.0' } + '@babel/preset-env@7.28.3': + resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: true - - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==, - } - engines: { node: '>=6.9.0' } + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==, - } - engines: { node: '>=6.9.0' } + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.19.3: - resolution: - { - integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==, - } - engines: { node: '>=6.9.0' } + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-typescript/7.19.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==, - } - engines: { node: '>=6.9.0' } + '@babel/runtime@7.18.6': + resolution: {integrity: sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.18.6': + resolution: {integrity: sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.18.6': + resolution: {integrity: sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.2.2': + resolution: {integrity: sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.2.2': + resolution: {integrity: sha512-6ePfbCeCPryWu0CXlzsWNZgVz/kBEvHiPyNpmViSt6A2eoDf4kXs3YnwQPzGjy8oBgQulrHcLnJL0nkCh80mlQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.2.2': + resolution: {integrity: sha512-Tn4JmVO+rXsbRslml7FvKaNrlgUeJot++FkvYIhl1OkslVCofAtS35MPlBMhXgKWF9RNr9cwHanrPTUUXcYGag==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.2.2': + resolution: {integrity: sha512-/MhYg+Bd6renn6i1ylGFL5snYUn/Ct7zoGVKhxnro3bwekiZYE8Kl39BSb0MeuqM+72sThkQv4TnNubU9njQRw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.2.2': + resolution: {integrity: sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.2.2': + resolution: {integrity: sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.2.2': + resolution: {integrity: sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.2.2': + resolution: {integrity: sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.2.2': + resolution: {integrity: sha512-DAuHhHekGfiGb6lCcsT4UyxQmVwQiBCBUMwVra/dcOSs9q8OhfaZgey51MlekT3p8UwRqtXQfFuEJBhJNdLZwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@bloomberg/record-tuple-polyfill@0.0.3': + resolution: {integrity: sha512-sBnCqW0nqofE47mxFnw+lvx6kzsQstwaQMVkh66qm/A6IlsnH7WsyGuVXTou8RF2wL4W7ybOoHPvP2WgIo6rhQ==} + + '@commitlint/cli@17.8.1': + resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} + engines: {node: '>=v14'} + hasBin: true + + '@commitlint/config-conventional@17.8.1': + resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==} + engines: {node: '>=v14'} + + '@commitlint/config-validator@17.8.1': + resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} + engines: {node: '>=v14'} + + '@commitlint/ensure@17.8.1': + resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} + engines: {node: '>=v14'} + + '@commitlint/execute-rule@17.8.1': + resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} + engines: {node: '>=v14'} + + '@commitlint/format@17.8.1': + resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} + engines: {node: '>=v14'} + + '@commitlint/is-ignored@17.8.1': + resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} + engines: {node: '>=v14'} + + '@commitlint/lint@17.8.1': + resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} + engines: {node: '>=v14'} + + '@commitlint/load@17.8.1': + resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} + engines: {node: '>=v14'} + + '@commitlint/message@17.8.1': + resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} + engines: {node: '>=v14'} + + '@commitlint/parse@17.8.1': + resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} + engines: {node: '>=v14'} + + '@commitlint/read@17.8.1': + resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} + engines: {node: '>=v14'} + + '@commitlint/resolve-extends@17.8.1': + resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} + engines: {node: '>=v14'} + + '@commitlint/rules@17.8.1': + resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} + engines: {node: '>=v14'} + + '@commitlint/to-lines@17.8.1': + resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} + engines: {node: '>=v14'} + + '@commitlint/top-level@17.8.1': + resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} + engines: {node: '>=v14'} + + '@commitlint/types@17.8.1': + resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} + engines: {node: '>=v14'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/convert-colors@1.4.0': + resolution: {integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==} + engines: {node: '>=4.0.0'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.19.3: - resolution: - { - integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==, - } - engines: { node: '>=6.9.0' } + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==, - } - engines: { node: '>=6.9.0' } + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/preset-env/7.19.4_@babel+core@7.19.3: - resolution: - { - integrity: sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==, - } - engines: { node: '>=6.9.0' } + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@discoveryjs/json-ext@0.6.3': + resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + engines: {node: '>=14.17.0'} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.4 - '@babel/core': 7.19.3 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.19.3 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-object-rest-spread': 7.19.4_@babel+core@7.19.3 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.3 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.19.3 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.19.3 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.3 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.3 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.19.3 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.19.3 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-block-scoping': 7.19.4_@babel+core@7.19.3 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.19.3 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-transform-destructuring': 7.19.4_@babel+core@7.19.3 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.19.3 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.19.3 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.19.3 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.19.3 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.19.3 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.19.3 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.19.3 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.19.3 - '@babel/preset-modules': 0.1.5_@babel+core@7.19.3 - '@babel/types': 7.19.4 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.19.3 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.19.3 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.19.3 - core-js-compat: 3.25.5 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@0.4.3': + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + + '@gcanvas/core@1.0.0': + resolution: {integrity: sha512-v+moRYrngBYtaFTABYjzeve9H+EAvh1zJd7RCzELQM/vLQCqjcpjh3R+R80W4i4y6dos1yQhMB2SVH8tfx0iEg==} + + '@humanwhocodes/config-array@0.5.0': + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/object-schema@1.2.1': + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} - /@babel/preset-modules/0.1.5_@babel+core@7.19.3: - resolution: - { - integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==, - } + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@mapbox/hast-util-to-jsx@1.0.0': + resolution: {integrity: sha512-HJRp3qkr0uGIBFASzA8rVATLo6y/UoOMoD8eXsG8HVofk5Dokc9PV+dh266zYLZniYgtpJbc2+AKf1fNpsVqAA==} + engines: {node: '>=10'} + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rc-component/async-validator@5.0.4': + resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} + engines: {node: '>=14.x'} + + '@rc-component/color-picker@2.0.1': + resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.19.3 - '@babel/types': 7.19.4 - esutils: 2.0.3 - dev: true - - /@babel/preset-react/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==, - } - engines: { node: '>=6.9.0' } + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/context@1.4.0': + resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.3 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.19.3 - dev: true - - /@babel/preset-typescript/7.18.6_@babel+core@7.19.3: - resolution: - { - integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==, - } - engines: { node: '>=6.9.0' } + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/mini-decimal@1.1.0': + resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} + engines: {node: '>=8.x'} + + '@rc-component/mutate-observer@1.1.0': + resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} + engines: {node: '>=8.x'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/runtime-corejs3/7.19.4: - resolution: - { - integrity: sha512-HzjQ8+dzdx7dmZy4DQ8KV8aHi/74AjEbBGTFutBmg/pd3dY5/q1sfuOGPTFGEytlQhWoeVXqcK5BwMgIkRkNDQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - core-js-pure: 3.25.5 - regenerator-runtime: 0.13.9 - dev: true - - /@babel/runtime/7.18.6: - resolution: - { - integrity: sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==, - } - engines: { node: '>=6.9.0' } - dependencies: - regenerator-runtime: 0.13.9 - dev: true - - /@babel/runtime/7.19.4: - resolution: - { - integrity: sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==, - } - engines: { node: '>=6.9.0' } - dependencies: - regenerator-runtime: 0.13.9 - dev: true - - /@babel/template/7.18.10: - resolution: - { - integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.19.4 - '@babel/types': 7.19.4 - dev: true - - /@babel/traverse/7.19.4: - resolution: - { - integrity: sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.5 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.19.4 - '@babel/types': 7.19.4 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + react: '>=16.9.0' + react-dom: '>=16.9.0' - /@babel/types/7.19.4: - resolution: - { - integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==, - } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage/0.2.3: - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } - dev: true - - /@bloomberg/record-tuple-polyfill/0.0.3: - resolution: - { - integrity: sha512-sBnCqW0nqofE47mxFnw+lvx6kzsQstwaQMVkh66qm/A6IlsnH7WsyGuVXTou8RF2wL4W7ybOoHPvP2WgIo6rhQ==, - } - dev: true - - /@commitlint/cli/17.1.2: - resolution: - { - integrity: sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==, - } - engines: { node: '>=v14' } - hasBin: true - dependencies: - '@commitlint/format': 17.0.0 - '@commitlint/lint': 17.1.0 - '@commitlint/load': 17.1.2 - '@commitlint/read': 17.1.0 - '@commitlint/types': 17.0.0 - execa: 5.1.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.6.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - - /@commitlint/config-conventional/17.1.0: - resolution: - { - integrity: sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==, - } - engines: { node: '>=v14' } - dependencies: - conventional-changelog-conventionalcommits: 5.0.0 - dev: true - - /@commitlint/config-validator/17.1.0: - resolution: - { - integrity: sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/types': 17.0.0 - ajv: 8.11.0 - dev: true - - /@commitlint/ensure/17.0.0: - resolution: - { - integrity: sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/types': 17.0.0 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule/17.0.0: - resolution: - { - integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==, - } - engines: { node: '>=v14' } - dev: true - - /@commitlint/format/17.0.0: - resolution: - { - integrity: sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/types': 17.0.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored/17.1.0: - resolution: - { - integrity: sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/types': 17.0.0 - semver: 7.3.7 - dev: true - - /@commitlint/lint/17.1.0: - resolution: - { - integrity: sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/is-ignored': 17.1.0 - '@commitlint/parse': 17.0.0 - '@commitlint/rules': 17.0.0 - '@commitlint/types': 17.0.0 - dev: true - - /@commitlint/load/17.1.2: - resolution: - { - integrity: sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/config-validator': 17.1.0 - '@commitlint/execute-rule': 17.0.0 - '@commitlint/resolve-extends': 17.1.0 - '@commitlint/types': 17.0.0 - '@types/node': 14.18.32 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 4.1.1_vfayau7oz5qy4giwqlppd3j3ti - lodash: 4.17.21 - resolve-from: 5.0.0 - ts-node: 10.9.1_jcmx33t3olsvcxopqdljsohpme - typescript: 4.8.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - - /@commitlint/message/17.0.0: - resolution: - { - integrity: sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==, - } - engines: { node: '>=v14' } - dev: true - - /@commitlint/parse/17.0.0: - resolution: - { - integrity: sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/types': 17.0.0 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read/17.1.0: - resolution: - { - integrity: sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/top-level': 17.0.0 - '@commitlint/types': 17.0.0 - fs-extra: 10.1.0 - git-raw-commits: 2.0.11 - minimist: 1.2.7 - dev: true - - /@commitlint/resolve-extends/17.1.0: - resolution: - { - integrity: sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/config-validator': 17.1.0 - '@commitlint/types': 17.0.0 - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/rules/17.0.0: - resolution: - { - integrity: sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==, - } - engines: { node: '>=v14' } - dependencies: - '@commitlint/ensure': 17.0.0 - '@commitlint/message': 17.0.0 - '@commitlint/to-lines': 17.0.0 - '@commitlint/types': 17.0.0 - execa: 5.1.1 - dev: true - - /@commitlint/to-lines/17.0.0: - resolution: - { - integrity: sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==, - } - engines: { node: '>=v14' } - dev: true - - /@commitlint/top-level/17.0.0: - resolution: - { - integrity: sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==, - } - engines: { node: '>=v14' } - dependencies: - find-up: 5.0.0 - dev: true + '@rc-component/portal@1.1.2': + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' - /@commitlint/types/17.0.0: - resolution: - { - integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==, - } - engines: { node: '>=v14' } - dependencies: - chalk: 4.1.2 - dev: true + '@rc-component/qrcode@1.0.0': + resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' - /@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 - - /@csstools/convert-colors/1.4.0: - resolution: - { - integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==, - } - engines: { node: '>=4.0.0' } - dev: true - - /@ctrl/tinycolor/3.4.1: - resolution: - { - integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==, - } - engines: { node: '>=10' } - dev: true - - /@eslint/eslintrc/0.4.3: - resolution: - { - integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 7.3.1 - globals: 13.17.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - js-yaml: 3.14.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@gcanvas/core/1.0.0: - resolution: - { - integrity: sha512-v+moRYrngBYtaFTABYjzeve9H+EAvh1zJd7RCzELQM/vLQCqjcpjh3R+R80W4i4y6dos1yQhMB2SVH8tfx0iEg==, - } - dev: true - - /@humanwhocodes/config-array/0.5.0: - resolution: - { - integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==, - } - engines: { node: '>=10.10.0' } - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/object-schema/1.2.1: - resolution: - { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, - } - 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/27.5.1: - resolution: - { - integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - dev: true - - /@jest/core/27.5.1_ts-node@10.9.1: - resolution: - { - integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + '@rc-component/tour@1.15.1': + resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/trigger@2.3.0': + resolution: {integrity: sha512-iwaxZyzOuK0D7lS+0AQEtW52zUWxoGqTGkke3dRyb8pYiShmRpCjB/8TzPI4R6YySCH7Vm9BZj/31VPiiQTLBg==} + engines: {node: '>=8.x'} peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@remix-run/router@1.23.0': + resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} + engines: {node: '>=14.0.0'} + + '@rollup/rollup-android-arm-eabi@4.48.0': + resolution: {integrity: sha512-aVzKH922ogVAWkKiyKXorjYymz2084zrhrZRXtLrA5eEx5SO8Dj0c/4FpCHZyn7MKzhW2pW4tK28vVr+5oQ2xw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.48.0': + resolution: {integrity: sha512-diOdQuw43xTa1RddAFbhIA8toirSzFMcnIg8kvlzRbK26xqEnKJ/vqQnghTAajy2Dcy42v+GMPMo6jq67od+Dw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.48.0': + resolution: {integrity: sha512-QhR2KA18fPlJWFefySJPDYZELaVqIUVnYgAOdtJ+B/uH96CFg2l1TQpX19XpUMWUqMyIiyY45wje8K6F4w4/CA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.48.0': + resolution: {integrity: sha512-Q9RMXnQVJ5S1SYpNSTwXDpoQLgJ/fbInWOyjbCnnqTElEyeNvLAB3QvG5xmMQMhFN74bB5ZZJYkKaFPcOG8sGg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.48.0': + resolution: {integrity: sha512-3jzOhHWM8O8PSfyft+ghXZfBkZawQA0PUGtadKYxFqpcYlOYjTi06WsnYBsbMHLawr+4uWirLlbhcYLHDXR16w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.48.0': + resolution: {integrity: sha512-NcD5uVUmE73C/TPJqf78hInZmiSBsDpz3iD5MF/BuB+qzm4ooF2S1HfeTChj5K4AV3y19FFPgxonsxiEpy8v/A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.48.0': + resolution: {integrity: sha512-JWnrj8qZgLWRNHr7NbpdnrQ8kcg09EBBq8jVOjmtlB3c8C6IrynAJSMhMVGME4YfTJzIkJqvSUSVJRqkDnu/aA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.48.0': + resolution: {integrity: sha512-9xu92F0TxuMH0tD6tG3+GtngwdgSf8Bnz+YcsPG91/r5Vgh5LNofO48jV55priA95p3c92FLmPM7CvsVlnSbGQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.48.0': + resolution: {integrity: sha512-NLtvJB5YpWn7jlp1rJiY0s+G1Z1IVmkDuiywiqUhh96MIraC0n7XQc2SZ1CZz14shqkM+XN2UrfIo7JB6UufOA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.48.0': + resolution: {integrity: sha512-QJ4hCOnz2SXgCh+HmpvZkM+0NSGcZACyYS8DGbWn2PbmA0e5xUk4bIP8eqJyNXLtyB4gZ3/XyvKtQ1IFH671vQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.48.0': + resolution: {integrity: sha512-Pk0qlGJnhILdIC5zSKQnprFjrGmjfDM7TPZ0FKJxRkoo+kgMRAg4ps1VlTZf8u2vohSicLg7NP+cA5qE96PaFg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.48.0': + resolution: {integrity: sha512-/dNFc6rTpoOzgp5GKoYjT6uLo8okR/Chi2ECOmCZiS4oqh3mc95pThWma7Bgyk6/WTEvjDINpiBCuecPLOgBLQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.48.0': + resolution: {integrity: sha512-YBwXsvsFI8CVA4ej+bJF2d9uAeIiSkqKSPQNn0Wyh4eMDY4wxuSp71BauPjQNCKK2tD2/ksJ7uhJ8X/PVY9bHQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.48.0': + resolution: {integrity: sha512-FI3Rr2aGAtl1aHzbkBIamsQyuauYtTF9SDUJ8n2wMXuuxwchC3QkumZa1TEXYIv/1AUp1a25Kwy6ONArvnyeVQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.48.0': + resolution: {integrity: sha512-Dx7qH0/rvNNFmCcIRe1pyQ9/H0XO4v/f0SDoafwRYwc2J7bJZ5N4CHL/cdjamISZ5Cgnon6iazAVRFlxSoHQnQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.48.0': + resolution: {integrity: sha512-GUdZKTeKBq9WmEBzvFYuC88yk26vT66lQV8D5+9TgkfbewhLaTHRNATyzpQwwbHIfJvDJ3N9WJ90wK/uR3cy3Q==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.48.0': + resolution: {integrity: sha512-ao58Adz/v14MWpQgYAb4a4h3fdw73DrDGtaiF7Opds5wNyEQwtO6M9dBh89nke0yoZzzaegq6J/EXs7eBebG8A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.48.0': + resolution: {integrity: sha512-kpFno46bHtjZVdRIOxqaGeiABiToo2J+st7Yce+aiAoo1H0xPi2keyQIP04n2JjDVuxBN6bSz9R6RdTK5hIppw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.48.0': + resolution: {integrity: sha512-rFYrk4lLk9YUTIeihnQMiwMr6gDhGGSbWThPEDfBoU/HdAtOzPXeexKi7yU8jO+LWRKnmqPN9NviHQf6GDwBcQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.48.0': + resolution: {integrity: sha512-sq0hHLTgdtwOPDB5SJOuaoHyiP1qSwg+71TQWk8iDS04bW1wIE0oQ6otPiRj2ZvLYNASLMaTp8QRGUVZ+5OL5A==} + cpu: [x64] + os: [win32] + + '@stylelint/postcss-css-in-js@0.37.3': + resolution: {integrity: sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + postcss: '>=7.0.0' + postcss-syntax: '>=0.36.2' + + '@stylelint/postcss-markdown@0.36.2': + resolution: {integrity: sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==} + deprecated: 'Use the original unforked package instead: postcss-markdown' + peerDependencies: + postcss: '>=7.0.0' + postcss-syntax: '>=0.36.2' + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: - node-notifier: + '@types/react': optional: true - dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.10 - jest-changed-files: 27.5.1 - jest-config: 27.5.1_ts-node@10.9.1 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.5 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - 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 } - dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - jest-mock: 27.5.1 - dev: true - - /@jest/fake-timers/27.5.1: - resolution: - { - integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.8.4 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /@jest/globals/27.5.1: - resolution: - { - integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 - dev: true - - /@jest/reporters/27.5.1: - resolution: - { - integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + '@types/react-dom': + optional: true + + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@7.29.0': + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/history@5.0.0': + resolution: {integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==} + deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. + + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/mathjax@0.0.36': + resolution: {integrity: sha512-TqDJc2GWuTqd/m+G/FbNkN+/TF2OCCHvcawmhIrUaZkdVquMdNZmNiNUkupNg9qctorXXkVLVSogZv1DhmgLmg==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/minimatch@6.0.0': + resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} + deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/mockjs@1.0.10': + resolution: {integrity: sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==} + + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + + '@types/node@20.5.1': + resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/parse5@5.0.3': + resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@16.9.25': + resolution: {integrity: sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==} + peerDependencies: + '@types/react': ^16.0.0 + + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react-router-config@5.0.11': + resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + + '@types/react-router-config@5.0.2': + resolution: {integrity: sha512-WOSetDV3YPxbkVJAdv/bqExJjmcdCi/vpCJh3NfQOy1X15vHMSiMioXIcGekXDJJYhqGUMDo9e337mh508foAA==} + + '@types/react-router-dom@5.1.7': + resolution: {integrity: sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==} + + '@types/react-router@5.1.12': + resolution: {integrity: sha512-0bhXQwHYfMeJlCh7mGhc0VJTRm0Gk+Z8T00aiP4702mDUuLs9SMhnd2DitpjWFjdOecx2UXtICK14H9iMnziGA==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + + '@types/react@16.14.66': + resolution: {integrity: sha512-KPilYP4+25N2ki7vrB4adSR2ucAj95xJcGfKC09bsxcHT+QtB//K7i1FenPnbkLA0Xt9pRi1/RXC1wxFvL9Wtw==} + + '@types/react@19.1.11': + resolution: {integrity: sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/experimental-utils@4.33.0': + resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@4.33.0': + resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@4.33.0': + resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@4.33.0': + resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@5.62.0': + 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 + + '@typescript-eslint/utils@5.62.0': + 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 + + '@typescript-eslint/visitor-keys@4.33.0': + resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@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} + + '@umijs/ast@3.5.43': + resolution: {integrity: sha512-P+yperHXuPCewEhgzKRXOxhpQmcK06J2PuLs7XaeQatpUTP//omJeIAcSHV8Rr9ynuvYnz9lS1qKqjgfjmZ8bA==} + + '@umijs/babel-plugin-auto-css-modules@3.5.43': + resolution: {integrity: sha512-u1JTVqgABY3cSCWsaRumnPINZzgUE5WDTsm7BYXf5a+mdZQiv87pCU2jC6S4OabMqm3mR75gJc5wLR4sFnlkrA==} + + '@umijs/babel-plugin-import-to-await-require@3.5.43': + resolution: {integrity: sha512-PhPTS/i2yBEdZbsSp6Cj3cEcxwLOcacjzUgkH+g9vvVwMSAgMqkI1Tx57Y70LZorE4PeUNl5yeS9hGm24JAMQA==} + + '@umijs/babel-plugin-lock-core-js-3@3.5.43': + resolution: {integrity: sha512-hOb6cyCrn/4SQ2qGc6RBOG7aPtMHqyuy2iJonzFobdbkOW5nOnYfK/F3oeSJqn/amynFr3W6cUdflyg3Mn5lRQ==} + + '@umijs/babel-plugin-no-anonymous-default-export@3.5.43': + resolution: {integrity: sha512-itH+IV96AChX7zKDLEKNi6IEHL+RT8DsP8BSH3oDGWRE0OM4VlpM42N195bsMtOtdl7kCb9HUP1Bg1J/+hHwsw==} + + '@umijs/babel-preset-umi@3.5.43': + resolution: {integrity: sha512-raFsiPYy70QNKM4jSo+qdO3wkZr9PCsSSz/+CGTUPkpre5sk6ISDcuXdvEJ92viMe1Xk1+LaPcnbJqIdu7EClA==} + + '@umijs/bundler-utils@3.5.43': + resolution: {integrity: sha512-Vw1qR+4KBQx/M1NwlDrMPydyBoA/qLT+nxZKAeIwCjkJT42QSJn38OMDqsRKRPkuoL5tLN4Ss+PbXoJ5evLWoA==} + + '@umijs/bundler-webpack@3.5.43': + resolution: {integrity: sha512-Sf15PCMSbt0QMnRcNGIU+Nd6dha5aBZPdOE7IdlWLXJ9rSICNuhblD2P5L8MscwomOXYvsPKzNGI92MUyfjq5w==} + hasBin: true + + '@umijs/case-sensitive-paths-webpack-plugin@1.0.1': + resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==} + + '@umijs/core@3.5.43': + resolution: {integrity: sha512-YT/ZrYZl5xrffW3WyDzsrec0FMhebjDoJSA7A2X2WX8lmsIhjzrVEDeR265+t5J+OH7joB8pMMiV/tvhVPHb7w==} + + '@umijs/deps@3.5.43': + resolution: {integrity: sha512-1UugbYw+Emcq1AngzLgCvpMDdIVjpBVGwdrWDcxt3zjSR/2teRbaMdzUEqaMaqMWYVMbZKorARuyit5hZorrXQ==} + + '@umijs/fabric@2.14.1': + resolution: {integrity: sha512-fOyXcbViOB+/jW+g2rCiK9XjSZVn4OzFuMZpSCriCdR/KxhxLTokvJWFm3CzBEmg9vXfrBFQ4c/ykmqoVacHtw==} + hasBin: true + + '@umijs/plugin-analytics@0.2.4': + resolution: {integrity: sha512-aIHc/okDmCae/6iJS3lRV2b9/cuFUoGQhioeoZzC2mBYy43o0Z6KWSY5TlzraY4bDdGurWsFQC6dB1TVUCMGbg==} + peerDependencies: + umi: 3.x + + '@umijs/preset-built-in@3.5.43': + resolution: {integrity: sha512-h9DVc5MjdUON7/xH3bxq76AHDPBTLjntDWBrW6xn+OhDT4j8/YFXrDQwaCwihCJe1eNUBLoVUjWIEIthw7g1Gg==} + peerDependencies: + react: 16.x || 17.x + + '@umijs/preset-dumi@1.1.54': + resolution: {integrity: sha512-p7sG8TxirVtyKrYMSrYnPEwKq2cBiosaYcGVs0k9lVf+jcsFeQSmylsToyZiHZ8PtjItXw0DZIiSvdM/7mg0vA==} + peerDependencies: + umi: ^3.0.0 + + '@umijs/renderer-mpa@3.5.43': + resolution: {integrity: sha512-posQsrkFru/Q9Jft42w4pr/MEFsImd9DlKOV9zYil1ZM6JBS3/hKMmCeSd2Uku7+KgSS/8HSfc4qX/GyeRTzwA==} + peerDependencies: + react: 16.x || 17.x + react-dom: 16.x || 17.x + + '@umijs/renderer-react@3.5.43': + resolution: {integrity: sha512-nadGLVbc6qrEX5pd+qY4nr9Mzl7x2hhxec2JeAd2Bg0JkZYNC8H4crTfe844uLm3MvqAtAhomGhN5c0ejDEBhA==} peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + react: 16.x || 17.x + react-dom: 16.x || 17.x + + '@umijs/runtime@3.5.43': + resolution: {integrity: sha512-jCmkF5QcqbqzJgtd12Hy6XthLTAcaD4feMHnzM+UqTE74N7lfD13P0brXHrGqkcLbI1NgUs+9rKYIUa56w6jpw==} + peerDependencies: + react: 16.x || 17.x + + '@umijs/server@3.5.43': + resolution: {integrity: sha512-aUSNqnO6WvhgIU6jK1+2YCNkuP6UgiEhTaT/VkSPZdCjagfov2ZfJQ0xWl8x7tocuAaBph6UvXFJWjCQvZ5pHw==} + + '@umijs/types@3.5.43': + resolution: {integrity: sha512-XVZuT1X+VpPYrdlDEeginBwBNZaYUDtt3WOyFvfGmBEdqD0iNx0ZgyWmJBhlfRcck5+oYkFpOzmmRIROux2zlA==} + + '@umijs/utils@3.5.43': + resolution: {integrity: sha512-LQrCkZEa9Fb0zhId1n6CdU489tzJp4/usHVvVcTwjah7jF48zrHXD4OClGjSxvZ63d+3950mZY5IWE9UZVhnDg==} + + '@uni/action-sheet@1.0.8': + resolution: {integrity: sha512-3L+ZHK6qYv/3w/ODGZugfbTYc8vT+lkxt/XAl5WRpiFCukjwP5yxRp+feE1SEHdprJXUlHBYTT/Tp0JfRIELJQ==} + + '@uni/clipboard@1.0.9': + resolution: {integrity: sha512-NoqYayQCHB0KIFc2r8akf1S3UtSnBhk+Nc3fX+wFnpRx6qmHHzZSeBk+mTqKVOTfeE3OdcubQAAt/sWfWS/4mw==} + + '@uni/env@1.1.1': + resolution: {integrity: sha512-oQGRQg3cFVb6ByppV0WVue/BE98cw0xvAniX9L0wQtzU94RvZg9/GpkFIDwrlgcvzXlTgUPTTMG9B/riiiFQyQ==} + + '@uni/file@1.1.1': + resolution: {integrity: sha512-gbymGoyD02cWHGVGapxp0zl3VAEU/u4vpDSyfS1tSnIGFjwIbCGq+W+uTAnJYduDbdy4Xiuwzbf0b/4slY9bmQ==} + + '@uni/image@1.1.3': + resolution: {integrity: sha512-68RGzXMYAp8EUZ5jogdQd+KVqyVlKZwuncWmZ96aDqwHhd/J1MnAJuAOAEBL3jCNqXNsvXHLBr5yleg2gdf1yQ==} + + '@uni/navigate@1.0.11': + resolution: {integrity: sha512-7xUVksKKcIMqsxpPBgYRRrkOIVy9bmWmgbinISnZaVobmqSr0oFWN9pHgeCOuvxN66jlVqPIEKHcWyD8IV1oEg==} + + '@uni/page-scroll-to@1.0.0': + resolution: {integrity: sha512-fQTndD14OTezRzXAtsuhdrruO0lz0+lTXa/eSeekVqEkDq9L/OK+T9B6IJS3Ui4Xc1aEkWGSyGe0TaTOfKE9tQ==} + + '@uni/vibrate@1.0.1': + resolution: {integrity: sha512-IocrIbBaZYjBHzvRIGSyN3K2He9Y7BS/VMEri2On9QITU3U2kampDiGGPyA/lQxVSZNemyK6/xtxWoxTjNh91w==} + + '@uni/video@1.0.8': + resolution: {integrity: sha512-Gzo+7Qsq5jmBxcW/B9EF0l77nneBeuHuCBUIVSetSTCQtjdxoF9LF/K3UZE2Z20Raq7/MLrtaDa2KqeLmwWu8A==} + + '@vitest/coverage-istanbul@3.2.4': + resolution: {integrity: sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==} + peerDependencies: + vitest: 3.2.4 + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webpack-cli/configtest@3.0.1': + resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} + engines: {node: '>=18.12.0'} + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + + '@webpack-cli/info@3.0.1': + resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + + '@webpack-cli/serve@3.0.1': + resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} + engines: {node: '>=18.12.0'} + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xmldom/xmldom@0.9.8': + resolution: {integrity: sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==} + engines: {node: '>=14.6'} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@3.5.3: + resolution: {integrity: sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==} + engines: {node: '>= 4.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ahooks@3.9.4: + resolution: {integrity: sha512-NkbX0mamCz4aBX27mZnObbzqcM9S4fzpjVf/6yOvmHh+McBo74xQw5Yz5ry4q2cLMkfNUjhe2q3M5RpjfMVu4g==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + ajv-errors@1.0.1: + resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + peerDependencies: + ajv: '>=5.0.0' + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: - node-notifier: + ajv: optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@2.0.0: + resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + + ansi-colors@1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-gray@0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} + engines: {node: '>=0.10.0'} + + ansi-html@0.0.9: + resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansi-wrap@0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} + engines: {node: '>=0.10.0'} + + antd@5.27.1: + resolution: {integrity: sha512-jGMSdBN7hAMvPV27B4RhzZfL6n6yu8yDbo7oXrlJasaOqB7bSDPcjdEy1kXy3JPsny/Qazb1ykzRI4EfcByAPQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-buffer@1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} + engines: {node: '>=0.10.0'} + + aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-filter@1.1.2: + resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-map@2.0.2: + resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-initial@1.1.0: + resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} + engines: {node: '>=0.10.0'} + + array-last@1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + + array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + + array-sort@1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assert@1.5.1: + resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-done@1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + + async-each@1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-settle@1.0.0: + resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} + engines: {node: '>= 0.10'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + axios@0.18.1: + resolution: {integrity: sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==} + deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 + + babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + + babel-plugin-import@1.13.8: + resolution: {integrity: sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + + bach@1.2.0: + resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} + engines: {node: '>= 0.10'} + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + binaryextensions@2.3.0: + resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} + engines: {node: '>=0.8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + block-stream@0.0.9: + resolution: {integrity: sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==} + engines: {node: 0.4 || >=0.5.8} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + boxen@1.3.0: + resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} + engines: {node: '>=4'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@10.0.4: + resolution: {integrity: sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==} + + cacache@9.3.0: + resolution: {integrity: sha512-Vbi8J1XfC8v+FbQ6QkOtKXsHpPnB0i9uMeYFJoj40EbdOsEqWB3DPpNjfsnYBkqOPYA8UvrqH6FZPpBP0zdN7g==} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + + caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + + callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001737: + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} + + capture-stack-trace@1.0.2: + resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} + engines: {node: '>=0.10.0'} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@1.1.4: + resolution: {integrity: sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + + chokidar@3.5.1: + resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==} + engines: {node: '>= 8.10.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + classnames@2.2.6: + resolution: {integrity: sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + + cli-spinners@1.3.1: + resolution: {integrity: sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==} + engines: {node: '>=4'} + + cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + + cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + + clipboardy@2.3.0: + resolution: {integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==} + engines: {node: '>=8'} + + cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone-regexp@2.2.0: + resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==} + engines: {node: '>=6'} + + clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + codesandbox-import-util-types@2.2.3: + resolution: {integrity: sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==} + + codesandbox-import-utils@2.2.3: + resolution: {integrity: sha512-ymtmcgZKU27U+nM2qUb21aO8Ut/u2S9s6KorOgG81weP+NA0UZkaHKlaRqbLJ9h4i/4FLvwmEXYAnTjNmp6ogg==} + + codesandbox@2.2.3: + resolution: {integrity: sha512-IAkWFk6UUglOhSemI7UFgNNL/jgg+1YjVEIllFULLgsaHhFnY51pCqAifMNuAd5d9Zp4Nk/xMgrEaGNV0L4Xlg==} + hasBin: true + + collection-map@1.0.0: + resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} + engines: {node: '>=0.10.0'} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + configstore@3.1.5: + resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} + engines: {node: '>=4'} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + + conventional-changelog-conventionalcommits@6.1.0: + resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} + engines: {node: '>=14'} + + conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-concurrently@1.0.5: + resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + deprecated: This package is no longer supported. + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + copy-props@2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} + + copy-text-to-clipboard@2.2.0: + resolution: {integrity: sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==} + engines: {node: '>=6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + + core-js-pure@3.45.1: + resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} + + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + core-js@3.6.5: + resolution: {integrity: sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig-typescript-loader@4.4.0: + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=4' + + cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + coveralls@3.1.1: + resolution: {integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==} + engines: {node: '>=6'} + hasBin: true + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-error-class@3.0.2: + resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} + engines: {node: '>=0.10.0'} + + create-hash@1.1.3: + resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + + crypto-random-string@1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + + css-blank-pseudo@0.1.4: + resolution: {integrity: sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==} + engines: {node: '>=6.0.0'} + hasBin: true + + css-has-pseudo@0.10.0: + resolution: {integrity: sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + css-prefers-color-scheme@3.1.1: + resolution: {integrity: sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==} + engines: {node: '>=6.0.0'} + hasBin: true + + cssdb@4.4.0: + resolution: {integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==} + + cssesc@2.0.0: + resolution: {integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==} + engines: {node: '>=4'} + hasBin: true + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cwd@0.9.1: + resolution: {integrity: sha512-4+0D+ojEasdLndYX4Cqff057I/Jp6ysXpwKkdLQLnZxV8f6IYZmZtTP5uqD91a/kWqejoc0sSqK4u8wpTKCh8A==} + engines: {node: '>=0.8'} + + cyclist@1.0.2: + resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} + + czg@1.12.0: + resolution: {integrity: sha512-LGltcoZ5m7vhe3WNw16QXqd5WurnHegx9V15MwZJtFAU2AVCYLCqDbwxPUgZOnAcdzzooq33ONcU148HOQsjdA==} + engines: {node: '>=v12.20.0'} + hasBin: true + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + datauri@3.0.0: + resolution: {integrity: sha512-NeDFuUPV1YCpCn8MUIcDk1QnuyenUHs7f4Q5P0n9FFA0neKFrfEH9esR+YMW95BplbYfdmjbs0Pl/ZGAaM2QHQ==} + engines: {node: '>= 8'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@1.5.2: + resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==} + engines: {node: '>=0.10.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-compare@1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} + + default-resolution@2.0.0: + resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} + engines: {node: '>= 0.10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + del@5.1.0: + resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} + engines: {node: '>=8'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + + dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} + + domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + dot-prop@4.2.1: + resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} + engines: {node: '>=4'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + driver-dom@2.2.2: + resolution: {integrity: sha512-v/jCQnQkjv0q3Z51zYhG5MfzMjlfJURiC8mhaAwhHsih55j8AnPupurSBOJn67qAE4Ol5XiGlqDnjWAH9XM1OA==} + + driver-miniapp@0.1.5: + resolution: {integrity: sha512-27SwcAaL50jhaQwhHDXqqiT1BtOw0sp1ZIk8YNvgyBLjrZJhkRx/LTS3xmfgXlKkft8wxsO3039lFXWxKTCDKA==} + + driver-universal@3.5.0: + resolution: {integrity: sha512-Np6RFlzVyuy2xRmgbzlBIWYm3cIgpd2eVCNT0/Ai0fLpjaYhUUjejjobXGA7LiBR1C57YY51AbBsGZjjzQK99g==} + + driver-weex@2.1.0: + resolution: {integrity: sha512-Hl/Bdubctm8Cr24acSe8NKwOztmXS7qE3kh+eNjp+NvTPr8DBpDlRIj1g/r1b2Ci82cz43b+Tm29L+sAveoh8g==} + + dumi-assets-types@1.0.1: + resolution: {integrity: sha512-A+fJp7L+Q6nU5S2KgbdnyfRoCkAZy+UFudQ45QPM7W+3LIe8o+Tt0cURIQMnLZMBjoKbItB5IDi+IM39FwFZvQ==} + + dumi-theme-default@1.1.24: + resolution: {integrity: sha512-/fS7gBJejom1Zy1GZkrqG/dLEsCK6J/S/ctCPEawDC3KkZE0sJh+dqsMuhHt8ts7ZhaGhDpJNPXSMghfN/qrzw==} + peerDependencies: + '@umijs/preset-dumi': 1.x + react: ^16.13.1 || ^17.0.0 + + dumi@1.1.54: + resolution: {integrity: sha512-hfawfTmnAA+uY5e1u4ymr4oAP2g94QJzf5YDN7HHb7MTyePIforie/sq6/CYOxaftPyvqYR04wbFx52YYQT9XA==} + hasBin: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + each-props@1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editions@2.3.1: + resolution: {integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==} + engines: {node: '>=0.8'} + + electron-to-chromium@1.5.208: + resolution: {integrity: sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + err-code@1.1.2: + resolution: {integrity: sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==} + + errlop@2.2.0: + resolution: {integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==} + engines: {node: '>=0.8'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.7.1: + resolution: {integrity: sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es5-imcompatible-versions@0.1.90: + resolution: {integrity: sha512-2MPI0t/VV4j/oz1qbMekb4gCW81dewTpM2XJHKnPpZiPGu+1rVWmhTnwcq1vt8AFwWrkNF4RE7OZ9ibnKFYKwg==} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + esbuild@0.12.15: + resolution: {integrity: sha512-72V4JNd2+48eOVCXx49xoSWHgC3/cCy96e7mbXKY+WOWghN00cCmlGnwVLRhRHorvv0dgCyuMYBZlM2xDM5OQw==} + hasBin: true + + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-ast-utils@1.1.0: + resolution: {integrity: sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==} + engines: {node: '>=4'} + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-formatter-pretty@4.1.0: + resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==} + engines: {node: '>=10'} + + eslint-plugin-babel@5.3.1: + resolution: {integrity: sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==} + engines: {node: '>=4'} + peerDependencies: + eslint: '>=4.0.0' + + eslint-plugin-jest@24.7.0: + resolution: {integrity: sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==} + engines: {node: '>=10'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>= 4' + eslint: '>=5' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-unicorn@20.1.0: + resolution: {integrity: sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA==} + engines: {node: '>=10'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + + eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-template-visitor@2.3.2: + resolution: {integrity: sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==} + peerDependencies: + eslint: '>=7.0.0' + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + 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} + + eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + + execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execall@2.0.0: + resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==} + engines: {node: '>=8'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + expand-tilde@1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fancy-log@1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@1.1.4: + resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-name@0.1.0: + resolution: {integrity: sha512-Q8SskhjF4eUk/xoQkmubwLkoHwOTv6Jj/WGtOVLKkZ0vvM+LipkSXugkn1F/+mjWXU32AXLZB3qaz0arUzgtRw==} + engines: {node: '>=0.10.0'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filesize@3.6.1: + resolution: {integrity: sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==} + engines: {node: '>= 0.4.0'} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + + find-file-up@0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + + find-pkg@0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + findup-sync@2.0.0: + resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} + engines: {node: '>= 0.10'} + + findup-sync@3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + + fined@1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + + flagged-respawn@1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + flatten@1.0.3: + resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} + deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + + flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + + flux@4.0.4: + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + + follow-redirects@1.5.10: + resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} + engines: {node: '>=4.0'} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@3.0.4: + resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} + + fs-extra@3.0.1: + resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} + + fs-mkdirp-stream@1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} + engines: {node: '>= 0.10'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs-write-stream-atomic@1.0.10: + resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} + deprecated: This package is no longer supported. + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: Upgrade to fsevents v2 to mitigate potential security issues + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + genfun@4.0.1: + resolution: {integrity: sha512-48yv1eDS5Qrz6cbSDBBik0u7jCgC/eA9eZrl9MIN1LfKzFTuGt6EHgr31YM8yT9cjb5BplXb4Iz3VtOYmgt8Jg==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + git-branch@1.0.0: + resolution: {integrity: sha512-ZTzuqw5Df8fyLXQWrX6hK+4FpNCdKzMcERlxENEGO5aKcLmG7MAszhrMhluUKNKmOS/JAGijDMQDXDCDw1mE/A==} + engines: {node: '>=0.8'} + + git-config-path@1.0.1: + resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} + engines: {node: '>=0.10.0'} + + git-hooks-list@1.0.3: + resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + git-repo-name@0.6.0: + resolution: {integrity: sha512-DF4XxB6H+Te79JA08/QF/IjIv+j+0gF990WlgAX3SXXU2irfqvBc/xxlAIh6eJWYaKz45MrrGVBFS0Qc4bBz5g==} + engines: {node: '>=0.8'} + + git-username@0.5.1: + resolution: {integrity: sha512-xjUjrj3i4kup2A3a/ZVZB1Nt0PUX7SU7KeVqIbXPdslT7NbNfyO04JMxBv4gar77JePdS+A6f05jG1Viy6+U1w==} + engines: {node: '>=0.8'} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-stream@6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} + engines: {node: '>= 0.10'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob-watcher@5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + global-modules@0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@10.0.0: + resolution: {integrity: sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==} + engines: {node: '>=8'} + + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + glogg@1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} + + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@6.7.1: + resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} + engines: {node: '>=4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gulp-babel@8.0.0: + resolution: {integrity: sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==} + engines: {node: '>=6'} + peerDependencies: + '@babel/core': ^7.0.0 + + gulp-cli@2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true + + gulp-typescript@6.0.0-alpha.1: + resolution: {integrity: sha512-KoT0TTfjfT7w3JItHkgFH1T/zK4oXWC+a8xxKfniRfVcA0Fa1bKrIhztYelYmb+95RB80OLMBreknYkdwzdi2Q==} + engines: {node: '>= 8'} + peerDependencies: + typescript: '~2.7.1 || >=2.8.0-dev || >=2.9.0-dev || ~3.0.0 || >=3.0.0-dev || >=3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev ' + + gulp@4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true + + gulplog@1.0.0: + resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} + engines: {node: '>= 0.10'} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + 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==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + hash-base@2.0.2: + resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-to-hyperscript@9.0.1: + resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + + hast-util-from-dom@3.0.0: + resolution: {integrity: sha512-4vQuGiD5Y/wlD7fZiY4mZML/6oh0GOnH38UNyeDFcSTE4AHF0zjKHZfbd+ekVwPvsZXRl8choc99INHUwSPJlg==} + + hast-util-from-parse5@6.0.1: + resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + + hast-util-has-property@1.0.4: + resolution: {integrity: sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==} + + hast-util-is-conditional-comment@1.0.4: + resolution: {integrity: sha512-rtULxWWknVeSuU/vsJ9tHo+M3ExyaOrZcWvLxqY2nUfCHbDcq60EJzSJC5zNm6ZlbxbJ8l7Ej8C1Kzsi5PJS1A==} + + hast-util-is-element@1.1.0: + resolution: {integrity: sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-raw@6.1.0: + resolution: {integrity: sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==} + + hast-util-to-html@7.1.3: + resolution: {integrity: sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==} + + hast-util-to-parse5@6.0.0: + resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} + + hast-util-to-string@1.0.4: + resolution: {integrity: sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==} + + hast-util-to-text@2.0.1: + resolution: {integrity: sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==} + + hast-util-whitespace@1.0.4: + resolution: {integrity: sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + history-with-query@4.10.4: + resolution: {integrity: sha512-JnskQK8X+PbRFHSdDAExhoJyhLnlLZL+UuHQuQhys+Se9/ukRDRBWU4JVTjsiIfbv1fcEmR3oqKW56OYmk5M5w==} + + history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + + history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@3.0.8: + resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} + engines: {node: '>=10'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-void-elements@1.0.5: + resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + http-cache-semantics@3.8.1: + resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} + + http-proxy-agent@2.1.0: + resolution: {integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==} + engines: {node: '>= 4.5.0'} + + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + https-proxy-agent@2.2.4: + resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} + engines: {node: '>= 4.5.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + humps@2.0.1: + resolution: {integrity: sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g==} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + iferr@0.1.5: + resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} + + ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.8.3: + resolution: {integrity: sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==} + engines: {node: '>=6.9.0'} + hasBin: true + + import-cwd@2.1.0: + resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} + engines: {node: '>=4'} + + import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-from@2.1.0: + resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} + engines: {node: '>=4'} + + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + import-modules@2.1.0: + resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indexes-of@1.0.1: + resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inquirer@6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + invert-kv@3.0.1: + resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} + engines: {node: '>=8'} + + ip@1.1.9: + resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-domain@0.0.1: + resolution: {integrity: sha512-hLm9uZUDm/sk0+xZgxyJluSf4B37sg3ivzv4ndTxNCAMnWFUUsHh1u4eh2maEcEvQl3mc65a9pJ/KURGItbLIg==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-installed-globally@0.1.0: + resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} + engines: {node: '>=4'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-npm@1.0.0: + resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} + engines: {node: '>=0.10.0'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-redirect@1.0.0: + resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-regexp@2.1.0: + resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==} + engines: {node: '>=6'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-windows@0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + istextorbinary@2.6.0: + resolution: {integrity: sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==} + engines: {node: '>=0.12'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + + jest-worker@24.9.0: + resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} + engines: {node: '>= 6'} + + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@3.0.1: + resolution: {integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + just-debounce@1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} + + katex@0.12.0: + resolution: {integrity: sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==} + hasBin: true + + kebab-case@1.0.2: + resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.21.0: + resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} + + last-run@1.1.1: + resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} + engines: {node: '>= 0.10'} + + latest-version@3.1.0: + resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} + engines: {node: '>=4'} + + lazy-cache@1.0.4: + resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} + engines: {node: '>=0.10.0'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + lcid@3.1.1: + resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==} + engines: {node: '>=8'} + + lcov-parse@1.0.0: + resolution: {integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==} + hasBin: true + + lead@1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} + engines: {node: '>= 0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + liftoff@3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-driver@1.2.7: + resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==} + engines: {node: '>=0.8.6'} + + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.18: + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@2.6.0: + resolution: {integrity: sha512-FFq0lNI0ax+n9IWzWpH8A4JdgYiAp2DDYIZ3rsaav8JDe8I+72CzK6PQW/oom15YDZpV5bYW/9INd6nIJ2ZfZw==} + + make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + + matchdep@2.0.0: + resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} + engines: {node: '>= 0.10.0'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mathjax-full@3.2.2: + resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + + mdast-util-find-and-replace@1.1.1: + resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-frontmatter@0.2.0: + resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + + mdast-util-gfm-autolink-literal@0.1.3: + resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + + mdast-util-gfm-strikethrough@0.2.3: + resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + + mdast-util-gfm-table@0.1.6: + resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + + mdast-util-gfm-task-list-item@0.1.6: + resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + + mdast-util-gfm@0.1.2: + resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + + mdast-util-math@0.1.2: + resolution: {integrity: sha512-fogAitds+wH+QRas78Yr1TwmQGN4cW/G2WRw5ePuNoJbBSPJCxIOCE8MTzHgWHVSpgkRaPQTgfzXRE1CrwWSlg==} + + mdast-util-to-hast@10.2.0: + resolution: {integrity: sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==} + + mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + mem@5.1.1: + resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} + engines: {node: '>=8'} + + memory-fs@0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mhchemparser@4.2.1: + resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} + + micromark-extension-frontmatter@0.2.2: + resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + + micromark-extension-gfm-autolink-literal@0.5.7: + resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + + micromark-extension-gfm-strikethrough@0.6.5: + resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + + micromark-extension-gfm-table@0.4.3: + resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + + micromark-extension-gfm-tagfilter@0.3.0: + resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} + + micromark-extension-gfm-task-list-item@0.3.3: + resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + + micromark-extension-gfm@0.3.3: + resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + + micromark-extension-math@0.1.2: + resolution: {integrity: sha512-ZJXsT2eVPM8VTmcw0CPSDeyonOn9SziGK3Z+nkf9Vb6xMPeU+4JMEnO6vzDL10562Favw8Vste74f54rxJ/i6Q==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.4.1: + resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} + hasBin: true + + mimer@1.1.0: + resolution: {integrity: sha512-y9dVfy2uiycQvDNiAYW6zp49ZhFlXDMr5wfdOiMbdzGM/0N5LNR6HTUn3un+WUQcM0koaw8FMTG1bt5EnHJdvQ==} + engines: {node: '>= 6.0'} + hasBin: true + + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + + 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'} + + mini-create-react-context@0.4.1: + resolution: {integrity: sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + prop-types: ^15.0.0 + react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.3: + resolution: {integrity: sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mississippi@1.3.1: + resolution: {integrity: sha512-/6rB8YXFbAtsUVRphIRQqB0+9c7VaPHCjVtvto+JqwVxgz8Zz+I+f68/JgQ+Pb4VlZb2svA9OtdXnHHsZz7ltg==} + + mississippi@2.0.0: + resolution: {integrity: sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==} + engines: {node: '>=4.0.0'} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mj-context-menu@0.6.1: + resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mock-socket@9.3.1: + resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==} + engines: {node: '>= 8'} + + mockjs@1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} + hasBin: true + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + moniker@0.1.2: + resolution: {integrity: sha512-Uj9iV0QYr6281G+o0TvqhKwHHWB2Q/qUTT4LPQ3qDGc0r8cbMuqQjRXPZuVZ+gcL7APx+iQgE8lcfWPrj1LsLA==} + + move-concurrently@1.0.1: + resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} + deprecated: This package is no longer supported. + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multimap@1.1.0: + resolution: {integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==} + + mute-stdout@1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} + + mute-stream@0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nan@2.23.0: + resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + netrc@0.1.4: + resolution: {integrity: sha512-ye8AIYWQcP9MvoM1i0Z2jV0qed31Z8EWXYnyGNkiUAd+Fo8J+7uy90xTV8g/oAbhtjkY7iZbNTizQaXdKUuwpQ==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + node-fetch-npm@2.0.4: + resolution: {integrity: sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==} + engines: {node: '>=4'} + deprecated: This module is not used anymore, npm uses minipass-fetch for its fetch implementation now + + 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 + + node-libs-browser@2.2.1: + resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-selector@0.2.0: + resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==} + + normalize-url@1.9.1: + resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==} + engines: {node: '>=4'} + + now-and-later@2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + + npm-package-arg@5.1.2: + resolution: {integrity: sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==} + + npm-pick-manifest@1.0.4: + resolution: {integrity: sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ==} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + nwsapi@2.2.21: + resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.reduce@1.0.1: + resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} + engines: {node: '>=0.10.0'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + omit.js@2.0.2: + resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@1.4.0: + resolution: {integrity: sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==} + engines: {node: '>=4'} + + ordered-read-streams@1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + os-locale@5.0.0: + resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + osenv@0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + deprecated: This package is no longer supported. + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-is-promise@2.1.0: + resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} + engines: {node: '>=6'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@4.0.1: + resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} + engines: {node: '>=4'} + + pacote@2.7.38: + resolution: {integrity: sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parallel-transform@1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + + parse-git-config@0.2.0: + resolution: {integrity: sha512-amapZFADOJtHvX2URcRfbzG2OFcW+UAwmdK2kht2N2vsH5Py65VxI5yZTlD2DjmxVhTz6htFoVCxROYUJaYOXQ==} + engines: {node: '>=0.10.0'} + + parse-git-config@1.1.1: + resolution: {integrity: sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ==} + engines: {node: '>=0.10.0'} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-browserify@0.0.1: + resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} + engines: {node: '>=0.12'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + plugin-error@1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} + + plur@4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-attribute-case-insensitive@4.0.2: + resolution: {integrity: sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==} + + postcss-color-functional-notation@2.0.1: + resolution: {integrity: sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==} + engines: {node: '>=6.0.0'} + + postcss-color-gray@5.0.0: + resolution: {integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==} + engines: {node: '>=6.0.0'} + + postcss-color-hex-alpha@5.0.3: + resolution: {integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==} + engines: {node: '>=6.0.0'} + + postcss-color-mod-function@3.0.3: + resolution: {integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==} + engines: {node: '>=6.0.0'} + + postcss-color-rebeccapurple@4.0.1: + resolution: {integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==} + engines: {node: '>=6.0.0'} + + postcss-custom-media@7.0.8: + resolution: {integrity: sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==} + engines: {node: '>=6.0.0'} + + postcss-custom-properties@8.0.11: + resolution: {integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==} + engines: {node: '>=6.0.0'} + + postcss-custom-selectors@5.1.2: + resolution: {integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==} + engines: {node: '>=6.0.0'} + + postcss-dir-pseudo-class@5.0.0: + resolution: {integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==} + engines: {node: '>=4.0.0'} + + postcss-double-position-gradients@1.0.0: + resolution: {integrity: sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==} + engines: {node: '>=6.0.0'} + + postcss-env-function@2.0.2: + resolution: {integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==} + engines: {node: '>=6.0.0'} + + postcss-flexbugs-fixes@4.2.1: + resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} + + postcss-focus-visible@4.0.0: + resolution: {integrity: sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==} + engines: {node: '>=6.0.0'} + + postcss-focus-within@3.0.0: + resolution: {integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==} + engines: {node: '>=6.0.0'} + + postcss-font-variant@4.0.1: + resolution: {integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==} + + postcss-gap-properties@2.0.0: + resolution: {integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==} + engines: {node: '>=6.0.0'} + + postcss-html@0.36.0: + resolution: {integrity: sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==} + peerDependencies: + postcss: '>=5.0.0' + postcss-syntax: '>=0.36.0' + + postcss-image-set-function@3.0.1: + resolution: {integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==} + engines: {node: '>=6.0.0'} + + postcss-initial@3.0.4: + resolution: {integrity: sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==} + + postcss-js@2.0.3: + resolution: {integrity: sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==} + + postcss-lab-function@2.0.1: + resolution: {integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==} + engines: {node: '>=6.0.0'} + + postcss-less@3.1.4: + resolution: {integrity: sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==} + engines: {node: '>=6.14.4'} + + postcss-less@4.0.1: + resolution: {integrity: sha512-C92S4sHlbDpefJ2QQJjrucCcypq3+KZPstjfuvgOCNnGx0tF9h8hXgAlOIATGAxMXZXaF+nVp+/Mi8pCAWdSmw==} + engines: {node: '>=10'} + + postcss-load-config@2.1.2: + resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} + engines: {node: '>= 4'} + + postcss-loader@3.0.0: + resolution: {integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==} + engines: {node: '>= 6'} + + postcss-logical@3.0.0: + resolution: {integrity: sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==} + engines: {node: '>=6.0.0'} + + postcss-media-minmax@4.0.0: + resolution: {integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==} + engines: {node: '>=6.0.0'} + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-nesting@7.0.1: + resolution: {integrity: sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==} + engines: {node: '>=6.0.0'} + + postcss-overflow-shorthand@2.0.0: + resolution: {integrity: sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==} + engines: {node: '>=6.0.0'} + + postcss-page-break@2.0.0: + resolution: {integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==} + + postcss-place@4.0.1: + resolution: {integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==} + engines: {node: '>=6.0.0'} + + postcss-preset-env@6.7.0: + resolution: {integrity: sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==} + engines: {node: '>=6.0.0'} + + postcss-pseudo-class-any-link@6.0.0: + resolution: {integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==} + engines: {node: '>=6.0.0'} + + postcss-replace-overflow-wrap@3.0.0: + resolution: {integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@4.0.2: + resolution: {integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==} + engines: {node: '>=6.0.0'} + + postcss-sass@0.4.4: + resolution: {integrity: sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==} + + postcss-scss@2.1.1: + resolution: {integrity: sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==} + engines: {node: '>=6.0.0'} + + postcss-selector-matches@4.0.0: + resolution: {integrity: sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==} + + postcss-selector-not@4.0.1: + resolution: {integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==} + + postcss-selector-parser@5.0.0: + resolution: {integrity: sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-sorting@6.0.0: + resolution: {integrity: sha512-bYJ0vgAiGbjCBKi7B07CzsBc9eM84nLEbavUmwNp8rAa+PNyrgdH+6PpnqTtciLuUs99c4rFQQmCaYgeBQYmSQ==} + peerDependencies: + postcss: ^8.0.4 + + postcss-syntax@0.36.2: + resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==} + peerDependencies: + postcss: '>=5.0.0' + postcss-html: '*' + postcss-jsx: '*' + postcss-less: '*' + postcss-markdown: '*' + postcss-scss: '*' + peerDependenciesMeta: + postcss-html: + optional: true + postcss-jsx: + optional: true + postcss-less: + optional: true + postcss-markdown: + optional: true + postcss-scss: + optional: true + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss-values-parser@2.0.1: + resolution: {integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==} + engines: {node: '>=6.14.4'} + + postcss@7.0.32: + resolution: {integrity: sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==} + engines: {node: '>=6.0.0'} + + postcss@7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + + prettier-plugin-packagejson@2.3.0: + resolution: {integrity: sha512-2SAPMMk1UDkqsB7DifWKcwCm6VC52JXMrzLHfbcQHJRWhRCj9zziOy+s+2XOyPBeyqFqS+A/1IKzOrxKFTo6pw==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + + prettier-plugin-two-style-order@1.0.1: + resolution: {integrity: sha512-ETltO2FRR/Pxc7bsgz2XwuzWSPwafl7/v5+5Rria4S579CTas7dya+xsmbkix0q1tYQiuRjVVdfGnCKlH/aOuQ==} + peerDependencies: + prettier: '>= 2.0.0' + + prettier@2.2.1: + resolution: {integrity: sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + prism-react-renderer@1.3.5: + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@1.1.8: + resolution: {integrity: sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==} + engines: {node: '>=0.4.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@1.1.1: + resolution: {integrity: sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==} + engines: {node: '>=0.12'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + protoduck@4.0.0: + resolution: {integrity: sha512-9sxuz0YTU/68O98xuDn8NBxTVH9EuMhrBTxZdiBL0/qxRmWhB/5a8MagAebDa+98vluAZTs8kMZibCdezbRCeQ==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@1.0.3: + resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + + query-string@6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + + query-string@8.2.0: + resolution: {integrity: sha512-tUZIw8J0CawM5wyGBiDOAp7ObdRQh4uBor/fUR9ZjmbZVvw95OD9If4w3MQxr99rg0DJZ/9CIORcpEqU5hQG7g==} + engines: {node: '>=14.16'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.1: + resolution: {integrity: sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + rax-children@1.0.0: + resolution: {integrity: sha512-sBKEXAMj9ik6SsPfPGgcQnqggmbWFyBdvAV/Cz/0f04bRA86BtWgbMri/9Dce0k8nkEC/BGWiiTdyA8Q49zIiw==} + engines: {npm: '>=3.0.0'} + peerDependencies: + rax: ^1.0.0 + + rax-clone-element@1.0.0: + resolution: {integrity: sha512-TaQMVuzoglvCTjbWATlvvwARmeWnG8kpENWNXrNDv0++x29GHNND/TBbx7sdtVs/QmYwYc8YmwRUhaBwKQi5eQ==} + engines: {npm: '>=3.0.0'} + peerDependencies: + rax: ^1.0.0 + + rax-create-factory@1.0.0: + resolution: {integrity: sha512-blBaVrurj/BOWelJhQWiuc0Kk8Ons1jsNsX78omaPBLkSOL7OkyJ3NC/0iKXHu425yWrGB6e5vho/qabROC7VQ==} + engines: {npm: '>=3.0.0'} + peerDependencies: + rax: ^1.0.0 + + rax-is-valid-element@1.0.1: + resolution: {integrity: sha512-ajvQlLr7sr7UK4T9lyJyn1gcdu7NIrF3NUAj+SWWNwG2GZ5ygKdSCRFzuu7evuAwLxqrCCk2tQLV6uxw0zYUXQ==} + engines: {npm: '>=3.0.0'} + + rax@1.2.3: + resolution: {integrity: sha512-/lkZ7Yb3be06e68y4wn5WIyudzvrnHiTEjeAznJ7nPrfmjoCan2hcKPXmTYXdHU+IqkvGbzDlLZRWbVtmRTAcw==} + engines: {npm: '>=3.0.0'} + + rc-align@4.0.15: + resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-cascader@3.34.0: + resolution: {integrity: sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-checkbox@3.5.0: + resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-collapse@3.9.0: + resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dialog@9.6.0: + resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-drawer@7.3.0: + resolution: {integrity: sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-dropdown@4.0.1: + resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + rc-dropdown@4.2.1: + resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + rc-field-form@2.7.0: + resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-image@7.12.0: + resolution: {integrity: sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input-number@9.5.0: + resolution: {integrity: sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-input@1.8.0: + resolution: {integrity: sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-mentions@2.20.0: + resolution: {integrity: sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-menu@9.16.1: + resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-menu@9.6.4: + resolution: {integrity: sha512-6DiNAjxjVIPLZXHffXxxcyE15d4isRL7iQ1ru4MqYDH2Cqc5bW96wZOdMydFtGLyDdnmEQ9jVvdCE9yliGvzkw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-motion@2.9.5: + resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-notification@5.6.4: + resolution: {integrity: sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-overflow@1.4.1: + resolution: {integrity: sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-pagination@5.1.0: + resolution: {integrity: sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-picker@4.11.3: + resolution: {integrity: sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + + rc-progress@4.0.0: + resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-rate@2.13.1: + resolution: {integrity: sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-resize-observer@1.4.3: + resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-segmented@2.7.0: + resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + + rc-select@14.16.8: + resolution: {integrity: sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-slider@11.1.8: + resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-steps@6.0.1: + resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-switch@4.1.0: + resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-table@7.51.1: + resolution: {integrity: sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tabs@11.16.1: + resolution: {integrity: sha512-bR7Dap23YyfzZQwtKomhiFEFzZuE7WaKWo+ypNRSGB9PDKSc6tM12VP8LWYkvmmQHthgwP0WRN8nFbSJWuqLYw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tabs@15.7.0: + resolution: {integrity: sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-textarea@1.10.2: + resolution: {integrity: sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tooltip@6.4.0: + resolution: {integrity: sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-tree-select@5.27.0: + resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==} + peerDependencies: + react: '*' + react-dom: '*' + + rc-tree@5.13.1: + resolution: {integrity: sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + + rc-trigger@5.3.4: + resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-upload@4.9.2: + resolution: {integrity: sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-util@5.44.4: + resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-virtual-list@3.19.1: + resolution: {integrity: sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-attr-converter@0.3.1: + resolution: {integrity: sha512-dSxo2Mn6Zx4HajeCeQNLefwEO4kNtV/0E682R1+ZTyFRPqxDa5zYb5qM/ocqw9Bxr/kFQO0IUiqdV7wdHw+Cdg==} + + react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + + react-docgen-typescript-dumi-tmp@1.22.1-0: + resolution: {integrity: sha512-wjuAm1yj+ZZucovow2VF0MXkH2SGZ+squZxfNdnam3oyUbHy/xZaU1ZabCn7rY+13ZFx0/NLda+ZuBgF3g8vBA==} + peerDependencies: + typescript: '>= 3.x' + + react-dom@16.14.0: + resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} + peerDependencies: + react: ^16.14.0 + + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + peerDependencies: + react: ^19.1.1 + + react-drag-listview@0.1.9: + resolution: {integrity: sha512-/OsYevKtCUlw4FhJIfZPH7INHEmyl89sSC5COzonHW5Z2c8rHg4DNYFnUxOyqH+65o7sHweL13oaf6wr7dFvPA==} + + react-error-boundary@3.1.4: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-json-view@1.21.3: + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + peerDependencies: + react: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-refresh@0.10.0: + resolution: {integrity: sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==} + engines: {node: '>=0.10.0'} + + react-router-config@5.1.1: + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + + react-router-dom@5.2.0: + resolution: {integrity: sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==} + peerDependencies: + react: '>=15' + + react-router@5.2.0: + resolution: {integrity: sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==} + peerDependencies: + react: '>=15' + + react-router@6.30.1: + resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-shadow@20.6.0: + resolution: {integrity: sha512-kY+w4OMNZ8Nj9YI9eiTgvvJ/wYO7XyX1D/LYhvwQZv5vw69iCiDtGB0BX/2U8gLUuZAMN+x/7rHJKqHh8wXFHQ==} + peerDependencies: + prop-types: ^15.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-textarea-autosize@8.5.9: + resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-transition-group@2.9.0: + resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + peerDependencies: + react: '>=15.0.0' + react-dom: '>=15.0.0' + + react@16.14.0: + resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} + engines: {node: '>=0.10.0'} + + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read@1.0.5: + resolution: {integrity: sha512-hDLATrzYLoMu23c/69pMC6u3fO3Y0qLTIygJkEZHLOn+AO2gSapu6QgrgwX9ehyVtaRoZVZbF4IuiZPPRdGgdg==} + engines: {node: '>=0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + + readdirp@3.5.0: + resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} + engines: {node: '>=8.10.0'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.0.1: + resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} + engines: {node: '>=4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.13.5: + resolution: {integrity: sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + registry-auth-token@3.4.0: + resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + rehype-autolink-headings@4.0.0: + resolution: {integrity: sha512-2lglJ+4S3A4RCz+zlKVWj1wHvwO4bjunAoEOgMfjphT59EVXwdMiJzrL/A2fuAX/33k/LhkGW6BEK1Cl1I5WQw==} + + rehype-mathjax@3.1.0: + resolution: {integrity: sha512-Pmz92Y56lBFmDjFc9nIdrKu1xzKSBYevcwKiKiG7b5JJg74q1E62nRSbPEm37vXaXn7Bn25iRsWcP39bJKkMxg==} + + rehype-remove-comments@4.0.2: + resolution: {integrity: sha512-E2FNohTuIs7QzUnEQs3SdYdCScsTgUN7yPeDNWi+gsvx+pbLzIAyp27TWz3Gm64jpdLi7/6HxyRHxdd1NVQ37A==} + + rehype-stringify@8.0.0: + resolution: {integrity: sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==} + + remark-frontmatter@3.0.0: + resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} + + remark-gfm@1.0.0: + resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} + + remark-math@4.0.0: + resolution: {integrity: sha512-lH7SoQenXtQrvL0bm+mjZbvOk//YWNuyR+MxV18Qyv8rgFmMEGNuB0TSCQDkoDaiJ40FCnG8lxErc/zhcedYbw==} + + remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + + remark-rehype@8.1.0: + resolution: {integrity: sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==} + + remark-stringify@9.0.1: + resolution: {integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==} + + remark@13.0.0: + resolution: {integrity: sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==} + + remote-origin-url@0.4.0: + resolution: {integrity: sha512-HYhdsT2pNd0LP4Osb0vtQ1iassxIc3Yk1oze7j8dMJFciMkW8e0rdg9E/mOunqtSVHSzvMfwLDIYzPnEDmpk6Q==} + engines: {node: '>= 0.8.0'} + + remote-origin-url@0.5.3: + resolution: {integrity: sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg==} + engines: {node: '>= 0.8.0'} + + remove-bom-buffer@3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + + remove-bom-stream@1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} + engines: {node: '>= 0.10'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + + replace-homedir@1.0.0: + resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} + engines: {node: '>= 0.10'} + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reserved-words@0.1.2: + resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + + resolve-options@1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} + engines: {node: '>= 0.10'} + + resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + retry@0.10.1: + resolution: {integrity: sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup@4.48.0: + resolution: {integrity: sha512-BXHRqK1vyt9XVSEHZ9y7xdYtuYbwVod2mLwOMFP7t/Eqoc1pHRlG/WdV2qNeNvZHRQdLedaFycljaYYM96RqJQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + run-queue@1.0.3: + resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.19.1: + resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + schema-utils@1.0.0: + resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} + engines: {node: '>= 4'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver-diff@2.1.0: + resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} + engines: {node: '>=0.10.0'} + + semver-greatest-satisfied-range@1.1.0: + resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} + engines: {node: '>= 0.10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallow-element-equals@1.0.1: + resolution: {integrity: sha512-TwyvU5ZIISuZAmX7juTupVggTW9avkp+Swz0amKicADbQrnhP5kAPkPbL8gKSFv9QkkzhTg2u3Se6TjGhn1xlQ==} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shortid@2.2.17: + resolution: {integrity: sha512-GpbM3gLF1UUXZvQw6MCyulHkWbRseNO4cyBEZresZRorwl1+SLu1ZdqgVtuwqz8mB6RpwPkm541mYSqrKyJSaA==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sitemap@6.4.0: + resolution: {integrity: sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==} + engines: {node: '>=10.3.0', npm: '>=5.6.0'} + hasBin: true + + slash2@2.0.0: + resolution: {integrity: sha512-7ElvBydJPi3MHU/KEOblFSbO/skl4Z69jKkFCpYIYVOMSIZsKi4gYU43HGeZPmjxCXrHekoDAAewphPQNnsqtA==} + engines: {node: '>=6'} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + smart-buffer@1.1.15: + resolution: {integrity: sha512-1+8bxygjTsNfvQe0/0pNBesTOlSHtOeG6b6LYbvsZCCHDKYZ40zcQo6YTnZBWrBSLWOCbrHljLdEmGMYebu7aQ==} + engines: {node: '>= 0.10.15', npm: '>= 1.3.5'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + socks-proxy-agent@3.0.1: + resolution: {integrity: sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==} + + socks@1.1.10: + resolution: {integrity: sha512-ArX4vGPULWjKDKgUnW8YzfI2uXW7kzgkJuB0GnFBA/PfT3exrrOk+7Wk2oeb894Qf20u1PWv9LEgrO0Z82qAzA==} + engines: {node: '>= 0.10.0', npm: '>= 1.3.5'} + deprecated: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0 + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@1.57.0: + resolution: {integrity: sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + sparkles@1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + specificity@0.4.1: + resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==} + hasBin: true + + speech-rule-engine@4.1.2: + resolution: {integrity: sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==} + hasBin: true + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split@0.3.1: + resolution: {integrity: sha512-hCHXkQDs1HFKRsrT9EutGT1hmjS1FW1Aei8dk/CxrT7mslcMtAxbiv8LYA/AYDvjB6h9rSXgW8zAZwg20tKMTw==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==} + + ssri@4.1.6: + resolution: {integrity: sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==} + + ssri@5.3.0: + resolution: {integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-browserify@2.0.2: + resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} + + stream-each@1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + + stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + + stream-http@2.8.3: + resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-convert@0.2.1: + resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@3.1.0: + resolution: {integrity: sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + style-equal@1.0.0: + resolution: {integrity: sha512-gf20kfwh7eXsgPcwvYqViCBHr+GXIlpXOZR1wQftNH4/ee2P/yolWUVA/MdMdmMp+0BMfvaMKSIR1DQlY64Btw==} + + style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + + style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + + style-unit@2.0.1: + resolution: {integrity: sha512-1OHU+0lWHrK22W3DDfLKFl5cOIwTxghbVRgtzgue+/9m5dqsYQhVBObQupMdtN6FIhpM375l18h8nLqPKgHfPQ==} + + style-unit@3.0.5: + resolution: {integrity: sha512-xL+kev1W1dPthdhpQqZs9Qk1zenQiHKyy9oy2/VasW4z6wi7m7qQvMe67foPsr99JSs0115X0TCN1ch1n0XqSw==} + + stylelint-config-css-modules@2.3.0: + resolution: {integrity: sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==} + peerDependencies: + stylelint: 11.x - 14.x + + stylelint-config-prettier@8.0.2: + resolution: {integrity: sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==} + engines: {node: '>= 10', npm: '>= 5'} + hasBin: true + peerDependencies: + stylelint: '>=11.0.0' + + stylelint-config-recommended@3.0.0: + resolution: {integrity: sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==} + peerDependencies: + stylelint: '>=10.1.0' + + stylelint-config-standard@20.0.0: + resolution: {integrity: sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==} + peerDependencies: + stylelint: '>=10.1.0' + + stylelint-declaration-block-no-ignored-properties@2.8.0: + resolution: {integrity: sha512-Ws8Cav7Y+SPN0JsV407LrnNXWOrqGjxShf+37GBtnU/C58Syve9c0+I/xpLcFOosST3ternykn3Lp77f3ITnFw==} + engines: {node: '>=6'} + peerDependencies: + stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + stylelint@13.13.1: + resolution: {integrity: sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==} + engines: {node: '>=10.13.0'} + hasBin: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + sugarss@2.0.0: + resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + surge-fstream-ignore@1.1.0: + resolution: {integrity: sha512-A3PZYu/d1/gCQtfI0k8uWQN5/WTKKsIAC1wGtCREbctXjE9cxgORZxJm6TCq/Wy6L1jl6PFQIpf4NidcWSkKMQ==} + + surge-ignore@0.2.0: + resolution: {integrity: sha512-ay4MPFjfiQzDsyTidljJLXQi22l2AwjcuamYnJWj/LdhaHdKmDJxRox52WXimdcLpMuLDtkQvv4+jEu+wu9eSw==} + + surge@0.21.7: + resolution: {integrity: sha512-XcMY2Z3I4kBZ1zVTOkeKmTcnAy/r9Mnu87+/3fAaN6ZCVnNy4Qtdh6ai77NwyORIltRP1cOn05sAi+nYoy5taQ==} + hasBin: true + + sver-compat@1.5.0: + resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + swiper@6.5.0: + resolution: {integrity: sha512-cSx1SpfgrHlgwku++3Ce3cjPBpXgB7P+bGik5S3+F+j6ID0NUeV6qtmedFdr3C8jXR/W+TJPVNIT9fH/cwVAiA==} + engines: {node: '>= 4.7.0'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + engines: {node: '>=6'} + + tar-fs@1.16.5: + resolution: {integrity: sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ==} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + tarr@1.1.0: + resolution: {integrity: sha512-tENbQ43IQckay71stp1p1lljRhoEZpZk10FzEZKW2tJcMcnLwV3CfZdxBAERlH6nwnFvnHMS9eJOJl6IzSsG0g==} + + term-size@1.2.0: + resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} + engines: {node: '>=4'} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.14.2: + resolution: {integrity: sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==} + engines: {node: '>=10'} + hasBin: true + + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + textextensions@2.6.0: + resolution: {integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==} + engines: {node: '>=0.8'} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + time-stamp@1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} + engines: {node: '>=0.10.0'} + + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-absolute-glob@2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} + engines: {node: '>=0.10.0'} + + to-arraybuffer@1.0.1: + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + to-through@2.0.0: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} + engines: {node: '>= 0.10'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + ts-node@10.9.2: + 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 + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + 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' + + tty-browserify@0.0.0: + resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + + umi@3.5.43: + resolution: {integrity: sha512-WWusH/o3MTGIJ+S6MiUquz5OwOAQKVdgGHD0CwYBBXcUmwodeZ1mpQSfj8u7VO/OLgVfCmBw8ENsdaWEK6OMtw==} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + undertaker-registry@1.0.1: + resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} + engines: {node: '>= 0.10'} + + undertaker@1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} + + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified@8.4.2: + resolution: {integrity: sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==} + + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + uniq@1.0.1: + resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} + + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + + unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + + unique-string@1.0.0: + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} + + unist-builder@2.0.3: + resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + + unist-util-filter@2.0.3: + resolution: {integrity: sha512-8k6Jl/KLFqIRTHydJlHh6+uFgqYHq66pV75pZgr1JwfyFSjbWb12yfb0yitW/0TbHXjr9U4G9BQpOvMANB+ExA==} + + unist-util-find-after@3.0.0: + resolution: {integrity: sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==} + + unist-util-find-all-after@3.0.2: + resolution: {integrity: sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==} + + unist-util-generated@1.1.6: + resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-position@3.1.0: + resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + universal-canvas-context@1.0.0: + resolution: {integrity: sha512-ZjdoQyp7sDNB6o1xj93ulD2u1KYjEmMqZMGvIABREjREFlix70O4BTWFrADpMRI3uW6A2N7L45y4xksKqaIvwQ==} + engines: {npm: '>=3.0.0'} + + universal-choose-image@1.3.0: + resolution: {integrity: sha512-j7L7Qk4X4rvBb8nsG5cqYPMahj1+/jkGsPUN1+1hvbX+H1aOs4gYcbnYCnQvmIZv1r4ghggvoS8Wgh95RcgfAA==} + engines: {npm: '>=3.0.0'} + peerDependencies: + rax: ^1.1.0 + + universal-device@1.0.3: + resolution: {integrity: sha512-27VnA0IXJ70JRLwxtmCYRxXJSe+r6KwgiPu0dx9e+WD3Y0Gn5nKbK083KG5FK1Nbtxjyl0kRgvfG6MpK3YKXrg==} + engines: {npm: '>=3.0.0'} + + universal-device@2.3.1: + resolution: {integrity: sha512-Z7aMODPW3CdhU4IicZ41l1PUZJLxENtEBZsks6fOKD4pyRkip1Z5EFdaDv/NdC35ccs7uR9SbkVF6QL3qwPWsw==} + engines: {npm: '>=3.0.0'} + + universal-element@0.0.6: + resolution: {integrity: sha512-J1olYldUlj35w4pBt1LljiRuRjohATGHCIiiOHOepXtELB8zESOdYDlrFtXfxGtb6TUZm8oAaOPbTwhb+6A4BA==} + engines: {npm: '>=3.0.0'} + + universal-env@0.6.6: + resolution: {integrity: sha512-CqBdTKFStTEV7wETHjWm7CDIbSdUxIlN3zQ5xraTG6Wb1XEmBgyW1pu8lJW0buRXjACgjrD+pr97akumbQ0Y6A==} + + universal-env@2.0.0: + resolution: {integrity: sha512-jfPJvPXFdhJHsDhuCHj3Njc3nxF+dmj6LeqKE9R41EdKKOJ1d5GGpFu3DrT+Ff+pxS9jsnbtj7BZYFAcLlxdPg==} + engines: {npm: '>=3.0.0'} + + universal-env@3.3.3: + resolution: {integrity: sha512-4ZyITvWhtcurCEA66Cb7jcd4zpEiAAo91wSwbEscbiu033pIsC2yjgT8LYyasFgsst6jZHD1gtVoSyYcL8oH1Q==} + engines: {npm: '>=3.0.0'} + + universal-panresponder@0.6.5: + resolution: {integrity: sha512-7N9xSPgILxBr12krtyTl2KjN7wWxirtdH2/NsQj234KHrHt8yQ8hIgi6sjW4eyP3/5QtAn2JWwPSYdFmgHvg4w==} + + universal-transition@1.1.1: + resolution: {integrity: sha512-TeYwWDhoYSYeGwX2L80gAQx7wByGvQ1WsPxqp+c6yYzqrc6BUuqpohtWY5Gh4ZPo0nToSNeadhly9sjeGLlV6Q==} + engines: {npm: '>=3.0.0'} + + universal-unit-tool@1.0.0: + resolution: {integrity: sha512-YTKN4pUqgAQqP5duZQSTxv2zswkUdZ4z3KtRgpXOxlo3huJm7xbiwhxeX8RM675Tjfo4entn8yQHclFJy9iaQQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + unzip-response@2.0.1: + resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} + engines: {node: '>=4'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@2.5.0: + resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} + engines: {node: '>=4'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + url-parse-as-address@1.0.0: + resolution: {integrity: sha512-1WJ8YX1Kcec9wgxy8d/ATzGP1ayO6BRnd3iB6NlM+7cOnn6U8p5PKppRTCPLobh3CSdJ4d0TdPjopzyU2KcVFw==} + + url-parse-lax@1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + use-composed-ref@1.4.0: + resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-isomorphic-layout-effect@1.2.1: + resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.3.0: + resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-subscription@1.5.1: + resolution: {integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + + util@0.11.1: + resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + + v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + + v8flags@3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + + value-or-function@3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} + engines: {node: '>= 0.10'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vfile-location@3.2.0: + resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vinyl-fs@3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + + vinyl-sourcemap@1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} + engines: {node: '>= 0.10'} + + vinyl-sourcemaps-apply@0.2.1: + resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} + + vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.1.3: + resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest-websocket-mock@0.5.0: + resolution: {integrity: sha512-vzBWeuF/kD/OCOFzB7WAclb7PxfI105qPkZtdOkPMwZdilBskQjJL4l319JtPtmeovDU7ZVhO3hTfGPjM4txQQ==} + peerDependencies: + vitest: '>=3' + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + web-namespaces@1.1.4: + resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + + webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-chain@6.5.1: + resolution: {integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==} + engines: {node: '>=8'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + webpack-cli@6.0.1: + resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} + engines: {node: '>=18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.82.0 + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack@5.101.3: + resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wicked-good-xpath@1.3.0: + resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} + + widest-line@2.0.1: + resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} + engines: {node: '>=4'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@3.0.0: + resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} + engines: {node: '>=4'} + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-parser@5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + +snapshots: + + '@alifd/babel-runtime-jsx-style-transform@1.0.0': {} + + '@alifd/field@1.7.0': + dependencies: + '@alifd/validate': 1.4.0 + prop-types: 15.8.1 + + '@alifd/field@2.0.4': + dependencies: + '@alifd/validate': 2.0.3 + tslib: 2.8.1 + + '@alifd/meet-react-component-one@1.3.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@gcanvas/core': 1.0.0 + classnames: 2.5.1 + omit.js: 2.0.2 + prop-types: 15.8.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + style-unit: 2.0.1 + swiper: 6.5.0 + tslib: 2.8.1 + universal-env: 3.3.3 + universal-panresponder: 0.6.5 + universal-transition: 1.1.1 + + '@alifd/meet-react@2.9.9(rax@1.2.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@alifd/babel-runtime-jsx-style-transform': 1.0.0 + '@alifd/field': 1.7.0 + '@alifd/meet-react-component-one': 1.3.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@uni/clipboard': 1.0.9 + '@uni/env': 1.1.1 + '@uni/file': 1.1.1 + '@uni/image': 1.1.3 + '@uni/navigate': 1.0.11 + '@uni/page-scroll-to': 1.0.0 + '@uni/vibrate': 1.0.1 + classnames: 2.2.6 + dayjs: 1.11.13 + driver-universal: 3.5.0 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tslib: 2.8.1 + universal-canvas-context: 1.0.0 + universal-choose-image: 1.3.0(rax@1.2.3) + universal-element: 0.0.6 + transitivePeerDependencies: + - rax + + '@alifd/next@1.27.32(@alifd/meet-react@2.9.9(rax@1.2.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(moment@2.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@alifd/field': 2.0.4 + '@alifd/meet-react': 2.9.9(rax@1.2.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@alifd/overlay': 0.3.7 + '@alifd/validate': 2.0.3 + '@types/react-transition-group': 4.4.12(@types/react@19.1.11) + babel-runtime: 6.26.0 + big.js: 6.2.2 + classnames: 2.5.1 + dayjs: 1.11.13 + hoist-non-react-statics: 3.3.2 + lodash.clonedeep: 4.5.0 + moment: 2.30.1 + prop-types: 15.8.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-lifecycles-compat: 3.0.4 + react-transition-group: 2.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + resize-observer-polyfill: 1.5.1 + shallow-element-equals: 1.0.1 + tslib: 2.8.1 + transitivePeerDependencies: + - '@types/react' + + '@alifd/overlay@0.3.7': + dependencies: + resize-observer-polyfill: 1.5.1 + + '@alifd/validate@1.4.0': {} + + '@alifd/validate@2.0.3': + dependencies: + tslib: 2.8.1 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@ant-design/colors@7.2.1': + dependencies: + '@ant-design/fast-color': 2.0.6 + + '@ant-design/cssinjs-utils@1.1.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@ant-design/cssinjs': 1.24.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@babel/runtime': 7.28.3 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@ant-design/cssinjs@1.24.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + stylis: 4.3.6 + + '@ant-design/fast-color@2.0.6': + dependencies: + '@babel/runtime': 7.28.3 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons@5.6.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@ant-design/colors': 7.2.1 + '@ant-design/icons-svg': 4.4.2 + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@ant-design/react-slick@1.1.2(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + json2mq: 0.2.0 + react: 19.1.1 + resize-observer-polyfill: 1.5.1 + throttle-debounce: 5.0.2 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@babel/cli@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@jridgewell/trace-mapping': 0.3.30 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + + '@babel/code-frame@7.12.11': + dependencies: + '@babel/highlight': 7.25.9 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.18.6': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.18.6 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.18.6) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.18.6 + '@babel/types': 7.18.6 + convert-source-map: 1.9.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.28.0(@babel/core@7.28.3)(eslint@7.32.0)': + dependencies: + '@babel/core': 7.28.3 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.18.6': + dependencies: + '@babel/types': 7.18.6 + '@jridgewell/gen-mapping': 0.3.13 + jsesc: 2.5.2 + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.18.6)': + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.18.6(@babel/core@7.18.6)': + dependencies: + '@babel/core': 7.18.6 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.18.6) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-simple-access': 7.27.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-regenerator': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.3) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.2 + esutils: 2.0.3 + + '@babel/preset-react@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.18.6': + dependencies: + regenerator-runtime: 0.13.11 + + '@babel/runtime@7.28.3': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@babel/traverse@7.18.6': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.18.6 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.28.3 + '@babel/types': 7.18.6 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.18.6': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + to-fast-properties: 2.0.0 + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@biomejs/biome@2.2.2': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.2.2 + '@biomejs/cli-darwin-x64': 2.2.2 + '@biomejs/cli-linux-arm64': 2.2.2 + '@biomejs/cli-linux-arm64-musl': 2.2.2 + '@biomejs/cli-linux-x64': 2.2.2 + '@biomejs/cli-linux-x64-musl': 2.2.2 + '@biomejs/cli-win32-arm64': 2.2.2 + '@biomejs/cli-win32-x64': 2.2.2 + + '@biomejs/cli-darwin-arm64@2.2.2': + optional: true + + '@biomejs/cli-darwin-x64@2.2.2': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.2.2': + optional: true + + '@biomejs/cli-linux-arm64@2.2.2': + optional: true + + '@biomejs/cli-linux-x64-musl@2.2.2': + optional: true + + '@biomejs/cli-linux-x64@2.2.2': + optional: true + + '@biomejs/cli-win32-arm64@2.2.2': + optional: true + + '@biomejs/cli-win32-x64@2.2.2': + optional: true + + '@bloomberg/record-tuple-polyfill@0.0.3': {} + + '@commitlint/cli@17.8.1': + dependencies: + '@commitlint/format': 17.8.1 + '@commitlint/lint': 17.8.1 + '@commitlint/load': 17.8.1 + '@commitlint/read': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/config-conventional@17.8.1': + dependencies: + conventional-changelog-conventionalcommits: 6.1.0 + + '@commitlint/config-validator@17.8.1': dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 + '@commitlint/types': 17.8.1 + ajv: 8.17.1 + + '@commitlint/ensure@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@17.8.1': {} + + '@commitlint/format@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 + + '@commitlint/is-ignored@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + semver: 7.5.4 + + '@commitlint/lint@17.8.1': + dependencies: + '@commitlint/is-ignored': 17.8.1 + '@commitlint/parse': 17.8.1 + '@commitlint/rules': 17.8.1 + '@commitlint/types': 17.8.1 + + '@commitlint/load@17.8.1': + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/execute-rule': 17.8.1 + '@commitlint/resolve-extends': 17.8.1 + '@commitlint/types': 17.8.1 + '@types/node': 20.5.1 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.2))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.2))(typescript@5.9.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/message@17.8.1': {} + + '@commitlint/parse@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + conventional-changelog-angular: 6.0.0 + conventional-commits-parser: 4.0.0 + + '@commitlint/read@17.8.1': + dependencies: + '@commitlint/top-level': 17.8.1 + '@commitlint/types': 17.8.1 + fs-extra: 11.3.1 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + + '@commitlint/resolve-extends@17.8.1': + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/types': 17.8.1 + import-fresh: 3.3.1 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + + '@commitlint/rules@17.8.1': + dependencies: + '@commitlint/ensure': 17.8.1 + '@commitlint/message': 17.8.1 + '@commitlint/to-lines': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + + '@commitlint/to-lines@17.8.1': {} + + '@commitlint/top-level@17.8.1': + dependencies: + find-up: 5.0.0 + + '@commitlint/types@17.8.1': + dependencies: + chalk: 4.1.2 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/convert-colors@1.4.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@discoveryjs/json-ext@0.6.3': {} + + '@emotion/hash@0.8.0': {} + + '@emotion/unitless@0.7.5': {} + + '@esbuild/aix-ppc64@0.25.9': + optional: true + + '@esbuild/android-arm64@0.25.9': + optional: true + + '@esbuild/android-arm@0.25.9': + optional: true + + '@esbuild/android-x64@0.25.9': + optional: true + + '@esbuild/darwin-arm64@0.25.9': + optional: true + + '@esbuild/darwin-x64@0.25.9': + optional: true + + '@esbuild/freebsd-arm64@0.25.9': + optional: true + + '@esbuild/freebsd-x64@0.25.9': + optional: true + + '@esbuild/linux-arm64@0.25.9': + optional: true + + '@esbuild/linux-arm@0.25.9': + optional: true + + '@esbuild/linux-ia32@0.25.9': + optional: true + + '@esbuild/linux-loong64@0.25.9': + optional: true + + '@esbuild/linux-mips64el@0.25.9': + optional: true + + '@esbuild/linux-ppc64@0.25.9': + optional: true + + '@esbuild/linux-riscv64@0.25.9': + optional: true + + '@esbuild/linux-s390x@0.25.9': + optional: true + + '@esbuild/linux-x64@0.25.9': + optional: true + + '@esbuild/netbsd-arm64@0.25.9': + optional: true + + '@esbuild/netbsd-x64@0.25.9': + optional: true + + '@esbuild/openbsd-arm64@0.25.9': + optional: true + + '@esbuild/openbsd-x64@0.25.9': + optional: true + + '@esbuild/openharmony-arm64@0.25.9': + optional: true + + '@esbuild/sunos-x64@0.25.9': + optional: true + + '@esbuild/win32-arm64@0.25.9': + optional: true + + '@esbuild/win32-ia32@0.25.9': + optional: true + + '@esbuild/win32-x64@0.25.9': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@7.32.0)': + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@0.4.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 7.3.1 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.1 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@jest/schemas/28.1.3: - resolution: - { - integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - dependencies: - '@sinclair/typebox': 0.24.46 - dev: true + '@gcanvas/core@1.0.0': {} + + '@humanwhocodes/config-array@0.5.0': + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/object-schema@1.2.1': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + 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 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mapbox/hast-util-to-jsx@1.0.0': + dependencies: + kebab-case: 1.0.2 + postcss: 7.0.39 + postcss-js: 2.0.3 + property-information: 5.6.0 + react-attr-converter: 0.3.1 + stringify-entities: 3.1.0 + stringify-object: 3.3.0 + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + optional: true + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rc-component/async-validator@5.0.4': + dependencies: + '@babel/runtime': 7.28.3 + + '@rc-component/color-picker@2.0.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@ant-design/fast-color': 2.0.6 + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@rc-component/context@1.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@rc-component/mini-decimal@1.1.0': + dependencies: + '@babel/runtime': 7.28.3 + + '@rc-component/mutate-observer@1.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@rc-component/portal@1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@rc-component/qrcode@1.0.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@rc-component/tour@1.15.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/portal': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@rc-component/trigger@2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/portal': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@remix-run/router@1.23.0': {} + + '@rollup/rollup-android-arm-eabi@4.48.0': + optional: true + + '@rollup/rollup-android-arm64@4.48.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.48.0': + optional: true + + '@rollup/rollup-darwin-x64@4.48.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.48.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.48.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.48.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.48.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.48.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.48.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.48.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.48.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.48.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.48.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.48.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.48.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.48.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.48.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.48.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.48.0': + optional: true - /@jest/source-map/27.5.1: - resolution: - { - integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + '@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39)': dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.10 - source-map: 0.6.1 - dev: true - - /@jest/test-result/27.5.1: - resolution: - { - integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/console': 27.5.1 - '@jest/types': 27.5.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer/27.5.1: - resolution: - { - integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/test-result': 27.5.1 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 + '@babel/core': 7.28.3 + postcss: 7.0.39 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) transitivePeerDependencies: - supports-color - dev: true - - /@jest/transform/27.5.1: - resolution: - { - integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@babel/core': 7.19.3 - '@jest/types': 27.5.1 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 + + '@stylelint/postcss-markdown@0.36.2(postcss-syntax@0.36.2)(postcss@7.0.39)': + dependencies: + postcss: 7.0.39 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) + remark: 13.0.0 + unist-util-find-all-after: 3.0.2 transitivePeerDependencies: - supports-color - dev: true - - /@jest/types/26.6.2: - resolution: - { - integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==, - } - engines: { node: '>= 10.14.2' } - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.8.4 - '@types/yargs': 15.0.14 - chalk: 4.1.2 - dev: true - - /@jest/types/27.5.1: - resolution: - { - integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.8.4 - '@types/yargs': 16.0.4 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping/0.1.1: - resolution: - { - integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/gen-mapping/0.3.2: - resolution: - { - integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==, - } - engines: { node: '>=6.0.0' } - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.16 - dev: true - - /@jridgewell/resolve-uri/3.1.0: - resolution: - { - integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, - } - engines: { node: '>=6.0.0' } - dev: true - - /@jridgewell/set-array/1.1.2: - resolution: - { - integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, - } - engines: { node: '>=6.0.0' } - dev: true - - /@jridgewell/source-map/0.3.2: - resolution: - { - integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==, - } - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.16 - dev: true - - /@jridgewell/sourcemap-codec/1.4.14: - resolution: - { - integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, - } - dev: true - - /@jridgewell/trace-mapping/0.3.16: - resolution: - { - integrity: sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==, - } - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping/0.3.9: - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@mapbox/hast-util-to-jsx/1.0.0: - resolution: - { - integrity: sha512-HJRp3qkr0uGIBFASzA8rVATLo6y/UoOMoD8eXsG8HVofk5Dokc9PV+dh266zYLZniYgtpJbc2+AKf1fNpsVqAA==, - } - engines: { node: '>=10' } + + '@testing-library/dom@10.4.1': dependencies: - kebab-case: 1.0.2 - postcss: 7.0.39 - postcss-js: 2.0.3 - property-information: 5.6.0 - react-attr-converter: 0.3.1 - stringify-entities: 3.1.0 - stringify-object: 3.3.0 - dev: true - - /@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3: - resolution: - { - integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==, - } - requiresBuild: true - dev: true - optional: true + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.3 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 - /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: - resolution: - { - integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==, - } + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.7(@types/react@19.1.11))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - eslint-scope: 5.1.1 - dev: true + '@babel/runtime': 7.28.3 + '@testing-library/dom': 10.4.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.11 + '@types/react-dom': 19.1.7(@types/react@19.1.11) + + '@tootallnate/once@1.1.2': {} - /@nodelib/fs.scandir/2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/aria-query@5.0.4': {} + + '@types/chai@5.2.2': 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' } + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + + '@types/eslint-scope@3.7.7': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 - dev: true - - /@remix-run/router/1.0.2: - resolution: - { - integrity: sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ==, - } - engines: { node: '>=14' } - dev: false - - /@sinclair/typebox/0.24.46: - resolution: - { - integrity: sha512-ng4ut1z2MCBhK/NwDVwIQp3pAUOCs/KNaW3cBxdFB2xTDrOuo1xuNmpr/9HHFhxqIvHrs1NTH3KJg6q+JSy1Kw==, - } - dev: true - - /@sinonjs/commons/1.8.3: - resolution: - { - integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers/8.1.0: - resolution: - { - integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==, - } - dependencies: - '@sinonjs/commons': 1.8.3 - dev: true - - /@stylelint/postcss-css-in-js/0.37.3_j55xdkkcxc32kvnyvx3y7casfm: - resolution: - { - integrity: sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==, - } - peerDependencies: - postcss: '>=7.0.0' - postcss-syntax: '>=0.36.2' + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@7.29.0': dependencies: - '@babel/core': 7.19.3 - postcss: 7.0.39 - postcss-syntax: 0.36.2_postcss@7.0.39 - transitivePeerDependencies: - - supports-color - dev: true + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 - /@stylelint/postcss-markdown/0.36.2_j55xdkkcxc32kvnyvx3y7casfm: - resolution: - { - integrity: sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==, - } - deprecated: 'Use the original unforked package instead: postcss-markdown' - peerDependencies: - postcss: '>=7.0.0' - postcss-syntax: '>=0.36.2' + '@types/eslint@9.6.1': dependencies: - postcss: 7.0.39 - postcss-syntax: 0.36.2_postcss@7.0.39 - remark: 13.0.0 - unist-util-find-all-after: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@testing-library/dom/7.31.2: - resolution: - { - integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==, - } - engines: { node: '>=10' } - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/runtime': 7.19.4 - '@types/aria-query': 4.2.2 - aria-query: 4.2.2 - chalk: 4.1.2 - dom-accessibility-api: 0.5.14 - lz-string: 1.4.4 - pretty-format: 26.6.2 - dev: true - - /@testing-library/react-hooks/8.0.1_dahwe3hk4b2k22ca2w2l5lt4hq: - resolution: - { - integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==, - } - engines: { node: '>=12' } - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-dom: - optional: true - react-test-renderer: - optional: true + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.8': {} + + '@types/glob@7.2.0': dependencies: - '@babel/runtime': 7.19.4 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-error-boundary: 3.1.4_react@16.14.0 - react-test-renderer: 16.14.0_react@16.14.0 - dev: true - - /@testing-library/react/10.4.9_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-pHZKkqUy0tmiD81afs8xfiuseXfU/N7rAX3iKjeZYje86t9VaB0LrxYVa+OOsvkrveX5jCK3IjajVn2MbePvqA==, - } - engines: { node: '>=10' } - peerDependencies: - react: '*' - react-dom: '*' + '@types/minimatch': 6.0.0 + '@types/node': 24.3.0 + + '@types/hast@2.3.10': dependencies: - '@babel/runtime': 7.19.4 - '@testing-library/dom': 7.31.2 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /@tootallnate/once/1.1.2: - resolution: - { - integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, - } - engines: { node: '>= 6' } - 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.3: - resolution: - { - integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==, - } - dev: true - - /@types/aria-query/4.2.2: - resolution: - { - integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==, - } - dev: true - - /@types/babel__core/7.1.19: - resolution: - { - integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==, - } - dependencies: - '@babel/parser': 7.19.4 - '@babel/types': 7.19.4 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.2 - dev: true - - /@types/babel__generator/7.6.4: - resolution: - { - integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==, - } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@types/babel__template/7.4.1: - resolution: - { - integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==, - } - dependencies: - '@babel/parser': 7.19.4 - '@babel/types': 7.19.4 - dev: true - - /@types/babel__traverse/7.18.2: - resolution: - { - integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==, - } - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@types/cheerio/0.22.31: - resolution: - { - integrity: sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==, - } - dependencies: - '@types/node': 18.8.4 - dev: true - - /@types/enzyme/3.10.12: - resolution: - { - integrity: sha512-xryQlOEIe1TduDWAOphR0ihfebKFSWOXpIsk+70JskCfRfW+xALdnJ0r1ZOTo85F9Qsjk6vtlU7edTYHbls9tA==, - } - dependencies: - '@types/cheerio': 0.22.31 - '@types/react': 18.0.21 - dev: true - - /@types/eslint/7.29.0: - resolution: - { - integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==, - } - dependencies: - '@types/estree': 1.0.0 - '@types/json-schema': 7.0.11 - dev: true - - /@types/estree/1.0.0: - resolution: - { - integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==, - } - dev: true - - /@types/glob/7.2.0: - resolution: - { - integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==, - } - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.8.4 - dev: true - - /@types/graceful-fs/4.1.5: - resolution: - { - integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==, - } - dependencies: - '@types/node': 18.8.4 - dev: true - - /@types/hast/2.3.4: - resolution: - { - integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==, - } - dependencies: - '@types/unist': 2.0.6 - dev: true - - /@types/history/4.7.11: - resolution: - { - integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==, - } - dev: true - - /@types/history/5.0.0: - resolution: - { - integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==, - } - deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. + '@types/unist': 2.0.11 + + '@types/history@4.7.11': {} + + '@types/history@5.0.0': dependencies: history: 5.3.0 - dev: true - - /@types/istanbul-lib-coverage/2.0.4: - resolution: - { - integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==, - } - dev: true - - /@types/istanbul-lib-report/3.0.0: - resolution: - { - integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==, - } - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports/3.0.1: - resolution: - { - integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==, - } - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - - /@types/jest/27.5.2: - resolution: - { - integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==, - } - dependencies: - jest-matcher-utils: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /@types/js-cookie/2.2.6: - resolution: - { - integrity: sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw==, - } - - /@types/json-schema/7.0.11: - resolution: - { - integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==, - } - dev: true - - /@types/keyv/3.1.4: - resolution: - { - integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, - } - dependencies: - '@types/node': 18.8.4 - dev: true - - /@types/lodash.debounce/4.0.7: - resolution: - { - integrity: sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA==, - } - dependencies: - '@types/lodash': 4.14.186 - dev: true - - /@types/lodash.isequal/4.5.6: - resolution: - { - integrity: sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==, - } - dependencies: - '@types/lodash': 4.14.186 - dev: true - - /@types/lodash.throttle/4.1.7: - resolution: - { - integrity: sha512-znwGDpjCHQ4FpLLx19w4OXDqq8+OvREa05H89obtSyXyOFKL3dDjCslsmfBz0T2FU8dmf5Wx1QvogbINiGIu9g==, - } - dependencies: - '@types/lodash': 4.14.186 - dev: true - - /@types/lodash/4.14.186: - resolution: - { - integrity: sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==, - } - dev: true - - /@types/mathjax/0.0.36: - resolution: - { - integrity: sha512-TqDJc2GWuTqd/m+G/FbNkN+/TF2OCCHvcawmhIrUaZkdVquMdNZmNiNUkupNg9qctorXXkVLVSogZv1DhmgLmg==, - } - dev: true - - /@types/mdast/3.0.10: - resolution: - { - integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==, - } - dependencies: - '@types/unist': 2.0.6 - dev: true - - /@types/minimatch/3.0.5: - resolution: - { - integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, - } - dev: true - - /@types/minimatch/5.1.2: - resolution: - { - integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, - } - dev: true - - /@types/minimist/1.2.2: - resolution: - { - integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, - } - dev: true - - /@types/node/14.18.32: - resolution: - { - integrity: sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==, - } - dev: true - - /@types/node/18.8.4: - resolution: - { - integrity: sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==, - } - dev: true - - /@types/normalize-package-data/2.4.1: - resolution: - { - integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, - } - dev: true - - /@types/parse-json/4.0.0: - resolution: - { - integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==, - } - dev: true - - /@types/parse5/5.0.3: - resolution: - { - integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==, - } - dev: true - - /@types/prettier/2.7.1: - resolution: - { - integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==, - } - dev: true - - /@types/prop-types/15.7.5: - resolution: - { - integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==, - } - dev: true - - /@types/react-dom/16.9.16: - resolution: - { - integrity: sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg==, - } - dependencies: - '@types/react': 16.14.32 - dev: true - - /@types/react-router-config/5.0.2: - resolution: - { - integrity: sha512-WOSetDV3YPxbkVJAdv/bqExJjmcdCi/vpCJh3NfQOy1X15vHMSiMioXIcGekXDJJYhqGUMDo9e337mh508foAA==, - } + + '@types/js-cookie@3.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 24.3.0 + + '@types/lodash@4.17.20': {} + + '@types/mathjax@0.0.36': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + + '@types/minimatch@6.0.0': + dependencies: + minimatch: 10.0.3 + + '@types/minimist@1.2.5': {} + + '@types/mockjs@1.0.10': {} + + '@types/node@14.18.63': {} + + '@types/node@20.5.1': {} + + '@types/node@24.3.0': + dependencies: + undici-types: 7.10.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/parse-json@4.0.2': {} + + '@types/parse5@5.0.3': {} + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@16.9.25(@types/react@16.14.66)': + dependencies: + '@types/react': 16.14.66 + + '@types/react-dom@19.1.7(@types/react@19.1.11)': + dependencies: + '@types/react': 19.1.11 + + '@types/react-router-config@5.0.11': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.1.11 + '@types/react-router': 5.1.20 + + '@types/react-router-config@5.0.2': dependencies: '@types/history': 5.0.0 - '@types/react': 18.0.21 - '@types/react-router': 5.1.19 - dev: true + '@types/react': 19.1.11 + '@types/react-router': 5.1.20 - /@types/react-router-dom/5.1.7: - resolution: - { - integrity: sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==, - } + '@types/react-router-dom@5.1.7': dependencies: '@types/history': 5.0.0 - '@types/react': 18.0.21 - '@types/react-router': 5.1.19 - dev: true + '@types/react': 19.1.11 + '@types/react-router': 5.1.20 - /@types/react-router/5.1.12: - resolution: - { - integrity: sha512-0bhXQwHYfMeJlCh7mGhc0VJTRm0Gk+Z8T00aiP4702mDUuLs9SMhnd2DitpjWFjdOecx2UXtICK14H9iMnziGA==, - } + '@types/react-router@5.1.12': dependencies: '@types/history': 5.0.0 - '@types/react': 18.0.21 - dev: true + '@types/react': 19.1.11 - /@types/react-router/5.1.19: - resolution: - { - integrity: sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==, - } + '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.21 - dev: true - - /@types/react/16.14.32: - resolution: - { - integrity: sha512-hvEy4vGVADbtj/U6+CA5SRC5QFIjdxD7JslAie8EuAYZwhYY9bgforpXNyF1VFzhnkEOesDy1278t1wdjN74cw==, - } - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - dev: true - - /@types/react/18.0.21: - resolution: - { - integrity: sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==, - } - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - dev: true - - /@types/responselike/1.0.0: - resolution: - { - integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==, - } - dependencies: - '@types/node': 18.8.4 - dev: true - - /@types/sax/1.2.4: - resolution: - { - integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==, - } - dependencies: - '@types/node': 18.8.4 - dev: true - - /@types/scheduler/0.16.2: - resolution: - { - integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==, - } - dev: true - - /@types/stack-utils/2.0.1: - resolution: - { - integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==, - } - dev: true - - /@types/unist/2.0.6: - resolution: - { - integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==, - } - dev: true - - /@types/yargs-parser/21.0.0: - resolution: - { - integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==, - } - dev: true - - /@types/yargs/15.0.14: - resolution: - { - integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==, - } - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@types/yargs/16.0.4: - resolution: - { - integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==, - } - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin/5.40.0_bjgutjmzwoxcmti7ime6tsylke: - resolution: - { - integrity: sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/react': 19.1.11 + + '@types/react-transition-group@4.4.12(@types/react@19.1.11)': + dependencies: + '@types/react': 19.1.11 + + '@types/react@16.14.66': + dependencies: + '@types/prop-types': 15.7.15 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + '@types/react@19.1.11': + dependencies: + csstype: 3.1.3 + + '@types/responselike@1.0.3': dependencies: - '@typescript-eslint/parser': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim - '@typescript-eslint/scope-manager': 5.40.0 - '@typescript-eslint/type-utils': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim - '@typescript-eslint/utils': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim - debug: 4.3.4 + '@types/node': 24.3.0 + + '@types/sax@1.2.7': + dependencies: + '@types/node': 14.18.63 + + '@types/scheduler@0.16.8': {} + + '@types/semver@7.7.0': {} + + '@types/unist@2.0.11': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + debug: 4.4.1 eslint: 7.32.0 - ignore: 5.2.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.2 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 5.9.2 transitivePeerDependencies: - supports-color - dev: true - - /@typescript-eslint/experimental-utils/4.33.0_3rubbgt5ekhqrcgx4uwls3neim: - resolution: - { - integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - peerDependencies: - eslint: '*' + + '@typescript-eslint/experimental-utils@4.33.0(eslint@7.32.0)(typescript@4.9.5)': dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.8.4 + '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 + eslint-utils: 3.0.0(eslint@7.32.0) transitivePeerDependencies: - supports-color - typescript - dev: true - - /@typescript-eslint/parser/5.40.0_3rubbgt5ekhqrcgx4uwls3neim: - resolution: - { - integrity: sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + + '@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 5.40.0 - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 - debug: 4.3.4 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.4.1 eslint: 7.32.0 - typescript: 4.8.4 + optionalDependencies: + typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager/4.33.0: - resolution: - { - integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==, - } - engines: { node: ^8.10.0 || ^10.13.0 || >=11.10.1 } + '@typescript-eslint/scope-manager@4.33.0': dependencies: '@typescript-eslint/types': 4.33.0 '@typescript-eslint/visitor-keys': 4.33.0 - dev: true - - /@typescript-eslint/scope-manager/5.40.0: - resolution: - { - integrity: sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/visitor-keys': 5.40.0 - dev: true - - /@typescript-eslint/type-utils/5.40.0_3rubbgt5ekhqrcgx4uwls3neim: - resolution: - { - integrity: sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@7.32.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 - '@typescript-eslint/utils': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + debug: 4.4.1 eslint: 7.32.0 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - - /@typescript-eslint/types/4.33.0: - resolution: - { - integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==, - } - engines: { node: ^8.10.0 || ^10.13.0 || >=11.10.1 } - dev: true - - /@typescript-eslint/types/5.40.0: - resolution: - { - integrity: sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - /@typescript-eslint/typescript-estree/4.33.0_typescript@4.8.4: - resolution: - { - integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + + '@typescript-eslint/types@4.33.0': {} + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5)': dependencies: '@typescript-eslint/types': 4.33.0 '@typescript-eslint/visitor-keys': 4.33.0 - debug: 4.3.4 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + semver: 7.7.2 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - - /@typescript-eslint/typescript-estree/5.40.0_typescript@4.8.4: - resolution: - { - integrity: sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/visitor-keys': 5.40.0 - debug: 4.3.4 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + semver: 7.7.2 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 transitivePeerDependencies: - supports-color - dev: true - - /@typescript-eslint/utils/5.40.0_3rubbgt5ekhqrcgx4uwls3neim: - resolution: - { - integrity: sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@4.9.5)': dependencies: - '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.40.0 - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 + '@eslint-community/eslint-utils': 4.7.0(eslint@7.32.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 - semver: 7.3.8 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys/4.33.0: - resolution: - { - integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==, - } - engines: { node: ^8.10.0 || ^10.13.0 || >=11.10.1 } + '@typescript-eslint/visitor-keys@4.33.0': dependencies: '@typescript-eslint/types': 4.33.0 eslint-visitor-keys: 2.1.0 - dev: true - - /@typescript-eslint/visitor-keys/5.40.0: - resolution: - { - integrity: sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - '@typescript-eslint/types': 5.40.0 - eslint-visitor-keys: 3.3.0 - dev: true - - /@umijs/ast/3.5.34: - resolution: - { - integrity: sha512-gQtDgiSQnDoHD19PvH9VHA6aCq6KXxO724Lr/OiyBwrHvSiCD8ia1mHt26EsV9tLOC4yEnLwIDwv4EsE8Qc9lg==, - } - dependencies: - '@umijs/utils': 3.5.34 - dev: true - - /@umijs/babel-plugin-auto-css-modules/3.5.34: - resolution: - { - integrity: sha512-2Sqw8VdGPVt4wZL5XZfv+qaabWJ/F/rlsVhfoxf7OKvlIjLU2gDipfQFCa5z6wKJTlUwwB5mUJgXJZHDAduqKQ==, - } - dependencies: - '@umijs/utils': 3.5.34 - dev: true - - /@umijs/babel-plugin-import-to-await-require/3.5.34: - resolution: - { - integrity: sha512-XO6zftny0k8/y4+PzMYja/4om5DtXxLEj7Vp3hom8CUBM9GUO5sfe0mAXkmrjO6EtblLBJUWu0FrjRe6ULNJqw==, - } - dependencies: - '@umijs/utils': 3.5.34 - dev: true - - /@umijs/babel-plugin-lock-core-js-3/3.5.34: - resolution: - { - integrity: sha512-LzXi5pDd3lpJguH0pUw85rGx6COlWYHWHGMWpZVjJbZ2AIHUtga2ewbl9VOAK+4Ra85lgFSIggQX+cNTvaGObA==, - } - dependencies: - '@umijs/utils': 3.5.34 + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@umijs/ast@3.5.43': + dependencies: + '@umijs/utils': 3.5.43 + + '@umijs/babel-plugin-auto-css-modules@3.5.43': + dependencies: + '@umijs/utils': 3.5.43 + + '@umijs/babel-plugin-import-to-await-require@3.5.43': + dependencies: + '@umijs/utils': 3.5.43 + + '@umijs/babel-plugin-lock-core-js-3@3.5.43': + dependencies: + '@umijs/utils': 3.5.43 core-js: 3.6.5 - dev: true - /@umijs/babel-plugin-no-anonymous-default-export/3.5.34: - resolution: - { - integrity: sha512-OkB4MgQJlP7qZXo8vOPDI9xZq+9uxfz/9LdlWrQ1A2vojgNAaQa3gh4d/D9uT/bNuvalDSgy1TT1vWgJWDQs+w==, - } + '@umijs/babel-plugin-no-anonymous-default-export@3.5.43': dependencies: - '@umijs/utils': 3.5.34 - dev: true + '@umijs/utils': 3.5.43 - /@umijs/babel-preset-umi/3.5.34: - resolution: - { - integrity: sha512-ojYPEcJLVvOJWan5VCahagpJCO3n4ud99eP0p2V3GH+onKmmj5pPPCusAUPOWj4j60iK2J06g0H+SXt2lbUX2w==, - } + '@umijs/babel-preset-umi@3.5.43': dependencies: '@babel/runtime': 7.18.6 - '@umijs/babel-plugin-auto-css-modules': 3.5.34 - '@umijs/babel-plugin-import-to-await-require': 3.5.34 - '@umijs/babel-plugin-lock-core-js-3': 3.5.34 - '@umijs/babel-plugin-no-anonymous-default-export': 3.5.34 - '@umijs/deps': 3.5.34 - '@umijs/utils': 3.5.34 - dev: true - - /@umijs/bundler-utils/3.5.34_hflg5r6ml7trnjm7sh3tgaza54: - resolution: - { - integrity: sha512-BZ/9Y5XXCP/1oC1OwsSED7xU9htboRxrMwU+gr8plLu1eVg+0h3GDsxzVq9mOw50eKwB5FGvyM1bNV6/y+eHDA==, - } - dependencies: - '@umijs/babel-preset-umi': 3.5.34 - '@umijs/types': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/utils': 3.5.34 + '@umijs/babel-plugin-auto-css-modules': 3.5.43 + '@umijs/babel-plugin-import-to-await-require': 3.5.43 + '@umijs/babel-plugin-lock-core-js-3': 3.5.43 + '@umijs/babel-plugin-no-anonymous-default-export': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/utils': 3.5.43 + + '@umijs/bundler-utils@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0)': + dependencies: + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/types': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/utils': 3.5.43 transitivePeerDependencies: - react - react-dom - react-router - dev: true - /@umijs/bundler-webpack/3.5.34_hflg5r6ml7trnjm7sh3tgaza54: - resolution: - { - integrity: sha512-BcGc5jaXGoU0PGAFEsPSeVMgd/CuNk50rczguCZpcVI+udJGYySwTr2R63PJSCH3SwnPWGWTI0+EDBqVWUo2eA==, - } - hasBin: true + '@umijs/bundler-utils@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0)': + dependencies: + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/types': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0) + '@umijs/utils': 3.5.43 + transitivePeerDependencies: + - react + - react-dom + - react-router + + '@umijs/bundler-webpack@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0)': + dependencies: + '@umijs/bundler-utils': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 + '@umijs/deps': 3.5.43 + '@umijs/types': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/utils': 3.5.43 + jest-worker: 26.6.2 + node-libs-browser: 2.2.1 + normalize-url: 1.9.1 + postcss: 7.0.32 + postcss-flexbugs-fixes: 4.2.1 + postcss-loader: 3.0.0 + postcss-preset-env: 6.7.0 + postcss-safe-parser: 4.0.2 + terser: 5.14.2 + webpack-chain: 6.5.1 + transitivePeerDependencies: + - react + - react-dom + - react-router + + '@umijs/bundler-webpack@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0)': dependencies: - '@umijs/bundler-utils': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 + '@umijs/bundler-utils': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0) '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/deps': 3.5.34 - '@umijs/types': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/utils': 3.5.34 + '@umijs/deps': 3.5.43 + '@umijs/types': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0) + '@umijs/utils': 3.5.43 jest-worker: 26.6.2 node-libs-browser: 2.2.1 normalize-url: 1.9.1 @@ -3714,38 +10422,23 @@ packages: postcss-loader: 3.0.0 postcss-preset-env: 6.7.0 postcss-safe-parser: 4.0.2 - terser: 5.6.0 + terser: 5.14.2 webpack-chain: 6.5.1 transitivePeerDependencies: - react - react-dom - react-router - dev: true - - /@umijs/case-sensitive-paths-webpack-plugin/1.0.1: - resolution: - { - integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==, - } - dev: true - - /@umijs/core/3.5.34: - resolution: - { - integrity: sha512-rnLjV83aB8G2j0V+RZAEM2YQhhVG3qixcJBYIUfG8bWPEH6d61kNMvbEnjPp2IlcIrmVMc+wc+nN5M04OSHZfw==, - } - dependencies: - '@umijs/ast': 3.5.34 - '@umijs/babel-preset-umi': 3.5.34 - '@umijs/deps': 3.5.34 - '@umijs/utils': 3.5.34 - dev: true - - /@umijs/deps/3.5.34: - resolution: - { - integrity: sha512-F67mdR5fIXk95kOFJHjAtEmy4O4lvrxLYiOPuVkTeCkPVjXJWCSo8rZ/8hiMSvKPBlQBcg/WGeXbdR98Z0OOCA==, - } + + '@umijs/case-sensitive-paths-webpack-plugin@1.0.1': {} + + '@umijs/core@3.5.43': + dependencies: + '@umijs/ast': 3.5.43 + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/utils': 3.5.43 + + '@umijs/deps@3.5.43': dependencies: '@bloomberg/record-tuple-polyfill': 0.0.3 chokidar: 3.5.1 @@ -3753,157 +10446,114 @@ packages: esbuild: 0.12.15 jest-worker: 24.9.0 prettier: 2.2.1 + regenerate: 1.4.2 regenerate-unicode-properties: 10.0.1 - dev: true - /@umijs/fabric/2.14.0: - resolution: - { - integrity: sha512-tiqKWYFwK9dgrdC8U1IjdIqeIv6W3NhROJHb07u1D72KWpGoN2U7/gVRtyMq7psBSK4EwHyXL6sFtIGUibs2ng==, - } - hasBin: true - dependencies: - '@babel/core': 7.19.3 - '@babel/eslint-parser': 7.19.1_mmbyq476xpa6tuwz6732ekfpz4 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.19.3 - '@babel/plugin-proposal-decorators': 7.19.3_@babel+core@7.19.3 - '@babel/preset-env': 7.19.4_@babel+core@7.19.3 - '@babel/preset-react': 7.18.6_@babel+core@7.19.3 - '@babel/preset-typescript': 7.18.6_@babel+core@7.19.3 - '@typescript-eslint/eslint-plugin': 5.40.0_bjgutjmzwoxcmti7ime6tsylke - '@typescript-eslint/parser': 5.40.0_3rubbgt5ekhqrcgx4uwls3neim + '@umijs/fabric@2.14.1': + dependencies: + '@babel/core': 7.28.3 + '@babel/eslint-parser': 7.28.0(@babel/core@7.28.3)(eslint@7.32.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) + '@babel/preset-env': 7.28.3(@babel/core@7.28.3) + '@babel/preset-react': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2) + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) chalk: 4.1.2 eslint: 7.32.0 - eslint-config-prettier: 8.5.0_eslint@7.32.0 + eslint-config-prettier: 8.10.2(eslint@7.32.0) eslint-formatter-pretty: 4.1.0 - eslint-plugin-babel: 5.3.1_eslint@7.32.0 - eslint-plugin-jest: 24.7.0_giwjxr77q5eummqkfvrenf2zna - eslint-plugin-promise: 6.0.1_eslint@7.32.0 - eslint-plugin-react: 7.31.10_eslint@7.32.0 - eslint-plugin-react-hooks: 4.6.0_eslint@7.32.0 - eslint-plugin-unicorn: 20.1.0_eslint@7.32.0 - fast-glob: 3.2.12 + eslint-plugin-babel: 5.3.1(eslint@7.32.0) + eslint-plugin-jest: 24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) + eslint-plugin-promise: 6.6.0(eslint@7.32.0) + eslint-plugin-react: 7.37.5(eslint@7.32.0) + eslint-plugin-react-hooks: 4.6.2(eslint@7.32.0) + eslint-plugin-unicorn: 20.1.0(eslint@7.32.0) + fast-glob: 3.3.3 os-locale: 5.0.0 - prettier: 2.7.1 - prettier-plugin-packagejson: 2.3.0_prettier@2.7.1 - prettier-plugin-two-style-order: 1.0.1_prettier@2.7.1 + prettier: 2.8.8 + prettier-plugin-packagejson: 2.3.0(prettier@2.8.8) + prettier-plugin-two-style-order: 1.0.1(prettier@2.8.8) stylelint: 13.13.1 - stylelint-config-css-modules: 2.3.0_stylelint@13.13.1 - stylelint-config-prettier: 8.0.2_stylelint@13.13.1 - stylelint-config-standard: 20.0.0_stylelint@13.13.1 - stylelint-declaration-block-no-ignored-properties: 2.5.0_stylelint@13.13.1 - typescript: 4.8.4 + stylelint-config-css-modules: 2.3.0(stylelint@13.13.1) + stylelint-config-prettier: 8.0.2(stylelint@13.13.1) + stylelint-config-standard: 20.0.0(stylelint@13.13.1) + stylelint-declaration-block-no-ignored-properties: 2.8.0(stylelint@13.13.1) + typescript: 4.9.5 transitivePeerDependencies: - postcss-jsx - postcss-markdown - supports-color - dev: true - /@umijs/plugin-analytics/0.2.3_umi@3.5.34: - resolution: - { - integrity: sha512-6Fj+EOzd2vXe1YHjK1aqhHlITWBXcnhPd6pxAEjeGu3vAxDcfp1yM3PoRr//baBXk8CYF2krWDQGYy+OlRXM4A==, - } - peerDependencies: - umi: 3.x + '@umijs/plugin-analytics@0.2.4(umi@3.5.43(react-router@6.30.1(react@19.1.1)))': dependencies: - umi: 3.5.34_react-router@5.2.0 - dev: true + umi: 3.5.43(react-router@6.30.1(react@19.1.1)) - /@umijs/plugin-sass/1.1.1_umi@3.5.34+webpack@4.46.0: - resolution: - { - integrity: sha512-z9Gyn/pasXLD/URjErBuMH41DPGd669kmeDUUDnYQMbazNAa2+hiWKsVbHhLM0In27GE/ElQZ+bk/9M9dgH88A==, - } - peerDependencies: - umi: 3.x - dependencies: - sass: 1.55.0 - sass-loader: 8.0.2_sass@1.55.0+webpack@4.46.0 - umi: 3.5.34_react-router@5.2.0 - transitivePeerDependencies: - - fibers - - node-sass - - webpack - dev: true - - /@umijs/preset-built-in/3.5.34_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-ERafHHNI0TEOFM17lB+SAWhdGcFf1aijG7jU8ksN2/7uDfV/Ytek8vnQOaceQ2a7b/VjEM5l60r3VvoXG3lW5w==, - } - peerDependencies: - react: 16.x || 17.x + '@umijs/preset-built-in@3.5.43(react-dom@16.14.0(react@16.14.0))(react@16.14.0)': dependencies: '@types/react-router-config': 5.0.2 - '@umijs/babel-preset-umi': 3.5.34 - '@umijs/bundler-webpack': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/core': 3.5.34 - '@umijs/deps': 3.5.34 - '@umijs/renderer-mpa': 3.5.34_wcqkhtmu7mswc6yz4uyexck3ty - '@umijs/renderer-react': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/runtime': 3.5.34_react@16.14.0 - '@umijs/server': 3.5.34 - '@umijs/types': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/utils': 3.5.34 - ansi-html: 0.0.7 + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/bundler-webpack': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/core': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/renderer-mpa': 3.5.43(react-dom@16.14.0(react@16.14.0))(react@16.14.0) + '@umijs/renderer-react': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/runtime': 3.5.43(react@16.14.0) + '@umijs/server': 3.5.43 + '@umijs/types': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/utils': 3.5.43 + ansi-html: 0.0.9 core-js: 3.6.5 - core-js-pure: 3.25.5 + core-js-pure: 3.45.1 error-stack-parser: 2.1.4 es-module-lexer: 0.7.1 - es5-imcompatible-versions: 0.1.77 + es5-imcompatible-versions: 0.1.90 history-with-query: 4.10.4 - html-entities: 2.3.3 - mime: 1.3.6 + html-entities: 2.6.0 + mime: 1.4.1 react: 16.14.0 react-refresh: 0.10.0 - react-router: 5.2.0_react@16.14.0 - react-router-config: 5.1.1_6flbfkch6crntn4ac2g723iqde - react-router-dom: 5.2.0_react@16.14.0 + react-router: 5.2.0(react@16.14.0) + react-router-config: 5.1.1(react-router@5.2.0(react@16.14.0))(react@16.14.0) + react-router-dom: 5.2.0(react@16.14.0) regenerator-runtime: 0.13.5 - schema-utils: 3.1.1 + schema-utils: 3.3.0 transitivePeerDependencies: - react-dom - dev: true - /@umijs/preset-dumi/1.1.48_g45atrtxzaxhyxjozk7akm3tee: - resolution: - { - integrity: sha512-FZokLi0qUBM7J+WNxfeb9/Hv5kMzwUexPveAUMyeIp+bqeN+kHWHZRrChQITqC0xBXSegqTTOeRH8+7qsUqKDA==, - } - peerDependencies: - umi: ^3.0.0 + '@umijs/preset-dumi@1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(umi@3.5.43(react-router@6.30.1(react@19.1.1)))': dependencies: - '@babel/core': 7.19.3 - '@babel/generator': 7.19.5 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.19.3 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 + '@babel/core': 7.18.6 + '@babel/generator': 7.18.6 + '@babel/plugin-transform-modules-commonjs': 7.18.6(@babel/core@7.18.6) + '@babel/traverse': 7.18.6 + '@babel/types': 7.18.6 '@mapbox/hast-util-to-jsx': 1.0.0 - '@umijs/babel-preset-umi': 3.5.34 - '@umijs/core': 3.5.34 - '@umijs/plugin-analytics': 0.2.3_umi@3.5.34 - '@umijs/runtime': 3.5.34_react@16.14.0 - '@umijs/types': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/utils': 3.5.34 + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/core': 3.5.43 + '@umijs/plugin-analytics': 0.2.4(umi@3.5.43(react-router@6.30.1(react@19.1.1))) + '@umijs/runtime': 3.5.43(react@19.1.1) + '@umijs/types': 3.5.43(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1) + '@umijs/utils': 3.5.43 codesandbox: 2.2.3 copy-text-to-clipboard: 2.2.0 - deepmerge: 4.2.2 + deepmerge: 4.3.1 dumi-assets-types: 1.0.1 - dumi-theme-default: 1.1.24_cnajwhgdn6ei6l3rayjar2g26a + dumi-theme-default: 1.1.24(@umijs/preset-dumi@1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(umi@3.5.43(react-router@6.30.1(react@19.1.1))))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) enhanced-resolve: 4.5.0 - github-slugger: 1.4.0 + github-slugger: 1.5.0 hast-util-has-property: 1.0.4 hast-util-is-element: 1.1.0 hast-util-raw: 6.1.0 hast-util-to-html: 7.1.3 hast-util-to-string: 1.0.4 hosted-git-info: 3.0.8 - ignore: 5.2.0 + ignore: 5.3.2 js-yaml: 3.14.1 lodash.throttle: 4.1.1 - lz-string: 1.4.4 - react-docgen-typescript-dumi-tmp: 1.22.1-0_typescript@4.8.4 + lz-string: 1.5.0 + react-docgen-typescript-dumi-tmp: 1.22.1-0(typescript@5.9.2) rehype-autolink-headings: 4.0.0 rehype-mathjax: 3.1.0 rehype-remove-comments: 4.0.2 @@ -3916,1458 +10566,770 @@ packages: remark-stringify: 9.0.1 sitemap: 6.4.0 slash2: 2.0.0 - terser: 5.15.1 - umi: 3.5.34_react-router@5.2.0 + terser: 5.43.1 + umi: 3.5.43(react-router@6.30.1(react@19.1.1)) unified: 8.4.2 unist-util-visit: 2.0.3 unist-util-visit-parents: 3.1.1 transitivePeerDependencies: - - bufferutil - - canvas + - bufferutil + - canvas + - react + - react-dom + - react-router + - supports-color + - typescript + - utf-8-validate + + '@umijs/renderer-mpa@3.5.43(react-dom@16.14.0(react@16.14.0))(react@16.14.0)': + dependencies: + '@types/react': 16.14.66 + '@types/react-dom': 16.9.25(@types/react@16.14.66) + '@umijs/runtime': 3.5.43(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + + '@umijs/renderer-react@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0)': + dependencies: + '@types/react': 16.14.66 + '@types/react-dom': 16.9.25(@types/react@16.14.66) + '@types/react-router-config': 5.0.11 + '@umijs/runtime': 3.5.43(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-router-config: 5.1.1(react-router@5.2.0(react@16.14.0))(react@16.14.0) + transitivePeerDependencies: + - react-router + + '@umijs/renderer-react@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0)': + dependencies: + '@types/react': 16.14.66 + '@types/react-dom': 16.9.25(@types/react@16.14.66) + '@types/react-router-config': 5.0.11 + '@umijs/runtime': 3.5.43(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-router-config: 5.1.1(react-router@6.30.1(react@19.1.1))(react@16.14.0) + transitivePeerDependencies: + - react-router + + '@umijs/renderer-react@3.5.43(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@types/react': 16.14.66 + '@types/react-dom': 16.9.25(@types/react@16.14.66) + '@types/react-router-config': 5.0.11 + '@umijs/runtime': 3.5.43(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-router-config: 5.1.1(react-router@6.30.1(react@19.1.1))(react@19.1.1) + transitivePeerDependencies: + - react-router + + '@umijs/runtime@3.5.43(react@16.14.0)': + dependencies: + '@types/react-router': 5.1.12 + '@types/react-router-dom': 5.1.7 + history-with-query: 4.10.4 + react: 16.14.0 + react-router: 5.2.0(react@16.14.0) + react-router-dom: 5.2.0(react@16.14.0) + use-subscription: 1.5.1(react@16.14.0) + + '@umijs/runtime@3.5.43(react@19.1.1)': + dependencies: + '@types/react-router': 5.1.12 + '@types/react-router-dom': 5.1.7 + history-with-query: 4.10.4 + react: 19.1.1 + react-router: 5.2.0(react@19.1.1) + react-router-dom: 5.2.0(react@19.1.1) + use-subscription: 1.5.1(react@19.1.1) + + '@umijs/server@3.5.43': + dependencies: + '@umijs/core': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/utils': 3.5.43 + + '@umijs/types@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0)': + dependencies: + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/core': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/renderer-react': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@5.2.0(react@16.14.0))(react@16.14.0) + '@umijs/server': 3.5.43 + '@umijs/utils': 3.5.43 + webpack-chain: 6.5.1 + transitivePeerDependencies: - react - react-dom - react-router - - supports-color - - typescript - - utf-8-validate - dev: true - /@umijs/renderer-mpa/3.5.34_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-pfE3vGS3bQrVSmYspnZBq03PI9lClcdFJ5avzVhKl+ReoZiKN9PlX5LzzoxHZyKYstU2APFjRsoZ2+A+y7FIIQ==, - } - peerDependencies: - react: 16.x || 17.x - react-dom: 16.x || 17.x - dependencies: - '@types/react': 16.14.32 - '@types/react-dom': 16.9.16 - '@umijs/runtime': 3.5.34_react@16.14.0 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /@umijs/renderer-react/3.5.34_hflg5r6ml7trnjm7sh3tgaza54: - resolution: - { - integrity: sha512-S407IxX/TEB7VjnAG59TYmb4D6AvZWTwbmtqyegdQd+6dhsxHpJlwh9gXeM0KvkkIGm+EvoBtPmQ8u3VIRfKgA==, - } - peerDependencies: - react: 16.x || 17.x - react-dom: 16.x || 17.x + '@umijs/types@3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0)': dependencies: - '@types/react': 16.14.32 - '@types/react-dom': 16.9.16 - '@types/react-router-config': 5.0.2 - '@umijs/runtime': 3.5.34_react@16.14.0 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-router-config: 5.1.1_6flbfkch6crntn4ac2g723iqde + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/core': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/renderer-react': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0) + '@umijs/server': 3.5.43 + '@umijs/utils': 3.5.43 + webpack-chain: 6.5.1 transitivePeerDependencies: + - react + - react-dom - react-router - dev: true - /@umijs/runtime/3.5.34_react@16.14.0: - resolution: - { - integrity: sha512-UzdEvWrtWbXYHieIQ/8EJXEHcdZsPJ31hoDXVsELLL81lBQXCgDs1AvWlRu7si+bu3ERrpW8/bD3VI2wJgkrSw==, - } - peerDependencies: - react: 16.x || 17.x + '@umijs/types@3.5.43(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)': dependencies: - '@types/react-router': 5.1.12 - '@types/react-router-dom': 5.1.7 - history-with-query: 4.10.4 - react: 16.14.0 - react-router: 5.2.0_react@16.14.0 - react-router-dom: 5.2.0_react@16.14.0 - use-subscription: 1.5.1_react@16.14.0 - dev: true - - /@umijs/server/3.5.34: - resolution: - { - integrity: sha512-r++G9CfIrZRk4bXHEiBTDIccUcmTqAXZnG02gFIcJfrodk+Fg+aeNGKiECvrLENU5vTixCWawcK+KoCU8CPF7w==, - } - dependencies: - '@umijs/core': 3.5.34 - '@umijs/deps': 3.5.34 - '@umijs/utils': 3.5.34 - dev: true - - /@umijs/types/3.5.34_hflg5r6ml7trnjm7sh3tgaza54: - resolution: - { - integrity: sha512-KAVtlZHyCzvSqUOEat5YwnrgValeaTG1TdG+W60lnfA00MR91l/NU4pYX5PDBtMTf7rQnCsxRoWuvSe/igVRuw==, - } - dependencies: - '@umijs/babel-preset-umi': 3.5.34 - '@umijs/core': 3.5.34 - '@umijs/deps': 3.5.34 - '@umijs/renderer-react': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/server': 3.5.34 - '@umijs/utils': 3.5.34 + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/core': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/renderer-react': 3.5.43(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1) + '@umijs/server': 3.5.43 + '@umijs/utils': 3.5.43 webpack-chain: 6.5.1 transitivePeerDependencies: - react - react-dom - react-router - dev: true - - /@umijs/utils/3.5.34: - resolution: - { - integrity: sha512-4qmfmCtEGqJYmSoRQ/VkFLNS61bjPb48Z9pAGvU1xnEsbK6LXu4u4nNNTD0hI0Mg/HNfss+5PlI74QKzKb8J0g==, - } - dependencies: - '@umijs/babel-preset-umi': 3.5.34 - '@umijs/deps': 3.5.34 - dev: true - - /@ungap/promise-all-settled/1.1.2: - resolution: - { - integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==, - } - dev: true - - /@uni/action-sheet/1.0.7: - resolution: - { - integrity: sha512-fW0tzwJitzfWbQ388NJCq5RAT2nNV39vUfjW/3z3ZSUu+gWg7OOIM05ttn0MOcN0WTxPu/yaYWkci5KEUnKXRA==, - } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /@uni/clipboard/1.0.9: - resolution: - { - integrity: sha512-NoqYayQCHB0KIFc2r8akf1S3UtSnBhk+Nc3fX+wFnpRx6qmHHzZSeBk+mTqKVOTfeE3OdcubQAAt/sWfWS/4mw==, - } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /@uni/env/1.1.0: - resolution: - { - integrity: sha512-2GVgUzxIaO2vGElXEuc45+I7L6Jbw8inLDDFuC0K4htjKtPmYywKSE6oDhvmdAXb4GCOH8hmxECYtAh1rjsgoQ==, - } - dev: true - - /@uni/file/1.1.1: - resolution: - { - integrity: sha512-gbymGoyD02cWHGVGapxp0zl3VAEU/u4vpDSyfS1tSnIGFjwIbCGq+W+uTAnJYduDbdy4Xiuwzbf0b/4slY9bmQ==, - } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /@uni/image/1.1.3: - resolution: - { - integrity: sha512-68RGzXMYAp8EUZ5jogdQd+KVqyVlKZwuncWmZ96aDqwHhd/J1MnAJuAOAEBL3jCNqXNsvXHLBr5yleg2gdf1yQ==, - } - dependencies: - '@uni/video': 1.0.6 - dev: true - - /@uni/navigate/1.0.10: - resolution: - { - integrity: sha512-jqcinw8RKWoErT03P/dlOqmhrF8H+iLJOQ7qh2alsDD/xBNSIdkA+eLqTchbFZzI6GsmpbEvfBg/eiEa34Gfvw==, - } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /@uni/page-scroll-to/1.0.0: - resolution: - { - integrity: sha512-fQTndD14OTezRzXAtsuhdrruO0lz0+lTXa/eSeekVqEkDq9L/OK+T9B6IJS3Ui4Xc1aEkWGSyGe0TaTOfKE9tQ==, - } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /@uni/vibrate/1.0.1: - resolution: - { - integrity: sha512-IocrIbBaZYjBHzvRIGSyN3K2He9Y7BS/VMEri2On9QITU3U2kampDiGGPyA/lQxVSZNemyK6/xtxWoxTjNh91w==, - } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /@uni/video/1.0.6: - resolution: - { - integrity: sha512-iMqKMukI9S87AVY+fwTeUiM4jo0QbTEnF+Plbrv8GtPQOyYeaM9jzPeOBMF2xmbLTQuu2faQFS6l6QDZkErpXA==, - } - dependencies: - '@uni/action-sheet': 1.0.7 - dev: true - - /@webassemblyjs/ast/1.9.0: - resolution: - { - integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==, - } - dependencies: - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 - dev: true - - /@webassemblyjs/floating-point-hex-parser/1.9.0: - resolution: - { - integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==, - } - dev: true - - /@webassemblyjs/helper-api-error/1.9.0: - resolution: - { - integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==, - } - dev: true - - /@webassemblyjs/helper-buffer/1.9.0: - resolution: - { - integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==, - } - dev: true - - /@webassemblyjs/helper-code-frame/1.9.0: - resolution: - { - integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==, - } - dependencies: - '@webassemblyjs/wast-printer': 1.9.0 - dev: true - - /@webassemblyjs/helper-fsm/1.9.0: - resolution: - { - integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==, - } - dev: true - - /@webassemblyjs/helper-module-context/1.9.0: - resolution: - { - integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - dev: true - - /@webassemblyjs/helper-wasm-bytecode/1.9.0: - resolution: - { - integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==, - } - dev: true - - /@webassemblyjs/helper-wasm-section/1.9.0: - resolution: - { - integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - dev: true - - /@webassemblyjs/ieee754/1.9.0: - resolution: - { - integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==, - } + + '@umijs/utils@3.5.43': dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true + '@umijs/babel-preset-umi': 3.5.43 + '@umijs/deps': 3.5.43 + + '@uni/action-sheet@1.0.8': + dependencies: + '@uni/env': 1.1.1 + + '@uni/clipboard@1.0.9': + dependencies: + '@uni/env': 1.1.1 + + '@uni/env@1.1.1': {} + + '@uni/file@1.1.1': + dependencies: + '@uni/env': 1.1.1 + + '@uni/image@1.1.3': + dependencies: + '@uni/video': 1.0.8 + + '@uni/navigate@1.0.11': + dependencies: + '@uni/env': 1.1.1 + + '@uni/page-scroll-to@1.0.0': + dependencies: + '@uni/env': 1.1.1 + + '@uni/vibrate@1.0.1': + dependencies: + '@uni/env': 1.1.1 + + '@uni/video@1.0.8': + dependencies: + '@uni/action-sheet': 1.0.8 + + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1))': + dependencies: + '@istanbuljs/schema': 0.1.3 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magicast: 0.3.5 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@20.5.1)(terser@5.43.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.18 + optionalDependencies: + vite: 7.1.3(@types/node@20.5.1)(terser@5.43.1) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.18 + pathe: 2.0.3 - /@webassemblyjs/leb128/1.9.0: - resolution: - { - integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==, - } + '@vitest/spy@3.2.4': dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8/1.9.0: - resolution: - { - integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==, - } - dev: true - - /@webassemblyjs/wasm-edit/1.9.0: - resolution: - { - integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/helper-wasm-section': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - '@webassemblyjs/wasm-opt': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - '@webassemblyjs/wast-printer': 1.9.0 - dev: true - - /@webassemblyjs/wasm-gen/1.9.0: - resolution: - { - integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/ieee754': 1.9.0 - '@webassemblyjs/leb128': 1.9.0 - '@webassemblyjs/utf8': 1.9.0 - dev: true - - /@webassemblyjs/wasm-opt/1.9.0: - resolution: - { - integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - dev: true - - /@webassemblyjs/wasm-parser/1.9.0: - resolution: - { - integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-api-error': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/ieee754': 1.9.0 - '@webassemblyjs/leb128': 1.9.0 - '@webassemblyjs/utf8': 1.9.0 - dev: true - - /@webassemblyjs/wast-parser/1.9.0: - resolution: - { - integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==, - } - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/floating-point-hex-parser': 1.9.0 - '@webassemblyjs/helper-api-error': 1.9.0 - '@webassemblyjs/helper-code-frame': 1.9.0 - '@webassemblyjs/helper-fsm': 1.9.0 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/wast-printer/1.9.0: - resolution: - { - integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==, - } + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - dev: true - - /@xobotyi/scrollbar-width/1.9.5: - resolution: - { - integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==, - } - dev: true - - /@xtuc/ieee754/1.2.0: - resolution: - { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, - } - dev: true - - /@xtuc/long/4.2.2: - resolution: - { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, - } - dev: true - - /JSONStream/1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } - hasBin: true + + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': + dependencies: + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.101.3) + + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': + dependencies: + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.101.3) + + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': + dependencies: + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.101.3) + + '@xmldom/xmldom@0.9.8': {} + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abab/2.0.6: - resolution: - { - integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, - } - dev: true + abab@2.0.6: {} - /acorn-globals/6.0.0: - resolution: - { - integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==, - } + acorn-globals@6.0.0: dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 - dev: true - /acorn-jsx/5.3.2_acorn@7.4.1: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 - dev: true - - /acorn-walk/7.2.0: - resolution: - { - integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, - } - engines: { node: '>=0.4.0' } - dev: true - - /acorn-walk/8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: '>=0.4.0' } - dev: true - - /acorn/6.4.2: - resolution: - { - integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==, - } - engines: { node: '>=0.4.0' } - hasBin: true - dev: true - - /acorn/7.4.1: - resolution: - { - integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, - } - engines: { node: '>=0.4.0' } - hasBin: true - dev: true - - /acorn/8.8.0: - resolution: - { - integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==, - } - engines: { node: '>=0.4.0' } - hasBin: true - dev: true - /agent-base/4.3.0: - resolution: - { - integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==, - } - engines: { node: '>= 4.0.0' } + acorn-walk@7.2.0: {} + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@7.4.1: {} + + acorn@8.15.0: {} + + agent-base@4.3.0: dependencies: es6-promisify: 5.0.0 - dev: true - /agent-base/6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: '>= 6.0.0' } + agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color - dev: true - /agentkeepalive/3.5.2: - resolution: - { - integrity: sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==, - } - engines: { node: '>= 4.0.0' } + agent-base@7.1.4: {} + + agentkeepalive@3.5.3: dependencies: humanize-ms: 1.2.1 - dev: true - /aggregate-error/3.1.0: - resolution: - { - integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, - } - engines: { node: '>=8' } + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - - /ahooks-v3-count/1.0.0: - resolution: - { - integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==, - } - dev: false - - /airbnb-prop-types/2.16.0_react@16.14.0: - resolution: - { - integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==, - } - peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0-alpha - dependencies: - array.prototype.find: 2.2.0 - function.prototype.name: 1.1.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object.assign: 4.1.4 - object.entries: 1.1.5 - prop-types: 15.8.1 - prop-types-exact: 1.2.0 - react: 16.14.0 - react-is: 16.13.1 - dev: true - /ajv-errors/1.0.1_ajv@6.12.6: - resolution: - { - integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==, - } - peerDependencies: - ajv: '>=5.0.0' + ahooks@3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + dayjs: 1.11.13 + intersection-observer: 0.12.2 + js-cookie: 3.0.5 + lodash: 4.17.21 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-fast-compare: 3.2.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.8.1 + + ajv-errors@1.0.1(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv-keywords/3.5.2_ajv@6.12.6: - resolution: - { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, - } - peerDependencies: - ajv: ^6.9.1 + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv/6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: 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.11.0: - resolution: - { - integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==, - } + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - /ansi-align/2.0.0: - resolution: - { - integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==, - } + ansi-align@2.0.0: dependencies: string-width: 2.1.1 - dev: true - /ansi-colors/1.1.0: - resolution: - { - integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==, - } - engines: { node: '>=0.10.0' } + ansi-colors@1.1.0: dependencies: ansi-wrap: 0.1.0 - dev: true - - /ansi-colors/4.1.1: - resolution: - { - integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, - } - engines: { node: '>=6' } - dev: true - - /ansi-colors/4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: '>=6' } - dev: true - - /ansi-escapes/3.2.0: - resolution: - { - integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==, - } - engines: { node: '>=4' } - dev: true - - /ansi-escapes/4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: '>=8' } + + ansi-colors@4.1.3: {} + + ansi-escapes@3.2.0: {} + + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-gray/0.1.1: - resolution: - { - integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==, - } - engines: { node: '>=0.10.0' } + ansi-gray@0.1.1: dependencies: ansi-wrap: 0.1.0 - dev: true - - /ansi-html/0.0.7: - resolution: - { - integrity: sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==, - } - engines: { '0': node >= 0.8.0 } - hasBin: true - dev: true - - /ansi-regex/2.1.1: - resolution: - { - integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /ansi-regex/3.0.1: - resolution: - { - integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, - } - engines: { node: '>=4' } - dev: true - - /ansi-regex/4.1.1: - resolution: - { - integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==, - } - engines: { node: '>=6' } - dev: true - - /ansi-regex/5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } - dev: true - - /ansi-styles/3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: '>=4' } + + ansi-html@0.0.9: {} + + ansi-regex@2.1.1: {} + + ansi-regex@3.0.1: {} + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.0: {} + + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles/4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - - /ansi-styles/5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: '>=10' } - dev: true - - /ansi-wrap/0.1.0: - resolution: - { - integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /antd/4.23.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-AMea5NYoMeGvRxZ/rslGvRqaiuzBgQMpOdlQfNjOfMd+0ZGi+E4AiwXilR99muFOttPcr3ebeIsKiUS5p/cnig==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@ant-design/colors': 6.0.0 - '@ant-design/icons': 4.7.0_wcqkhtmu7mswc6yz4uyexck3ty - '@ant-design/react-slick': 0.29.2_react@16.14.0 - '@babel/runtime': 7.19.4 - '@ctrl/tinycolor': 3.4.1 - classnames: 2.3.2 - copy-to-clipboard: 3.3.2 - lodash: 4.17.21 - memoize-one: 6.0.0 - moment: 2.29.4 - rc-cascader: 3.7.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-checkbox: 2.3.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-collapse: 3.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-dialog: 8.9.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-drawer: 5.1.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-dropdown: 4.0.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-field-form: 1.27.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-image: 5.7.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-input: 0.1.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-input-number: 7.3.9_wcqkhtmu7mswc6yz4uyexck3ty - rc-mentions: 1.10.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-menu: 9.6.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-notification: 4.6.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-pagination: 3.1.17_wcqkhtmu7mswc6yz4uyexck3ty - rc-picker: 2.6.10_wcqkhtmu7mswc6yz4uyexck3ty - rc-progress: 3.3.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-rate: 2.9.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-segmented: 2.1.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-select: 14.1.13_wcqkhtmu7mswc6yz4uyexck3ty - rc-slider: 10.0.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-steps: 4.1.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-switch: 3.2.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-table: 7.26.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-tabs: 12.1.0-alpha.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-textarea: 0.4.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-tooltip: 5.2.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree: 5.7.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree-select: 5.5.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-upload: 4.3.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - scroll-into-view-if-needed: 2.2.29 - dev: true - /anymatch/2.0.0: - resolution: - { - integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==, - } + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + ansi-wrap@0.1.0: {} + + antd@5.27.1(moment@2.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@ant-design/colors': 7.2.1 + '@ant-design/cssinjs': 1.24.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@ant-design/cssinjs-utils': 1.1.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@ant-design/fast-color': 2.0.6 + '@ant-design/icons': 5.6.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@ant-design/react-slick': 1.1.2(react@19.1.1) + '@babel/runtime': 7.28.3 + '@rc-component/color-picker': 2.0.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@rc-component/qrcode': 1.0.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@rc-component/tour': 1.15.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + copy-to-clipboard: 3.3.3 + dayjs: 1.11.13 + rc-cascader: 3.34.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-checkbox: 3.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-collapse: 3.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-dialog: 9.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-drawer: 7.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-dropdown: 4.2.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-field-form: 2.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-image: 7.12.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-input: 1.8.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-input-number: 9.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-mentions: 2.20.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-menu: 9.16.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-notification: 5.6.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-pagination: 5.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-picker: 4.11.3(dayjs@1.11.13)(moment@2.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-progress: 4.0.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-rate: 2.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-segmented: 2.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-select: 14.16.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-slider: 11.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-steps: 6.0.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-switch: 4.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-table: 7.51.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tabs: 15.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-textarea: 1.10.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tooltip: 6.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tree: 5.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tree-select: 5.27.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-upload: 4.9.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.2 + transitivePeerDependencies: + - date-fns + - luxon + - moment + + anymatch@2.0.0: dependencies: micromatch: 3.1.10 normalize-path: 2.1.1 transitivePeerDependencies: - supports-color - dev: true - /anymatch/3.1.2: - resolution: - { - integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==, - } - engines: { node: '>= 8' } + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - - /append-buffer/1.0.2: - resolution: - { - integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==, - } - engines: { node: '>=0.10.0' } - dependencies: - buffer-equal: 1.0.0 - dev: true - - /aproba/1.2.0: - resolution: - { - integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==, - } - dev: true - - /arch/2.2.0: - resolution: - { - integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, - } - dev: true - - /archy/1.0.0: - resolution: - { - integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==, - } - dev: true - - /arg/4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } - dev: true - - /arg/5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } - dev: true - - /argparse/1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + + append-buffer@1.0.2: + dependencies: + buffer-equal: 1.0.1 + + aproba@1.2.0: {} + + arch@2.2.0: {} + + archy@1.0.0: {} + + arg@4.1.3: {} + + arg@5.0.2: {} + + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - - /argparse/2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - dev: true - - /aria-query/4.2.2: - resolution: - { - integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==, - } - engines: { node: '>=6.0' } - dependencies: - '@babel/runtime': 7.19.4 - '@babel/runtime-corejs3': 7.19.4 - dev: true - - /arr-diff/4.0.0: - resolution: - { - integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /arr-filter/1.1.2: - resolution: - { - integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==, - } - engines: { node: '>=0.10.0' } + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + arr-diff@4.0.0: {} + + arr-filter@1.1.2: dependencies: make-iterator: 1.0.1 - dev: true - - /arr-flatten/1.1.0: - resolution: - { - integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /arr-map/2.0.2: - resolution: - { - integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==, - } - engines: { node: '>=0.10.0' } + + arr-flatten@1.1.0: {} + + arr-map@2.0.2: dependencies: make-iterator: 1.0.1 - dev: true - - /arr-union/3.1.0: - resolution: - { - integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /array-differ/3.0.0: - resolution: - { - integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, - } - engines: { node: '>=8' } - dev: true - - /array-each/1.0.1: - resolution: - { - integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /array-ify/1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } - dev: true - - /array-includes/3.1.5: - resolution: - { - integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 - is-string: 1.0.7 - dev: true - - /array-initial/1.1.0: - resolution: - { - integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==, - } - engines: { node: '>=0.10.0' } + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-each@1.0.1: {} + + array-ify@1.0.0: {} + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-initial@1.1.0: dependencies: array-slice: 1.1.0 is-number: 4.0.0 - dev: true - /array-last/1.3.0: - resolution: - { - integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==, - } - engines: { node: '>=0.10.0' } + array-last@1.3.0: dependencies: is-number: 4.0.0 - dev: true - - /array-slice/1.1.0: - resolution: - { - integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==, - } - engines: { node: '>=0.10.0' } - dev: true - - /array-sort/1.0.0: - resolution: - { - integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==, - } - engines: { node: '>=0.10.0' } + + array-slice@1.1.0: {} + + array-sort@1.0.0: dependencies: default-compare: 1.0.0 get-value: 2.0.6 kind-of: 5.1.0 - dev: true - - /array-tree-filter/2.1.0: - resolution: - { - integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==, - } - dev: true - - /array-union/2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: '>=8' } - dev: true - - /array-unique/0.3.2: - resolution: - { - integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /array.prototype.filter/1.0.1: - resolution: - { - integrity: sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - - /array.prototype.find/2.2.0: - resolution: - { - integrity: sha512-sn40qmUiLYAcRb/1HsIQjTTZ1kCy8II8VtZJpMn2Aoen9twULhbWXisfh3HimGqMlHGUul0/TfKCnXg42LuPpQ==, - } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.flat/1.3.0: - resolution: - { - integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.flatmap/1.3.0: - resolution: - { - integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - es-shim-unscopables: 1.0.0 - dev: true - - /arrify/1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /arrify/2.0.1: - resolution: - { - integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, - } - engines: { node: '>=8' } - dev: true - - /asn1.js/5.4.1: - resolution: - { - integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==, - } - dependencies: - bn.js: 4.12.0 + + array-union@2.1.0: {} + + array-unique@0.3.2: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + arrify@1.0.1: {} + + asap@2.0.6: {} + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.2 inherits: 2.0.4 minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - dev: true - /asn1/0.2.6: - resolution: - { - integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==, - } + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 - dev: true - - /assert-plus/1.0.0: - resolution: - { - integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==, - } - engines: { node: '>=0.8' } - dev: true - - /assert/1.5.0: - resolution: - { - integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==, - } + + assert-plus@1.0.0: {} + + assert@1.5.1: dependencies: - object-assign: 4.1.1 - util: 0.10.3 - dev: true - - /assign-symbols/1.0.0: - resolution: - { - integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /astral-regex/2.0.0: - resolution: - { - integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, - } - engines: { node: '>=8' } - dev: true - - /async-done/1.3.2: - resolution: - { - integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==, - } - engines: { node: '>= 0.10' } - dependencies: - end-of-stream: 1.4.4 + object.assign: 4.1.7 + util: 0.10.4 + + assertion-error@2.0.1: {} + + assign-symbols@1.0.0: {} + + astral-regex@2.0.0: {} + + async-done@1.3.2: + dependencies: + end-of-stream: 1.4.5 once: 1.4.0 process-nextick-args: 2.0.1 stream-exhaust: 1.0.2 - dev: true - - /async-each/1.0.3: - resolution: - { - integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==, - } - dev: true - - /async-settle/1.0.0: - resolution: - { - integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==, - } - engines: { node: '>= 0.10' } + + async-each@1.0.6: {} + + async-function@1.0.0: {} + + async-settle@1.0.0: dependencies: async-done: 1.3.2 - dev: true - - /async-validator/4.2.5: - resolution: - { - integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==, - } - dev: true - - /asynckit/0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: true - - /atob/2.1.2: - resolution: - { - integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, - } - engines: { node: '>= 4.5.0' } - hasBin: true - dev: true - /autoprefixer/9.8.8: - resolution: - { - integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==, - } - hasBin: true + asynckit@0.4.0: {} + + atob@2.1.2: {} + + autoprefixer@9.8.8: dependencies: - browserslist: 4.21.4 - caniuse-lite: 1.0.30001418 + browserslist: 4.25.3 + caniuse-lite: 1.0.30001737 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 postcss: 7.0.39 postcss-value-parser: 4.2.0 - dev: true - - /aws-sign2/0.7.0: - resolution: - { - integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==, - } - dev: true - - /aws4/1.11.0: - resolution: - { - integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==, - } - dev: true - - /axios/0.18.1: - resolution: - { - integrity: sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==, - } - deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + axios@0.18.1: dependencies: follow-redirects: 1.5.10 is-buffer: 2.0.5 transitivePeerDependencies: - supports-color - dev: true - - /babel-jest/27.5.1_@babel+core@7.19.3: - resolution: - { - integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.19.3 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.1.19 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.19.3 - chalk: 4.1.2 - graceful-fs: 4.2.10 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-loader/8.2.5_jeg5564y5etyvi3ajplf6yhqg4: - resolution: - { - integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==, - } - engines: { node: '>= 8.9' } - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.19.3 - find-cache-dir: 3.3.2 - loader-utils: 2.0.2 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 4.46.0_webpack-cli@3.3.12 - dev: true - - /babel-plugin-dynamic-import-node/2.3.3: - resolution: - { - integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==, - } - dependencies: - object.assign: 4.1.4 - dev: true - - /babel-plugin-import/1.13.5: - resolution: - { - integrity: sha512-IkqnoV+ov1hdJVofly9pXRJmeDm9EtROfrc5i6eII0Hix2xMs5FEm8FG3ExMvazbnZBbgHIt6qdO8And6lCloQ==, - } - dependencies: - '@babel/helper-module-imports': 7.18.6 - 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.19.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/27.5.1: - resolution: - { - integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.4 - '@types/babel__core': 7.1.19 - '@types/babel__traverse': 7.18.2 - dev: true - - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.19.3: - resolution: - { - integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 + + babel-plugin-dynamic-import-node@2.3.3: + dependencies: + object.assign: 4.1.7 + + babel-plugin-import@1.13.8: dependencies: - '@babel/compat-data': 7.19.4 - '@babel/core': 7.19.3 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.19.3 - semver: 6.3.0 + '@babel/helper-module-imports': 7.27.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.3): dependencies: - '@babel/core': 7.19.3 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.19.3 - core-js-compat: 3.25.5 + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.19.3: - resolution: - { - integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==, - } - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.3): dependencies: - '@babel/core': 7.19.3 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.19.3 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 transitivePeerDependencies: - supports-color - dev: true - - /babel-plugin-transform-async-to-promises/0.8.18: - resolution: - { - integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==, - } - dev: true - - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.19.3: - resolution: - { - integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, - } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.19.3 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.19.3 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.3 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.19.3 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.19.3 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.19.3 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.19.3 - dev: true - - /babel-preset-jest/27.5.1_@babel+core@7.19.3: - resolution: - { - integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3 - dev: true - /babel-runtime-jsx-style-transform/1.0.2: - resolution: - { - integrity: sha512-lzOjpj2fAP7MK99WGlFvxOc596rzPzhxf5qCYI/qYPFJgOj6wMzBbJNrKFNtTRbWFi5En5d/WZU83N5c7zOhkQ==, - } + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.3): dependencies: - mocha: 8.4.0 - dev: true + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - /babel-runtime/6.26.0: - resolution: - { - integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==, - } + babel-runtime@6.26.0: dependencies: core-js: 2.6.12 regenerator-runtime: 0.11.1 - dev: true - /bach/1.2.0: - resolution: - { - integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==, - } - engines: { node: '>= 0.10' } + bach@1.2.0: dependencies: arr-filter: 1.1.2 arr-flatten: 1.1.0 @@ -5378,163 +11340,62 @@ packages: async-done: 1.3.2 async-settle: 1.0.0 now-and-later: 2.0.1 - dev: true - - /bail/1.0.5: - resolution: - { - integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==, - } - dev: true - - /balanced-match/1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - dev: true - - /balanced-match/2.0.0: - resolution: - { - integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, - } - dev: true - - /base/0.11.2: - resolution: - { - integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==, - } - engines: { node: '>=0.10.0' } + + bail@1.0.5: {} + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + base16@1.0.0: {} + + base64-js@1.5.1: {} + + base@0.11.2: dependencies: cache-base: 1.0.1 class-utils: 0.3.6 - component-emitter: 1.3.0 + component-emitter: 1.3.1 define-property: 1.0.0 isobject: 3.0.1 mixin-deep: 1.3.2 pascalcase: 0.1.1 - dev: true - - /base64-js/1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - dev: true - /bcrypt-pbkdf/1.0.2: - resolution: - { - integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==, - } + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 - dev: true - - /big.js/5.2.2: - resolution: - { - integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, - } - dev: true - - /big.js/6.2.1: - resolution: - { - integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==, - } - dev: true - - /binary-extensions/1.13.1: - resolution: - { - integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /binary-extensions/2.2.0: - resolution: - { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, - } - engines: { node: '>=8' } - dev: true - - /binaryextensions/2.3.0: - resolution: - { - integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==, - } - engines: { node: '>=0.8' } - dev: true - - /bindings/1.5.0: - resolution: - { - integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, - } + + big.js@5.2.2: {} + + big.js@6.2.2: {} + + binary-extensions@1.13.1: {} + + binary-extensions@2.3.0: {} + + binaryextensions@2.3.0: {} + + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - dev: true optional: true - /bl/1.2.3: - resolution: - { - integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==, - } + bl@1.2.3: dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 safe-buffer: 5.2.1 - dev: true - /block-stream/0.0.9: - resolution: - { - integrity: sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==, - } - engines: { node: 0.4 || >=0.5.8 } + block-stream@0.0.9: dependencies: inherits: 2.0.4 - dev: true - - /bluebird/3.7.2: - resolution: - { - integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, - } - dev: true - - /bn.js/4.12.0: - resolution: - { - integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==, - } - dev: true - - /bn.js/5.2.1: - resolution: - { - integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, - } - dev: true - - /boolbase/1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } - dev: true - - /boxen/1.3.0: - resolution: - { - integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==, - } - engines: { node: '>=4' } + + bluebird@3.7.2: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + + boxen@1.3.0: dependencies: ansi-align: 2.0.0 camelcase: 4.1.0 @@ -5543,24 +11404,17 @@ packages: string-width: 2.1.1 term-size: 1.2.0 widest-line: 2.0.1 - dev: true - /brace-expansion/1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /braces/2.3.2: - resolution: - { - integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, - } - engines: { node: '>=0.10.0' } + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: dependencies: arr-flatten: 1.1.0 array-unique: 0.3.2 @@ -5574,311 +11428,130 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: true - /braces/2.3.2_supports-color@6.1.0: - resolution: - { - integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, - } - engines: { node: '>=0.10.0' } + braces@3.0.3: dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2_supports-color@6.1.0 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /braces/3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: '>=8' } - dependencies: - fill-range: 7.0.1 - dev: true - - /brorand/1.1.0: - resolution: - { - integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, - } - dev: true - - /browser-process-hrtime/1.0.0: - resolution: - { - integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==, - } - dev: true - - /browser-stdout/1.3.1: - resolution: - { - integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, - } - dev: true - - /browserify-aes/1.2.0: - resolution: - { - integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, - } + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-process-hrtime@1.0.0: {} + + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 - cipher-base: 1.0.4 + cipher-base: 1.0.6 create-hash: 1.2.0 evp_bytestokey: 1.0.3 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /browserify-cipher/1.0.1: - resolution: - { - integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, - } + browserify-cipher@1.0.1: dependencies: browserify-aes: 1.2.0 browserify-des: 1.0.2 evp_bytestokey: 1.0.3 - dev: true - /browserify-des/1.0.2: - resolution: - { - integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, - } + browserify-des@1.0.2: dependencies: - cipher-base: 1.0.4 - des.js: 1.0.1 + cipher-base: 1.0.6 + des.js: 1.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /browserify-rsa/4.1.0: - resolution: - { - integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==, - } + browserify-rsa@4.1.1: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 randombytes: 2.1.0 - dev: true + safe-buffer: 5.2.1 - /browserify-sign/4.2.1: - resolution: - { - integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==, - } + browserify-sign@4.2.3: dependencies: - bn.js: 5.2.1 - browserify-rsa: 4.1.0 + bn.js: 5.2.2 + browserify-rsa: 4.1.1 create-hash: 1.2.0 create-hmac: 1.1.7 - elliptic: 6.5.4 + elliptic: 6.6.1 + hash-base: 3.0.5 inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.0 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 safe-buffer: 5.2.1 - dev: true - /browserify-zlib/0.2.0: - resolution: - { - integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==, - } + browserify-zlib@0.2.0: dependencies: pako: 1.0.11 - dev: true - - /browserslist/4.21.4: - resolution: - { - integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001418 - electron-to-chromium: 1.4.276 - node-releases: 2.0.6 - update-browserslist-db: 1.0.10_browserslist@4.21.4 - dev: true - /bs-logger/0.2.6: - resolution: - { - integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, - } - engines: { node: '>= 6' } + browserslist@4.25.3: 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-alloc-unsafe/1.1.0: - resolution: - { - integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==, - } - dev: true - - /buffer-alloc/1.2.0: - resolution: - { - integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==, - } + caniuse-lite: 1.0.30001737 + electron-to-chromium: 1.5.208 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.3) + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 - dev: true - - /buffer-equal/1.0.0: - resolution: - { - integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==, - } - engines: { node: '>=0.4.0' } - dev: true - - /buffer-fill/1.0.0: - resolution: - { - integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==, - } - dev: true - - /buffer-from/1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer-xor/1.0.3: - resolution: - { - integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, - } - dev: true - - /buffer/4.9.2: - resolution: - { - integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, - } + + buffer-equal@1.0.1: {} + + buffer-fill@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@4.9.2: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 isarray: 1.0.0 - dev: true - - /builtin-status-codes/3.0.0: - resolution: - { - integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==, - } - dev: true - - /builtins/1.0.3: - resolution: - { - integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, - } - dev: true - - /cacache/10.0.4: - resolution: - { - integrity: sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==, - } + + builtin-status-codes@3.0.0: {} + + builtins@1.0.3: {} + + cac@6.7.14: {} + + cacache@10.0.4: dependencies: bluebird: 3.7.2 chownr: 1.1.4 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 lru-cache: 4.1.5 mississippi: 2.0.0 mkdirp: 0.5.6 move-concurrently: 1.0.1 - promise-inflight: 1.0.1_bluebird@3.7.2 + promise-inflight: 1.0.1(bluebird@3.7.2) rimraf: 2.7.1 ssri: 5.3.0 unique-filename: 1.1.1 y18n: 4.0.3 - dev: true - - /cacache/12.0.4: - resolution: - { - integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==, - } - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - figgy-pudding: 3.5.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - infer-owner: 1.0.4 - lru-cache: 5.1.1 - mississippi: 3.0.0 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1_bluebird@3.7.2 - rimraf: 2.7.1 - ssri: 6.0.2 - unique-filename: 1.1.1 - y18n: 4.0.3 - dev: true - /cacache/9.3.0: - resolution: - { - integrity: sha512-Vbi8J1XfC8v+FbQ6QkOtKXsHpPnB0i9uMeYFJoj40EbdOsEqWB3DPpNjfsnYBkqOPYA8UvrqH6FZPpBP0zdN7g==, - } + cacache@9.3.0: dependencies: bluebird: 3.7.2 chownr: 1.1.4 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 lru-cache: 4.1.5 mississippi: 1.3.1 mkdirp: 0.5.6 move-concurrently: 1.0.1 - promise-inflight: 1.0.1_bluebird@3.7.2 + promise-inflight: 1.0.1(bluebird@3.7.2) rimraf: 2.7.1 ssri: 4.1.6 unique-filename: 1.1.1 y18n: 3.2.2 - dev: true - /cache-base/1.0.1: - resolution: - { - integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==, - } - engines: { node: '>=0.10.0' } + cache-base@1.0.1: dependencies: collection-visit: 1.0.0 - component-emitter: 1.3.0 + component-emitter: 1.3.1 get-value: 2.0.6 has-value: 1.0.0 isobject: 3.0.1 @@ -5886,251 +11559,93 @@ packages: to-object-path: 0.3.0 union-value: 1.0.1 unset-value: 1.0.0 - dev: true - /call-bind/1.0.2: - resolution: - { - integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, - } + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.1.3 - dev: true + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - /caller-callsite/2.0.0: - resolution: - { - integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==, - } - engines: { node: '>=4' } + caller-callsite@2.0.0: dependencies: callsites: 2.0.0 - dev: true - /caller-path/2.0.0: - resolution: - { - integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==, - } - engines: { node: '>=4' } + caller-path@2.0.0: dependencies: caller-callsite: 2.0.0 - dev: true - - /callsites/2.0.0: - resolution: - { - integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==, - } - engines: { node: '>=4' } - dev: true - - /callsites/3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } - dev: true - - /camelcase-css/2.0.1: - resolution: - { - integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, - } - engines: { node: '>= 6' } - dev: true - - /camelcase-keys/6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: '>=8' } + + callsites@2.0.0: {} + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - - /camelcase/3.0.0: - resolution: - { - integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /camelcase/4.1.0: - resolution: - { - integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==, - } - engines: { node: '>=4' } - 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.30001418: - resolution: - { - integrity: sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==, - } - dev: true - - /capture-stack-trace/1.0.2: - resolution: - { - integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==, - } - engines: { node: '>=0.10.0' } - dev: true - - /caseless/0.12.0: - resolution: - { - integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==, - } - dev: true - - /ccount/1.1.0: - resolution: - { - integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==, - } - dev: true - - /chalk/2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: '>=4' } + + camelcase@3.0.0: {} + + camelcase@4.1.0: {} + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001737: {} + + capture-stack-trace@1.0.2: {} + + caseless@0.12.0: {} + + ccount@1.1.0: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk/3.0.0: - resolution: - { - integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, - } - engines: { node: '>=8' } + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /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 - dev: true - - /char-regex/1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: '>=10' } - dev: true - - /character-entities-html4/1.1.4: - resolution: - { - integrity: sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==, - } - 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 - - /chardet/0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - } - dev: true - - /cheerio-select/2.1.0: - resolution: - { - integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==, - } - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.0.1 - dev: true - - /cheerio/1.0.0-rc.12: - resolution: - { - integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==, - } - engines: { node: '>= 6' } - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.0.1 - htmlparser2: 8.0.1 - parse5: 7.1.1 - parse5-htmlparser2-tree-adapter: 7.0.0 - dev: true - - /chokidar/2.1.8: - resolution: - { - integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==, - } - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + character-entities-html4@1.1.4: {} + + character-entities-legacy@1.1.4: {} + + character-entities@1.2.4: {} + + character-reference-invalid@1.1.4: {} + + chardet@0.7.0: {} + + check-error@2.1.1: {} + + chokidar@2.1.8: dependencies: anymatch: 2.0.0 - async-each: 1.0.3 + async-each: 1.0.6 braces: 2.3.2 glob-parent: 3.1.0 inherits: 2.0.4 @@ -6144,341 +11659,130 @@ packages: fsevents: 1.2.13 transitivePeerDependencies: - supports-color - dev: true - /chokidar/3.5.1: - resolution: - { - integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==, - } - engines: { node: '>= 8.10.0' } + chokidar@3.5.1: dependencies: - anymatch: 3.1.2 - braces: 3.0.2 + anymatch: 3.1.3 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 normalize-path: 3.0.0 readdirp: 3.5.0 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chokidar/3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: '>= 8.10.0' } - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 + fsevents: 2.3.3 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr/1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: true - - /chrome-trace-event/1.0.3: - resolution: - { - integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, - } - engines: { node: '>=6.0' } - dev: true - - /ci-info/1.6.0: - resolution: - { - integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==, - } - dev: true - - /ci-info/2.0.0: - resolution: - { - integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, - } - dev: true - - /ci-info/3.5.0: - resolution: - { - integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==, - } - dev: true - - /cipher-base/1.0.4: - resolution: - { - integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, - } + fsevents: 2.3.3 + optional: true + + chownr@1.1.4: {} + + chrome-trace-event@1.0.4: {} + + ci-info@1.6.0: {} + + ci-info@2.0.0: {} + + cipher-base@1.0.6: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - - /cjs-module-lexer/1.2.2: - resolution: - { - integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, - } - dev: true - - /class-utils/0.3.6: - resolution: - { - integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==, - } - engines: { node: '>=0.10.0' } + + class-utils@0.3.6: dependencies: arr-union: 3.1.0 define-property: 0.2.5 isobject: 3.0.1 static-extend: 0.1.2 - dev: true - - /classnames/2.2.6: - resolution: - { - integrity: sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==, - } - dev: true - - /classnames/2.3.2: - resolution: - { - integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==, - } - dev: true - - /clean-regexp/1.0.0: - resolution: - { - integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==, - } - engines: { node: '>=4' } + + classnames@2.2.6: {} + + classnames@2.5.1: {} + + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - - /clean-stack/2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: '>=6' } - dev: true - - /cli-boxes/1.0.0: - resolution: - { - integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /cli-cursor/2.1.0: - resolution: - { - integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, - } - engines: { node: '>=4' } + + clean-stack@2.2.0: {} + + cli-boxes@1.0.0: {} + + cli-cursor@2.1.0: dependencies: restore-cursor: 2.0.0 - dev: true - - /cli-spinners/1.3.1: - resolution: - { - integrity: sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==, - } - engines: { node: '>=4' } - dev: true - - /cli-table3/0.5.1: - resolution: - { - integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==, - } - engines: { node: '>=6' } + + cli-spinners@1.3.1: {} + + cli-table3@0.5.1: dependencies: object-assign: 4.1.1 string-width: 2.1.1 optionalDependencies: colors: 1.4.0 - dev: true - - /cli-width/2.2.1: - resolution: - { - integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==, - } - dev: true - - /clipboardy/2.3.0: - resolution: - { - integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==, - } - engines: { node: '>=8' } + + cli-width@2.2.1: {} + + clipboardy@2.3.0: dependencies: arch: 2.2.0 execa: 1.0.0 is-wsl: 2.2.0 - dev: true - /cliui/3.2.0: - resolution: - { - integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==, - } + cliui@3.2.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 wrap-ansi: 2.1.0 - dev: true - - /cliui/5.0.0: - resolution: - { - integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==, - } - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - dev: true - /cliui/7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - 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-buffer/1.0.0: - resolution: - { - integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==, - } - engines: { node: '>= 0.10' } - dev: true - - /clone-deep/4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: '>=6' } + clone-buffer@1.0.0: {} + + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - /clone-regexp/2.2.0: - resolution: - { - integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==, - } - engines: { node: '>=6' } + clone-regexp@2.2.0: dependencies: is-regexp: 2.1.0 - dev: true - - /clone-stats/1.0.0: - resolution: - { - integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==, - } - dev: true - - /clone/2.1.2: - resolution: - { - integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, - } - engines: { node: '>=0.8' } - dev: true - - /cloneable-readable/1.1.3: - resolution: - { - integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, - } + + clone-stats@1.0.0: {} + + clone@2.1.2: {} + + cloneable-readable@1.1.3: dependencies: inherits: 2.0.4 process-nextick-args: 2.0.1 - readable-stream: 2.3.7 - dev: true - - /co/4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } - dev: true - - /code-point-at/1.1.0: - resolution: - { - integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /codesandbox-import-util-types/2.2.3: - resolution: - { - integrity: sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==, - } - dev: true - - /codesandbox-import-utils/2.2.3: - resolution: - { - integrity: sha512-ymtmcgZKU27U+nM2qUb21aO8Ut/u2S9s6KorOgG81weP+NA0UZkaHKlaRqbLJ9h4i/4FLvwmEXYAnTjNmp6ogg==, - } + readable-stream: 2.3.8 + + code-point-at@1.1.0: {} + + codesandbox-import-util-types@2.2.3: {} + + codesandbox-import-utils@2.2.3: dependencies: codesandbox-import-util-types: 2.2.3 istextorbinary: 2.6.0 - lz-string: 1.4.4 - dev: true - - /codesandbox/2.2.3: - resolution: - { - integrity: sha512-IAkWFk6UUglOhSemI7UFgNNL/jgg+1YjVEIllFULLgsaHhFnY51pCqAifMNuAd5d9Zp4Nk/xMgrEaGNV0L4Xlg==, - } - hasBin: true + lz-string: 1.5.0 + + codesandbox@2.2.3: dependencies: axios: 0.18.1 chalk: 2.4.2 @@ -6494,275 +11798,112 @@ packages: humps: 2.0.1 inquirer: 6.5.2 lodash: 4.17.21 - lz-string: 1.4.4 + lz-string: 1.5.0 ms: 2.1.3 open: 6.4.0 ora: 1.4.0 pacote: 2.7.38 - shortid: 2.2.16 + shortid: 2.2.17 update-notifier: 2.5.0 transitivePeerDependencies: - supports-color - dev: true - - /collect-v8-coverage/1.0.1: - resolution: - { - integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, - } - dev: true - - /collection-map/1.0.0: - resolution: - { - integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==, - } - engines: { node: '>=0.10.0' } + + collection-map@1.0.0: dependencies: arr-map: 2.0.2 for-own: 1.0.0 make-iterator: 1.0.1 - dev: true - /collection-visit/1.0.0: - resolution: - { - integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==, - } - engines: { node: '>=0.10.0' } + collection-visit@1.0.0: dependencies: map-visit: 1.0.0 object-visit: 1.0.1 - dev: true - /color-convert/1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert/2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - - /color-name/1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - dev: true - - /color-name/1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - dev: true - - /color-support/1.1.3: - resolution: - { - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, - } - hasBin: true - dev: true - - /colors/1.4.0: - resolution: - { - integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==, - } - engines: { node: '>=0.1.90' } - dev: true - - /combined-stream/1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + colorette@2.0.20: {} + + colors@1.4.0: {} + + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - - /comma-separated-tokens/1.0.8: - resolution: - { - integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==, - } - dev: true - - /commander/2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } - dev: true - - /commander/4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: '>= 6' } - dev: true - - /commander/9.2.0: - resolution: - { - integrity: sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /commander/9.4.1: - resolution: - { - integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /commondir/1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } - dev: true - - /compare-func/2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } + + comma-separated-tokens@1.0.8: {} + + commander@12.1.0: {} + + commander@13.1.0: {} + + commander@14.0.0: {} + + commander@2.20.3: {} + + commander@6.2.1: {} + + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - - /component-emitter/1.3.0: - resolution: - { - integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==, - } - dev: true - - /compute-scroll-into-view/1.0.17: - resolution: - { - integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==, - } - dev: true - - /concat-map/0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - dev: true - - /concat-stream/1.6.2: - resolution: - { - integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, - } - engines: { '0': node >= 0.8 } + + component-emitter@1.3.1: {} + + compute-scroll-into-view@3.1.1: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 typedarray: 0.0.6 - dev: true - /configstore/3.1.5: - resolution: - { - integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==, - } - engines: { node: '>=4' } + configstore@3.1.5: dependencies: dot-prop: 4.2.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 make-dir: 1.3.0 unique-string: 1.0.0 write-file-atomic: 2.4.3 xdg-basedir: 3.0.0 - dev: true - - /console-browserify/1.2.0: - resolution: - { - integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==, - } - dev: true - - /constants-browserify/1.0.0: - resolution: - { - integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==, - } - dev: true - - /conventional-changelog-angular/5.0.13: - resolution: - { - integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, - } - engines: { node: '>=10' } + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + conventional-changelog-angular@6.0.0: dependencies: compare-func: 2.0.0 - q: 1.5.1 - dev: true - /conventional-changelog-conventionalcommits/5.0.0: - resolution: - { - integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==, - } - engines: { node: '>=10' } + conventional-changelog-conventionalcommits@6.1.0: dependencies: compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-commits-parser/3.2.4: - resolution: - { - integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, - } - engines: { node: '>=10' } - hasBin: true + + conventional-commits-parser@4.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 - lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 - through2: 4.0.2 - dev: true - /convert-source-map/1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } - dev: true + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} - /copy-concurrently/1.0.5: - resolution: - { - integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==, - } + copy-concurrently@1.0.5: dependencies: aproba: 1.2.0 fs-write-stream-atomic: 1.0.10 @@ -6770,1089 +11911,442 @@ packages: mkdirp: 0.5.6 rimraf: 2.7.1 run-queue: 1.0.3 - dev: true - - /copy-descriptor/0.1.1: - resolution: - { - integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /copy-props/2.0.5: - resolution: - { - integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==, - } + + copy-descriptor@0.1.1: {} + + copy-props@2.0.5: dependencies: each-props: 1.3.2 is-plain-object: 5.0.0 - dev: true - - /copy-text-to-clipboard/2.2.0: - resolution: - { - integrity: sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==, - } - engines: { node: '>=6' } - dev: true - - /copy-to-clipboard/3.3.2: - resolution: - { - integrity: sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==, - } + + copy-text-to-clipboard@2.2.0: {} + + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 - dev: true - - /core-js-compat/3.25.5: - resolution: - { - integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==, - } - dependencies: - browserslist: 4.21.4 - dev: true - - /core-js-pure/3.25.5: - resolution: - { - integrity: sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==, - } - requiresBuild: true - dev: true - - /core-js/2.6.12: - resolution: - { - integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==, - } - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: true - - /core-js/3.6.5: - resolution: - { - integrity: sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==, - } - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: true - - /core-util-is/1.0.2: - resolution: - { - integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==, - } - dev: true - - /core-util-is/1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } - dev: true - - /cosmiconfig-typescript-loader/4.1.1_vfayau7oz5qy4giwqlppd3j3ti: - resolution: - { - integrity: sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg==, - } - engines: { node: '>=12', npm: '>=6' } - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' - typescript: '>=3' + + core-js-compat@3.45.1: + dependencies: + browserslist: 4.25.3 + + core-js-pure@3.45.1: {} + + core-js@2.6.12: {} + + core-js@3.6.5: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.2))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.2))(typescript@5.9.2): dependencies: - '@types/node': 14.18.32 - cosmiconfig: 7.0.1 - ts-node: 10.9.1_jcmx33t3olsvcxopqdljsohpme - typescript: 4.8.4 - dev: true + '@types/node': 20.5.1 + cosmiconfig: 8.3.6(typescript@5.9.2) + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.2) + typescript: 5.9.2 - /cosmiconfig/5.2.1: - resolution: - { - integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==, - } - engines: { node: '>=4' } + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 - dev: true - /cosmiconfig/7.0.1: - resolution: - { - integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==, - } - engines: { node: '>=10' } + cosmiconfig@7.1.0: dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true - - /coveralls/3.1.1: - resolution: - { - integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==, - } - engines: { node: '>=6' } - hasBin: true + + cosmiconfig@8.3.6(typescript@5.9.2): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.2 + + coveralls@3.1.1: dependencies: js-yaml: 3.14.1 lcov-parse: 1.0.0 log-driver: 1.2.7 - minimist: 1.2.7 + minimist: 1.2.8 request: 2.88.2 - dev: true - /create-ecdh/4.0.4: - resolution: - { - integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, - } + create-ecdh@4.0.4: dependencies: - bn.js: 4.12.0 - elliptic: 6.5.4 - dev: true + bn.js: 4.12.2 + elliptic: 6.6.1 - /create-error-class/3.0.2: - resolution: - { - integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==, - } - engines: { node: '>=0.10.0' } + create-error-class@3.0.2: dependencies: capture-stack-trace: 1.0.2 - dev: true - /create-hash/1.2.0: - resolution: - { - integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, - } + create-hash@1.1.3: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + ripemd160: 2.0.1 + sha.js: 2.4.12 + + create-hash@1.2.0: dependencies: - cipher-base: 1.0.4 + cipher-base: 1.0.6 inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 - sha.js: 2.4.11 - dev: true + sha.js: 2.4.12 - /create-hmac/1.1.7: - resolution: - { - integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, - } + create-hmac@1.1.7: dependencies: - cipher-base: 1.0.4 + cipher-base: 1.0.6 create-hash: 1.2.0 inherits: 2.0.4 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /create-require/1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } - dev: true - - /cross-fetch/3.1.5: - resolution: - { - integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, - } - dependencies: - node-fetch: 2.6.7 + sha.js: 2.4.12 + + create-require@1.1.1: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-fetch@3.2.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - dev: true - /cross-spawn/5.1.0: - resolution: - { - integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==, - } + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn/6.0.5: - resolution: - { - integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, - } - engines: { node: '>=4.8' } + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 - semver: 5.7.1 + semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn/7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: '>= 8' } + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-browserify/3.12.0: - resolution: - { - integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==, - } + crypto-browserify@3.12.1: dependencies: browserify-cipher: 1.0.1 - browserify-sign: 4.2.1 + browserify-sign: 4.2.3 create-ecdh: 4.0.4 create-hash: 1.2.0 create-hmac: 1.1.7 diffie-hellman: 5.0.3 + hash-base: 3.0.5 inherits: 2.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 - dev: true - - /crypto-random-string/1.0.0: - resolution: - { - integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==, - } - engines: { node: '>=4' } - dev: true - - /css-blank-pseudo/0.1.4: - resolution: - { - integrity: sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==, - } - engines: { node: '>=6.0.0' } - hasBin: true + + crypto-random-string@1.0.0: {} + + css-blank-pseudo@0.1.4: dependencies: - postcss: 7.0.39 - dev: true - - /css-has-pseudo/0.10.0: - resolution: - { - integrity: sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==, - } - engines: { node: '>=6.0.0' } - hasBin: true + postcss: 7.0.32 + + css-has-pseudo@0.10.0: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-selector-parser: 5.0.0 - dev: true - /css-in-js-utils/2.0.1: - resolution: - { - integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==, - } + css-prefers-color-scheme@3.1.1: dependencies: - hyphenate-style-name: 1.0.4 - isobject: 3.0.1 - dev: true - - /css-prefers-color-scheme/3.1.1: - resolution: - { - integrity: sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==, - } - engines: { node: '>=6.0.0' } - hasBin: true - dependencies: - postcss: 7.0.39 - dev: true - - /css-select/5.1.0: - resolution: - { - integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, - } - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.0.1 - nth-check: 2.1.1 - dev: true - - /css-tree/1.1.3: - resolution: - { - integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, - } - engines: { node: '>=8.0.0' } - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: true - - /css-what/6.1.0: - resolution: - { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, - } - engines: { node: '>= 6' } - dev: true - - /cssdb/4.4.0: - resolution: - { - integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==, - } - dev: true - - /cssesc/2.0.0: - resolution: - { - integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - - /cssesc/3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - - /cssom/0.3.8: - resolution: - { - integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, - } - dev: true - - /cssom/0.4.4: - resolution: - { - integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==, - } - dev: true - - /cssstyle/2.3.0: - resolution: - { - integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, - } - engines: { node: '>=8' } + postcss: 7.0.32 + + cssdb@4.4.0: {} + + cssesc@2.0.0: {} + + cssesc@3.0.0: {} + + cssom@0.3.8: {} + + cssom@0.4.4: {} + + cssstyle@2.3.0: dependencies: cssom: 0.3.8 - dev: true - - /csstype/3.1.1: - resolution: - { - integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==, - } - dev: true - - /cwd/0.9.1: - resolution: - { - integrity: sha512-4+0D+ojEasdLndYX4Cqff057I/Jp6ysXpwKkdLQLnZxV8f6IYZmZtTP5uqD91a/kWqejoc0sSqK4u8wpTKCh8A==, - } - engines: { node: '>=0.8' } + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + csstype@3.1.3: {} + + cwd@0.9.1: dependencies: find-pkg: 0.1.2 - dev: true - - /cyclist/1.0.1: - resolution: - { - integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==, - } - dev: true - - /d/1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - dependencies: - es5-ext: 0.10.62 - type: 1.2.0 - dev: true - - /dargs/7.0.0: - resolution: - { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, - } - engines: { node: '>=8' } - dev: true - - /dashdash/1.14.1: - resolution: - { - integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, - } - engines: { node: '>=0.10' } + + cyclist@1.0.2: {} + + czg@1.12.0: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dargs@7.0.0: {} + + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 - dev: true - /data-urls/2.0.0: - resolution: - { - integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==, - } - engines: { node: '>=10' } + data-urls@2.0.0: dependencies: abab: 2.0.6 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - dev: true - /datauri/3.0.0: - resolution: - { - integrity: sha512-NeDFuUPV1YCpCn8MUIcDk1QnuyenUHs7f4Q5P0n9FFA0neKFrfEH9esR+YMW95BplbYfdmjbs0Pl/ZGAaM2QHQ==, - } - engines: { node: '>= 8' } + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + datauri@3.0.0: dependencies: image-size: 0.8.3 mimer: 1.1.0 - dev: true - - /date-fns/2.29.3: - resolution: - { - integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==, - } - engines: { node: '>=0.11' } - dev: true - - /dayjs/1.11.5: - resolution: - { - integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==, - } - - /debug/2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + + dayjs@1.11.13: {} + + debug@2.6.9: dependencies: ms: 2.0.0 - dev: true - /debug/2.6.9_supports-color@6.1.0: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.1.0: dependencies: ms: 2.0.0 - supports-color: 6.1.0 - dev: true - /debug/3.1.0: - resolution: - { - integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==, - } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: - ms: 2.0.0 - dev: true + ms: 2.1.3 - /debug/3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.4.1: dependencies: ms: 2.1.3 - dev: true - - /debug/4.3.1_supports-color@8.1.1: - resolution: - { - integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==, - } - engines: { node: '>=6.0' } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + + decamelize-keys@1.1.1: dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - - /debug/4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: '>=6.0' } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decimal.js@10.6.0: {} + + decode-uri-component@0.2.2: {} + + decode-uri-component@0.4.1: {} + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@1.5.2: {} + + deepmerge@4.3.1: {} + + default-compare@1.0.0: dependencies: - ms: 2.1.2 - dev: true + kind-of: 5.1.0 - /decamelize-keys/1.1.0: - resolution: - { - integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==, - } - engines: { node: '>=0.10.0' } + default-resolution@2.0.0: {} + + define-data-property@1.1.4: dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize/1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /decamelize/4.0.0: - resolution: - { - integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, - } - engines: { node: '>=10' } - dev: true - - /decimal.js/10.4.1: - resolution: - { - integrity: sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==, - } - dev: true - - /decode-uri-component/0.2.0: - resolution: - { - integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==, - } - engines: { node: '>=0.10' } - - /dedent/0.7.0: - resolution: - { - integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, - } - dev: true - - /deep-extend/0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } - dev: true - - /deep-is/0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - dev: true - - /deepmerge/1.5.2: - resolution: - { - integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /deepmerge/4.2.2: - resolution: - { - integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /default-compare/1.0.0: - resolution: - { - integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==, - } - engines: { node: '>=0.10.0' } + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: dependencies: - kind-of: 5.1.0 - dev: true - - /default-resolution/2.0.0: - resolution: - { - integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==, - } - engines: { node: '>= 0.10' } - dev: true - - /define-properties/1.1.4: - resolution: - { - integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==, - } - engines: { node: '>= 0.4' } - dependencies: - has-property-descriptors: 1.0.0 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - - /define-property/0.2.5: - resolution: - { - integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-descriptor: 0.1.6 - dev: true - - /define-property/1.0.0: - resolution: - { - integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-descriptor: 1.0.2 - dev: true - - /define-property/2.0.2: - resolution: - { - integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-descriptor: 1.0.2 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 isobject: 3.0.1 - dev: true - /del/5.1.0: - resolution: - { - integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==, - } - engines: { node: '>=8' } + del@5.1.0: dependencies: globby: 10.0.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 2.2.0 is-path-inside: 3.0.3 p-map: 3.0.0 rimraf: 3.0.2 slash: 3.0.0 - dev: true - - /delayed-stream/1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } - dev: true - - /des.js/1.0.1: - resolution: - { - integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==, - } + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + des.js@1.1.0: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: true - - /detect-file/1.0.0: - resolution: - { - integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /detect-indent/6.1.0: - resolution: - { - integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, - } - engines: { node: '>=8' } - dev: true - - /detect-newline/3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: '>=8' } - dev: true - - /diff-sequences/27.5.1: - resolution: - { - integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dev: true - - /diff-sequences/28.1.1: - resolution: - { - integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - dev: true - - /diff/4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: '>=0.3.1' } - dev: true - - /diff/5.0.0: - resolution: - { - integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, - } - engines: { node: '>=0.3.1' } - dev: true - - /diffie-hellman/5.0.3: - resolution: - { - integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, - } - dependencies: - bn.js: 4.12.0 + + detect-file@1.0.0: {} + + detect-indent@6.1.0: {} + + detect-newline@3.1.0: {} + + diff@4.0.2: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.2 miller-rabin: 4.0.1 randombytes: 2.1.0 - dev: true - /dir-glob/3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: '>=8' } + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - - /discontinuous-range/1.0.0: - resolution: - { - integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==, - } - dev: true - - /doctrine/2.1.0: - resolution: - { - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, - } - engines: { node: '>=0.10.0' } + + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine/3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: '>=6.0.0' } + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - - /dom-accessibility-api/0.5.14: - resolution: - { - integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==, - } - dev: true - - /dom-align/1.12.3: - resolution: - { - integrity: sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==, - } - dev: true - - /dom-helpers/3.4.0: - resolution: - { - integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==, - } - dependencies: - '@babel/runtime': 7.19.4 - dev: true - - /dom-serializer/0.2.2: - resolution: - { - integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, - } + + dom-accessibility-api@0.5.16: {} + + dom-align@1.12.4: {} + + dom-helpers@3.4.0: dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - dev: true + '@babel/runtime': 7.28.3 - /dom-serializer/2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } + dom-serializer@0.2.2: dependencies: domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.4.0 - dev: true + entities: 2.2.0 - /dom7/3.0.0: - resolution: - { - integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==, - } + dom7@3.0.0: dependencies: ssr-window: 3.0.0 - dev: true - - /domain-browser/1.2.0: - resolution: - { - integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==, - } - engines: { node: '>=0.4', npm: '>=1.2' } - dev: true - - /domelementtype/1.3.1: - resolution: - { - integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, - } - dev: true - - /domelementtype/2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - dev: true - - /domexception/2.0.1: - resolution: - { - integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==, - } - engines: { node: '>=8' } + + domain-browser@1.2.0: {} + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domexception@2.0.1: dependencies: webidl-conversions: 5.0.0 - dev: true - /domhandler/2.4.2: - resolution: - { - integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==, - } + domhandler@2.4.2: dependencies: domelementtype: 1.3.1 - dev: true - - /domhandler/5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: '>= 4' } - dependencies: - domelementtype: 2.3.0 - dev: true - /domutils/1.7.0: - resolution: - { - integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, - } + domutils@1.7.0: dependencies: dom-serializer: 0.2.2 domelementtype: 1.3.1 - dev: true - /domutils/3.0.1: - resolution: - { - integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==, - } - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - - /dot-prop/4.2.1: - resolution: - { - integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==, - } - engines: { node: '>=4' } + dot-prop@4.2.1: dependencies: is-obj: 1.0.1 - dev: true - /dot-prop/5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: '>=8' } + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /driver-dom/2.2.2: - resolution: - { - integrity: sha512-v/jCQnQkjv0q3Z51zYhG5MfzMjlfJURiC8mhaAwhHsih55j8AnPupurSBOJn67qAE4Ol5XiGlqDnjWAH9XM1OA==, - } + driver-dom@2.2.2: dependencies: style-unit: 3.0.5 - dev: true - - /driver-miniapp/0.1.5: - resolution: - { - integrity: sha512-27SwcAaL50jhaQwhHDXqqiT1BtOw0sp1ZIk8YNvgyBLjrZJhkRx/LTS3xmfgXlKkft8wxsO3039lFXWxKTCDKA==, - } - dev: true - - /driver-server/1.0.0: - resolution: - { - integrity: sha512-H5nhMzsSJYaug+PDPyXiVW2KvK5k7B7K+yVW3FuHESq494Soh1cfomquJ2pk5RiApQr1z0e+0tif11TVRlM+PQ==, - } - dev: true - - /driver-universal/3.5.0: - resolution: - { - integrity: sha512-Np6RFlzVyuy2xRmgbzlBIWYm3cIgpd2eVCNT0/Ai0fLpjaYhUUjejjobXGA7LiBR1C57YY51AbBsGZjjzQK99g==, - } + + driver-miniapp@0.1.5: {} + + driver-universal@3.5.0: dependencies: driver-dom: 2.2.2 driver-miniapp: 0.1.5 driver-weex: 2.1.0 universal-env: 3.3.3 - dev: true - /driver-weex/2.1.0: - resolution: - { - integrity: sha512-Hl/Bdubctm8Cr24acSe8NKwOztmXS7qE3kh+eNjp+NvTPr8DBpDlRIj1g/r1b2Ci82cz43b+Tm29L+sAveoh8g==, - } + driver-weex@2.1.0: dependencies: driver-dom: 2.2.2 style-unit: 3.0.5 - dev: true - - /dumi-assets-types/1.0.1: - resolution: - { - integrity: sha512-A+fJp7L+Q6nU5S2KgbdnyfRoCkAZy+UFudQ45QPM7W+3LIe8o+Tt0cURIQMnLZMBjoKbItB5IDi+IM39FwFZvQ==, - } - dev: true - - /dumi-theme-default/1.1.24_cnajwhgdn6ei6l3rayjar2g26a: - resolution: - { - integrity: sha512-/fS7gBJejom1Zy1GZkrqG/dLEsCK6J/S/ctCPEawDC3KkZE0sJh+dqsMuhHt8ts7ZhaGhDpJNPXSMghfN/qrzw==, - } - peerDependencies: - '@umijs/preset-dumi': 1.x - react: ^16.13.1 || ^17.0.0 + + dumi-assets-types@1.0.1: {} + + dumi-theme-default@1.1.24(@umijs/preset-dumi@1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(umi@3.5.43(react-router@6.30.1(react@19.1.1))))(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@umijs/preset-dumi': 1.1.48_g45atrtxzaxhyxjozk7akm3tee + '@umijs/preset-dumi': 1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(umi@3.5.43(react-router@6.30.1(react@19.1.1))) lodash.throttle: 4.1.1 - prism-react-renderer: 1.3.5_react@16.14.0 - prismjs: 1.29.0 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-tabs: 11.16.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree: 5.7.0_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-error-boundary: 3.1.4_react@16.14.0 + prism-react-renderer: 1.3.5(react@19.1.1) + prismjs: 1.30.0 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tabs: 11.16.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tree: 5.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-error-boundary: 3.1.4(react@19.1.1) transitivePeerDependencies: - react-dom - dev: true - /dumi/1.1.48_fjf7j24wwzs3gehcua7brldgwi: - resolution: - { - integrity: sha512-vswVvRcMI5o6BlUzTT4zcOa3gBs9Zwels5jG6bTvac8ubshGlIa7/ubzxNkAbbyAGN9AJ/XzzlwA/2HzXhNINA==, - } - hasBin: true + dumi@1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): dependencies: - '@umijs/preset-dumi': 1.1.48_g45atrtxzaxhyxjozk7akm3tee - umi: 3.5.34_react-router@5.2.0 + '@umijs/preset-dumi': 1.1.54(react-dom@19.1.1(react@19.1.1))(react-router@6.30.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(umi@3.5.43(react-router@6.30.1(react@19.1.1))) + umi: 3.5.43(react-router@6.30.1(react@19.1.1)) transitivePeerDependencies: - bufferutil - canvas @@ -7862,520 +12356,298 @@ packages: - supports-color - typescript - utf-8-validate - dev: true - - /duplexer3/0.1.5: - resolution: - { - integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==, - } - dev: true - - /duplexify/3.7.1: - resolution: - { - integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==, - } - dependencies: - end-of-stream: 1.4.4 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer3@0.1.5: {} + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.5 inherits: 2.0.4 - readable-stream: 2.3.7 - stream-shift: 1.0.1 - dev: true + readable-stream: 2.3.8 + stream-shift: 1.0.3 - /each-props/1.3.2: - resolution: - { - integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==, - } + each-props@1.3.2: dependencies: is-plain-object: 2.0.4 object.defaults: 1.1.0 - dev: true - /ecc-jsbn/0.1.2: - resolution: - { - integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==, - } + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 - dev: true - /editions/2.3.1: - resolution: - { - integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==, - } - engines: { node: '>=0.8' } + editions@2.3.1: dependencies: errlop: 2.2.0 - semver: 6.3.0 - dev: true - - /electron-to-chromium/1.4.276: - resolution: - { - integrity: sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ==, - } - dev: true - - /elliptic/6.5.4: - resolution: - { - integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==, - } - dependencies: - bn.js: 4.12.0 + semver: 6.3.1 + + electron-to-chromium@1.5.208: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - - /emittery/0.8.1: - resolution: - { - integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==, - } - engines: { node: '>=10' } - dev: true - - /emoji-regex/7.0.3: - resolution: - { - integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==, - } - dev: true - - /emoji-regex/8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - dev: true - - /emojis-list/3.0.0: - resolution: - { - integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, - } - engines: { node: '>= 4' } - dev: true - - /encoding/0.1.13: - resolution: - { - integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, - } + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: true - /end-of-stream/1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } + end-of-stream@1.4.5: dependencies: once: 1.4.0 - dev: true - /enhanced-resolve/4.5.0: - resolution: - { - integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==, - } - engines: { node: '>=6.9.0' } + enhanced-resolve@4.5.0: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 memory-fs: 0.5.0 tapable: 1.1.3 - dev: true - /enquirer/2.3.6: - resolution: - { - integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, - } - engines: { node: '>=8.6' } + enhanced-resolve@5.18.3: dependencies: - ansi-colors: 4.1.3 - dev: true - - /entities/1.1.2: - resolution: - { - integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==, - } - dev: true - - /entities/2.2.0: - resolution: - { - integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, - } - dev: true - - /entities/4.4.0: - resolution: - { - integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==, - } - engines: { node: '>=0.12' } - dev: true - - /enzyme-adapter-react-16/1.15.6_j6bpv5pizkyfppcg2tmva6pmii: - resolution: - { - integrity: sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==, - } - peerDependencies: - enzyme: ^3.0.0 - react: ^16.0.0-0 - react-dom: ^16.0.0-0 - dependencies: - enzyme: 3.11.0 - enzyme-adapter-utils: 1.14.0_react@16.14.0 - enzyme-shallow-equal: 1.0.4 - has: 1.0.3 - object.assign: 4.1.4 - object.values: 1.1.5 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-is: 16.13.1 - react-test-renderer: 16.14.0_react@16.14.0 - semver: 5.7.1 - dev: true - - /enzyme-adapter-utils/1.14.0_react@16.14.0: - resolution: - { - integrity: sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==, - } - peerDependencies: - react: 0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0 + graceful-fs: 4.2.11 + tapable: 2.2.3 + + enquirer@2.4.1: dependencies: - airbnb-prop-types: 2.16.0_react@16.14.0 - function.prototype.name: 1.1.5 - has: 1.0.3 - object.assign: 4.1.4 - object.fromentries: 2.0.5 - prop-types: 15.8.1 - react: 16.14.0 - semver: 5.7.1 - dev: true - - /enzyme-shallow-equal/1.0.4: - resolution: - { - integrity: sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==, - } - dependencies: - has: 1.0.3 - object-is: 1.1.5 - dev: true - - /enzyme/3.11.0: - resolution: - { - integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==, - } - dependencies: - array.prototype.flat: 1.3.0 - cheerio: 1.0.0-rc.12 - enzyme-shallow-equal: 1.0.4 - function.prototype.name: 1.1.5 - has: 1.0.3 - html-element-map: 1.3.1 - is-boolean-object: 1.1.2 - is-callable: 1.2.7 - is-number-object: 1.0.7 - is-regex: 1.1.4 - is-string: 1.0.7 - is-subset: 0.1.1 - lodash.escape: 4.0.1 - lodash.isequal: 4.5.0 - object-inspect: 1.12.2 - object-is: 1.1.5 - object.assign: 4.1.4 - object.entries: 1.1.5 - object.values: 1.1.5 - raf: 3.4.1 - rst-selector-parser: 2.2.3 - string.prototype.trim: 1.2.6 - dev: true - - /err-code/1.1.2: - resolution: - { - integrity: sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==, - } - dev: true - - /errlop/2.2.0: - resolution: - { - integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==, - } - engines: { node: '>=0.8' } - dev: true - - /errno/0.1.8: - resolution: - { - integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, - } - hasBin: true + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@6.0.1: {} + + envinfo@7.14.0: {} + + err-code@1.1.2: {} + + errlop@2.2.0: {} + + errno@0.1.8: dependencies: prr: 1.0.1 - dev: true - /error-ex/1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /error-stack-parser/2.1.4: - resolution: - { - integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, - } + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 - dev: true - - /es-abstract/1.20.4: - resolution: - { - integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.1.3 - get-symbol-description: 1.0.0 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-symbols: 1.0.3 - internal-slot: 1.0.3 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-weakref: 1.0.2 - object-inspect: 1.12.2 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 - unbox-primitive: 1.0.2 - dev: true - - /es-array-method-boxes-properly/1.0.0: - resolution: - { - integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, - } - dev: true - - /es-module-lexer/0.7.1: - resolution: - { - integrity: sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==, - } - dev: true - - /es-shim-unscopables/1.0.0: - resolution: - { - integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==, - } - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive/1.2.1: - resolution: - { - integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, - } - engines: { node: '>= 0.4' } + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@0.7.1: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /es5-ext/0.10.62: - resolution: - { - integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, - } - engines: { node: '>=0.10' } - requiresBuild: true + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 next-tick: 1.1.0 - dev: true - - /es5-imcompatible-versions/0.1.77: - resolution: - { - integrity: sha512-PYCZ6CvLzvVOPK4Lgja32PhWUoEJkQ1mWep0xuGtvVzmRAHq2xWHUuQ+jUXsIIAHo6c3Kh+n0z4rKCgBd4CrXA==, - } - dev: true - - /es6-iterator/2.0.3: - resolution: - { - integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, - } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 - dev: true - - /es6-promise/4.2.8: - resolution: - { - integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==, - } - dev: true - - /es6-promisify/5.0.0: - resolution: - { - integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==, - } + + es5-imcompatible-versions@0.1.90: {} + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - dev: true - /es6-symbol/3.1.3: - resolution: - { - integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, - } + es6-symbol@3.1.4: dependencies: - d: 1.0.1 + d: 1.0.2 ext: 1.7.0 - dev: true - /es6-weak-map/2.0.3: - resolution: - { - integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==, - } + es6-weak-map@2.0.3: dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - dev: true - - /esbuild/0.12.15: - resolution: - { - integrity: sha512-72V4JNd2+48eOVCXx49xoSWHgC3/cCy96e7mbXKY+WOWghN00cCmlGnwVLRhRHorvv0dgCyuMYBZlM2xDM5OQw==, - } - hasBin: true - requiresBuild: true - dev: true - - /escalade/3.1.1: - resolution: - { - integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, - } - engines: { node: '>=6' } - dev: true - - /escape-string-regexp/1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: '>=0.8.0' } - dev: true - - /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 - - /escodegen/2.0.0: - resolution: - { - integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==, - } - engines: { node: '>=6.0' } - hasBin: true + es6-symbol: 3.1.4 + + esbuild@0.12.15: {} + + esbuild@0.25.9: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 - optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 - dev: true - /eslint-ast-utils/1.1.0: - resolution: - { - integrity: sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==, - } - engines: { node: '>=4' } + eslint-ast-utils@1.1.0: dependencies: lodash.get: 4.4.2 lodash.zip: 4.2.0 - dev: true - /eslint-config-prettier/8.5.0_eslint@7.32.0: - resolution: - { - integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==, - } - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@8.10.2(eslint@7.32.0): dependencies: eslint: 7.32.0 - dev: true - /eslint-formatter-pretty/4.1.0: - resolution: - { - integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==, - } - engines: { node: '>=10' } + eslint-formatter-pretty@4.1.0: dependencies: '@types/eslint': 7.29.0 ansi-escapes: 4.3.2 @@ -8385,252 +12657,131 @@ packages: plur: 4.0.0 string-width: 4.2.3 supports-hyperlinks: 2.3.0 - dev: true - - /eslint-plugin-babel/5.3.1_eslint@7.32.0: - resolution: - { - integrity: sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==, - } - engines: { node: '>=4' } - peerDependencies: - eslint: '>=4.0.0' + + eslint-plugin-babel@5.3.1(eslint@7.32.0): dependencies: eslint: 7.32.0 eslint-rule-composer: 0.3.0 - dev: true - - /eslint-plugin-jest/24.7.0_giwjxr77q5eummqkfvrenf2zna: - resolution: - { - integrity: sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==, - } - engines: { node: '>=10' } - peerDependencies: - '@typescript-eslint/eslint-plugin': '>= 4' - eslint: '>=5' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true + + eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5): dependencies: - '@typescript-eslint/eslint-plugin': 5.40.0_bjgutjmzwoxcmti7ime6tsylke - '@typescript-eslint/experimental-utils': 4.33.0_3rubbgt5ekhqrcgx4uwls3neim + '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) eslint: 7.32.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2) transitivePeerDependencies: - supports-color - typescript - dev: true - - /eslint-plugin-promise/6.0.1_eslint@7.32.0: - resolution: - { - integrity: sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + + eslint-plugin-promise@6.6.0(eslint@7.32.0): dependencies: eslint: 7.32.0 - dev: true - - /eslint-plugin-react-hooks/4.6.0_eslint@7.32.0: - resolution: - { - integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==, - } - engines: { node: '>=10' } - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-hooks@4.6.2(eslint@7.32.0): dependencies: eslint: 7.32.0 - dev: true - - /eslint-plugin-react/7.31.10_eslint@7.32.0: - resolution: - { - integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==, - } - engines: { node: '>=4' } - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react@7.37.5(eslint@7.32.0): dependencies: - array-includes: 3.1.5 - array.prototype.flatmap: 1.3.0 + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 eslint: 7.32.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.5 - object.fromentries: 2.0.5 - object.hasown: 1.1.1 - object.values: 1.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.0 - string.prototype.matchall: 4.0.7 - dev: true - - /eslint-plugin-unicorn/20.1.0_eslint@7.32.0: - resolution: - { - integrity: sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA==, - } - engines: { node: '>=10' } - peerDependencies: - eslint: '>=7.0.0' + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-plugin-unicorn@20.1.0(eslint@7.32.0): dependencies: ci-info: 2.0.0 clean-regexp: 1.0.0 eslint: 7.32.0 eslint-ast-utils: 1.1.0 - eslint-template-visitor: 2.3.2_eslint@7.32.0 + eslint-template-visitor: 2.3.2(eslint@7.32.0) eslint-utils: 2.1.0 import-modules: 2.1.0 lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 - regexp-tree: 0.1.24 + regexp-tree: 0.1.27 reserved-words: 0.1.2 safe-regex: 2.1.1 - semver: 7.3.8 + semver: 7.7.2 transitivePeerDependencies: - supports-color - dev: true - - /eslint-rule-composer/0.3.0: - resolution: - { - integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==, - } - engines: { node: '>=4.0.0' } - dev: true - - /eslint-rule-docs/1.1.235: - resolution: - { - integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==, - } - dev: true - - /eslint-scope/4.0.3: - resolution: - { - integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==, - } - engines: { node: '>=4.0.0' } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - /eslint-scope/5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: '>=8.0.0' } + eslint-rule-composer@0.3.0: {} + + eslint-rule-docs@1.1.235: {} + + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-template-visitor/2.3.2_eslint@7.32.0: - resolution: - { - integrity: sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==, - } - peerDependencies: - eslint: '>=7.0.0' + eslint-template-visitor@2.3.2(eslint@7.32.0): dependencies: - '@babel/core': 7.19.3 - '@babel/eslint-parser': 7.19.1_mmbyq476xpa6tuwz6732ekfpz4 + '@babel/core': 7.28.3 + '@babel/eslint-parser': 7.28.0(@babel/core@7.28.3)(eslint@7.32.0) eslint: 7.32.0 eslint-visitor-keys: 2.1.0 - esquery: 1.4.0 + esquery: 1.6.0 multimap: 1.1.0 transitivePeerDependencies: - supports-color - dev: true - /eslint-utils/2.1.0: - resolution: - { - integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==, - } - engines: { node: '>=6' } + eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-utils/3.0.0_eslint@7.32.0: - resolution: - { - integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, - } - engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } - peerDependencies: - eslint: '>=5' + + eslint-utils@3.0.0(eslint@7.32.0): dependencies: eslint: 7.32.0 eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys/1.3.0: - resolution: - { - integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==, - } - engines: { node: '>=4' } - dev: true - - /eslint-visitor-keys/2.1.0: - resolution: - { - integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, - } - engines: { node: '>=10' } - dev: true - - /eslint-visitor-keys/3.3.0: - resolution: - { - integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - /eslint/7.32.0: - resolution: - { - integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - hasBin: true + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@7.32.0: dependencies: '@babel/code-frame': 7.12.11 '@eslint/eslintrc': 0.4.3 '@humanwhocodes/config-array': 0.5.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 + cross-spawn: 7.0.6 + debug: 4.4.1 doctrine: 3.0.0 - enquirer: 2.3.6 + enquirer: 2.4.1 escape-string-regexp: 4.0.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 eslint-visitor-keys: 2.1.0 espree: 7.3.1 - esquery: 1.4.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.17.0 + globals: 13.24.0 ignore: 4.0.6 - import-fresh: 3.3.0 + import-fresh: 3.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 js-yaml: 3.14.1 @@ -8639,116 +12790,66 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.4 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.7.2 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 - table: 6.8.0 + table: 6.9.0 text-table: 0.2.0 - v8-compile-cache: 2.3.0 + v8-compile-cache: 2.4.0 transitivePeerDependencies: - supports-color - dev: true - - /esm/3.2.25: - resolution: - { - integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==, - } - engines: { node: '>=6' } - dev: true - - /espree/7.3.1: - resolution: - { - integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==, - } - engines: { node: ^10.12.0 || >=12.0.0 } + + esm@3.2.25: {} + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@7.3.1: dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 - dev: true - - /esprima/4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: '>=4' } - hasBin: true - dev: true - /esquery/1.4.0: - resolution: - { - integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==, - } - engines: { node: '>=0.10' } + esprima@4.0.1: {} + + esquery@1.6.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse/4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } + esrecurse@4.3.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 - - /events/3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } - dev: true - - /evp_bytestokey/1.0.3: - resolution: - { - integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, - } + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + events@3.3.0: {} + + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - dev: true - /execa/0.7.0: - resolution: - { - integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==, - } - engines: { node: '>=4' } + execa@0.7.0: dependencies: cross-spawn: 5.1.0 get-stream: 3.0.0 @@ -8757,32 +12858,20 @@ packages: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 - dev: true - /execa/1.0.0: - resolution: - { - integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==, - } - engines: { node: '>=6' } + execa@1.0.0: dependencies: - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 get-stream: 4.1.0 is-stream: 1.1.0 npm-run-path: 2.0.2 p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 - dev: true - /execa/4.1.0: - resolution: - { - integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==, - } - engines: { node: '>=10' } + execa@4.1.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 5.2.0 human-signals: 1.1.1 is-stream: 2.0.1 @@ -8791,16 +12880,10 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa/5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: '>=10' } + execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -8809,32 +12892,12 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execall/2.0.0: - resolution: - { - integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==, - } - engines: { node: '>=8' } + execall@2.0.0: dependencies: clone-regexp: 2.2.0 - dev: true - - /exit/0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /expand-brackets/2.1.4: - resolution: - { - integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, - } - engines: { node: '>=0.10.0' } + + expand-brackets@2.1.4: dependencies: debug: 2.6.9 define-property: 0.2.5 @@ -8845,114 +12908,39 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: true - - /expand-brackets/2.1.4_supports-color@6.1.0: - resolution: - { - integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, - } - engines: { node: '>=0.10.0' } - dependencies: - debug: 2.6.9_supports-color@6.1.0 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /expand-tilde/1.2.2: - resolution: - { - integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==, - } - engines: { node: '>=0.10.0' } + expand-tilde@1.2.2: dependencies: os-homedir: 1.0.2 - dev: true - /expand-tilde/2.0.2: - resolution: - { - integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, - } - engines: { node: '>=0.10.0' } + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - - /expect/27.5.1: - resolution: - { - integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - dev: true - - /ext/1.7.0: - resolution: - { - integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, - } - dependencies: - type: 2.7.2 - dev: true - - /extend-shallow/2.0.1: - resolution: - { - integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, - } - engines: { node: '>=0.10.0' } + + expect-type@1.2.2: {} + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: true - /extend-shallow/3.0.2: - resolution: - { - integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==, - } - engines: { node: '>=0.10.0' } + extend-shallow@3.0.2: dependencies: assign-symbols: 1.0.0 is-extendable: 1.0.1 - dev: true - - /extend/3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } - dev: true - - /external-editor/3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - } - engines: { node: '>=4' } + + extend@3.0.2: {} + + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /extglob/2.0.4: - resolution: - { - integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, - } - engines: { node: '>=0.10.0' } + extglob@2.0.4: dependencies: array-unique: 0.3.2 define-property: 1.0.0 @@ -8964,314 +12952,123 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: true - /extglob/2.0.4_supports-color@6.1.0: - resolution: - { - integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, - } - engines: { node: '>=0.10.0' } - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4_supports-color@6.1.0 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extsprintf/1.3.0: - resolution: - { - integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==, - } - engines: { '0': node >=0.6.0 } - dev: true - - /fancy-log/1.3.3: - resolution: - { - integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==, - } - engines: { node: '>= 0.10' } + extsprintf@1.3.0: {} + + fancy-log@1.3.3: dependencies: ansi-gray: 0.1.1 color-support: 1.1.3 parse-node-version: 1.0.1 time-stamp: 1.1.0 - dev: true - - /fast-deep-equal/3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - dev: true - - /fast-glob/3.2.12: - resolution: - { - integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, - } - engines: { node: '>=8.6.0' } + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: 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/1.1.4: - resolution: - { - integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==, - } - dev: true - - /fast-levenshtein/2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - dev: true - - /fast-shallow-equal/1.0.0: - resolution: - { - integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==, - } - dev: true - - /fastest-levenshtein/1.0.16: - resolution: - { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, - } - engines: { node: '>= 4.9.1' } - dev: true - - /fastest-stable-stringify/2.0.2: - resolution: - { - integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==, - } - dev: true - - /fastq/1.13.0: - resolution: - { - integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==, - } - dependencies: - reusify: 1.0.4 - dev: true - - /fault/1.0.4: - resolution: - { - integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==, - } + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@1.1.4: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@1.0.4: dependencies: format: 0.2.2 - dev: true - - /fb-watchman/2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } - dependencies: - bser: 2.1.1 - dev: true - - /figgy-pudding/3.5.2: - resolution: - { - integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==, - } - dev: true - - /figures/2.0.0: - resolution: - { - integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, - } - engines: { node: '>=4' } + + fbemitter@3.0.0(encoding@0.1.13): + dependencies: + fbjs: 3.0.5(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5(encoding@0.1.13): + dependencies: + cross-fetch: 3.2.0(encoding@0.1.13) + 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.41 + transitivePeerDependencies: + - encoding + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 - 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.0.4 - dev: true - - /file-name/0.1.0: - resolution: - { - integrity: sha512-Q8SskhjF4eUk/xoQkmubwLkoHwOTv6Jj/WGtOVLKkZ0vvM+LipkSXugkn1F/+mjWXU32AXLZB3qaz0arUzgtRw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /file-uri-to-path/1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } - dev: true + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-name@0.1.0: {} + + file-uri-to-path@1.0.0: optional: true - /filesize/3.6.1: - resolution: - { - integrity: sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==, - } - engines: { node: '>= 0.4.0' } - dev: true - - /fill-range/4.0.0: - resolution: - { - integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, - } - engines: { node: '>=0.10.0' } + filesize@3.6.1: {} + + fill-range@4.0.0: dependencies: extend-shallow: 2.0.1 is-number: 3.0.0 repeat-string: 1.6.1 to-regex-range: 2.1.1 - dev: true - /fill-range/7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: '>=8' } + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - dev: true - - /filter-obj/1.1.0: - resolution: - { - integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==, - } - engines: { node: '>=0.10.0' } - - /find-cache-dir/2.1.0: - resolution: - { - integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==, - } - engines: { node: '>=6' } - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - dev: true - - /find-cache-dir/3.3.2: - resolution: - { - integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==, - } - engines: { node: '>=8' } - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - /find-file-up/0.1.3: - resolution: - { - integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==, - } - engines: { node: '>=0.10.0' } + filter-obj@1.1.0: {} + + filter-obj@5.1.0: {} + + find-file-up@0.1.3: dependencies: fs-exists-sync: 0.1.0 resolve-dir: 0.1.1 - dev: true - /find-pkg/0.1.2: - resolution: - { - integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==, - } - engines: { node: '>=0.10.0' } + find-pkg@0.1.2: dependencies: find-file-up: 0.1.3 - dev: true - /find-up/1.1.2: - resolution: - { - integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==, - } - engines: { node: '>=0.10.0' } + find-up@1.1.2: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 - dev: true - /find-up/3.0.0: - resolution: - { - integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, - } - engines: { node: '>=6' } - dependencies: - locate-path: 3.0.0 - dev: true - - /find-up/4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: '>=8' } + find-up@4.1.0: 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' } + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /findup-sync/2.0.0: - resolution: - { - integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==, - } - engines: { node: '>= 0.10' } + findup-sync@2.0.0: dependencies: detect-file: 1.0.0 is-glob: 3.1.0 @@ -9279,14 +13076,8 @@ packages: resolve-dir: 1.0.1 transitivePeerDependencies: - supports-color - dev: true - /findup-sync/3.0.0: - resolution: - { - integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==, - } - engines: { node: '>= 0.10' } + findup-sync@3.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 @@ -9294,552 +13085,254 @@ packages: resolve-dir: 1.0.1 transitivePeerDependencies: - supports-color - dev: true - - /findup-sync/3.0.0_supports-color@6.1.0: - resolution: - { - integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==, - } - engines: { node: '>= 0.10' } - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 3.1.10_supports-color@6.1.0 - resolve-dir: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /fined/1.2.0: - resolution: - { - integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==, - } - engines: { node: '>= 0.10' } + fined@1.2.0: dependencies: expand-tilde: 2.0.2 is-plain-object: 2.0.4 object.defaults: 1.1.0 object.pick: 1.3.0 parse-filepath: 1.0.2 - dev: true - - /flagged-respawn/1.0.1: - resolution: - { - integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==, - } - engines: { node: '>= 0.10' } - dev: true - - /flat-cache/3.0.4: - resolution: - { - integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.7 + + flagged-respawn@1.0.1: {} + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat/5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } - hasBin: true - dev: true - - /flatted/3.2.7: - resolution: - { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, - } - dev: true - - /flatten/1.0.3: - resolution: - { - integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==, - } - deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - dev: true + flat@5.0.2: {} + + flatted@3.3.3: {} + + flatten@1.0.3: {} - /flush-write-stream/1.1.1: - resolution: - { - integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==, - } + flush-write-stream@1.1.1: dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 - dev: true + readable-stream: 2.3.8 + + flux@4.0.4(encoding@0.1.13)(react@19.1.1): + dependencies: + fbemitter: 3.0.0(encoding@0.1.13) + fbjs: 3.0.5(encoding@0.1.13) + react: 19.1.1 + transitivePeerDependencies: + - encoding - /follow-redirects/1.5.10: - resolution: - { - integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==, - } - engines: { node: '>=4.0' } + follow-redirects@1.5.10: dependencies: debug: 3.1.0 transitivePeerDependencies: - supports-color - dev: true - - /for-in/1.0.2: - resolution: - { - integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /for-own/1.0.0: - resolution: - { - integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==, - } - engines: { node: '>=0.10.0' } + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + for-own@1.0.0: dependencies: for-in: 1.0.2 - dev: true - - /forever-agent/0.6.1: - resolution: - { - integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==, - } - dev: true - - /form-data/2.3.3: - resolution: - { - integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==, - } - engines: { node: '>= 0.12' } + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /form-data/3.0.1: - resolution: - { - integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, - } - engines: { node: '>= 6' } + form-data@3.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - dev: true - - /format/0.2.2: - resolution: - { - integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==, - } - engines: { node: '>=0.4.x' } - dev: true - - /fragment-cache/0.2.1: - resolution: - { - integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, - } - engines: { node: '>=0.10.0' } + + format@0.2.2: {} + + fragment-cache@0.2.1: dependencies: map-cache: 0.2.2 - dev: true - /from2/2.3.0: - resolution: - { - integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, - } + from2@2.3.0: dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 - dev: true - - /fs-constants/1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: true - - /fs-exists-sync/0.1.0: - resolution: - { - integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /fs-extra/10.1.0: - resolution: - { - integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, - } - engines: { node: '>=12' } - dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-extra/3.0.1: - resolution: - { - integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==, - } - dependencies: - graceful-fs: 4.2.10 + readable-stream: 2.3.8 + + fs-constants@1.0.0: {} + + fs-exists-sync@0.1.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@11.3.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@3.0.1: + dependencies: + graceful-fs: 4.2.11 jsonfile: 3.0.1 universalify: 0.1.2 - dev: true - /fs-mkdirp-stream/1.0.0: - resolution: - { - integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==, - } - engines: { node: '>= 0.10' } + fs-mkdirp-stream@1.0.0: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 through2: 2.0.5 - dev: true - - /fs-readdir-recursive/1.1.0: - resolution: - { - integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==, - } - dev: true - - /fs-write-stream-atomic/1.0.10: - resolution: - { - integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==, - } - dependencies: - graceful-fs: 4.2.10 + + fs-readdir-recursive@1.1.0: {} + + fs-write-stream-atomic@1.0.10: + dependencies: + graceful-fs: 4.2.11 iferr: 0.1.5 imurmurhash: 0.1.4 - readable-stream: 2.3.7 - dev: true - - /fs.realpath/1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - dev: true - - /fsevents/1.2.13: - resolution: - { - integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==, - } - engines: { node: '>= 4.0' } - os: [darwin] - deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. - requiresBuild: true + readable-stream: 2.3.8 + + fs.realpath@1.0.0: {} + + fsevents@1.2.13: dependencies: bindings: 1.5.0 - nan: 2.17.0 - dev: true + nan: 2.23.0 optional: true - /fsevents/2.3.2: - resolution: - { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /fstream/1.0.12: - resolution: - { - integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, - } - engines: { node: '>=0.6' } + fstream@1.0.12: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 inherits: 2.0.4 mkdirp: 0.5.6 rimraf: 2.7.1 - dev: true - - /function-bind/1.1.1: - resolution: - { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, - } - dev: true - - /function.prototype.name/1.1.5: - resolution: - { - integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 functions-have-names: 1.2.3 - dev: true - - /functional-red-black-tree/1.0.1: - resolution: - { - integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==, - } - dev: true - - /functions-have-names/1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } - dev: true - - /genfun/4.0.1: - resolution: - { - integrity: sha512-48yv1eDS5Qrz6cbSDBBik0u7jCgC/eA9eZrl9MIN1LfKzFTuGt6EHgr31YM8yT9cjb5BplXb4Iz3VtOYmgt8Jg==, - } - 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/1.0.3: - resolution: - { - integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==, - } - dev: true - - /get-caller-file/2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } - dev: true - - /get-intrinsic/1.1.3: - resolution: - { - integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==, - } - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - - /get-own-enumerable-property-symbols/3.0.2: - resolution: - { - integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, - } - dev: true - - /get-package-type/0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: '>=8.0.0' } - dev: true - - /get-stdin/8.0.0: - resolution: - { - integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==, - } - engines: { node: '>=10' } - dev: true - - /get-stream/3.0.0: - resolution: - { - integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==, - } - engines: { node: '>=4' } - dev: true - - /get-stream/4.1.0: - resolution: - { - integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==, - } - engines: { node: '>=6' } - dependencies: - pump: 3.0.0 - dev: true - - /get-stream/5.2.0: - resolution: - { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, - } - engines: { node: '>=8' } - dependencies: - pump: 3.0.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.0: - resolution: - { - integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - dev: true - - /get-value/2.0.6: - resolution: - { - integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /getpass/0.1.7: - resolution: - { - integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==, - } + hasown: 2.0.2 + is-callable: 1.2.7 + + functional-red-black-tree@1.0.1: {} + + functions-have-names@1.2.3: {} + + genfun@4.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@1.0.3: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stdin@8.0.0: {} + + get-stream@3.0.0: {} + + get-stream@4.1.0: + dependencies: + pump: 3.0.3 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-value@2.0.6: {} + + getpass@0.1.7: dependencies: assert-plus: 1.0.0 - dev: true - - /git-branch/1.0.0: - resolution: - { - integrity: sha512-ZTzuqw5Df8fyLXQWrX6hK+4FpNCdKzMcERlxENEGO5aKcLmG7MAszhrMhluUKNKmOS/JAGijDMQDXDCDw1mE/A==, - } - engines: { node: '>=0.8' } - dev: true - - /git-config-path/1.0.1: - resolution: - { - integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==, - } - engines: { node: '>=0.10.0' } + + git-branch@1.0.0: {} + + git-config-path@1.0.1: dependencies: extend-shallow: 2.0.1 fs-exists-sync: 0.1.0 homedir-polyfill: 1.0.3 - dev: true - - /git-hooks-list/1.0.3: - resolution: - { - integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==, - } - dev: true - - /git-raw-commits/2.0.11: - resolution: - { - integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, - } - engines: { node: '>=10' } - hasBin: true + + git-hooks-list@1.0.3: {} + + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /git-repo-name/0.6.0: - resolution: - { - integrity: sha512-DF4XxB6H+Te79JA08/QF/IjIv+j+0gF990WlgAX3SXXU2irfqvBc/xxlAIh6eJWYaKz45MrrGVBFS0Qc4bBz5g==, - } - engines: { node: '>=0.8' } + git-repo-name@0.6.0: dependencies: cwd: 0.9.1 file-name: 0.1.0 lazy-cache: 1.0.4 remote-origin-url: 0.5.3 - dev: true - /git-username/0.5.1: - resolution: - { - integrity: sha512-xjUjrj3i4kup2A3a/ZVZB1Nt0PUX7SU7KeVqIbXPdslT7NbNfyO04JMxBv4gar77JePdS+A6f05jG1Viy6+U1w==, - } - engines: { node: '>=0.8' } + git-username@0.5.1: dependencies: remote-origin-url: 0.4.0 - dev: true - /github-slugger/1.4.0: - resolution: - { - integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==, - } - dev: true + github-slugger@1.5.0: {} - /glob-parent/3.1.0: - resolution: - { - integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==, - } + glob-parent@3.1.0: dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 - dev: true - /glob-parent/5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-stream/6.1.0: - resolution: - { - integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==, - } - engines: { node: '>= 0.10' } + glob-stream@6.1.0: dependencies: extend: 3.0.2 glob: 7.2.3 @@ -9847,18 +13340,14 @@ packages: is-negated-glob: 1.0.0 ordered-read-streams: 1.0.1 pumpify: 1.5.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 remove-trailing-separator: 1.1.0 to-absolute-glob: 2.0.2 unique-stream: 2.3.1 - dev: true - /glob-watcher/5.0.5: - resolution: - { - integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==, - } - engines: { node: '>= 0.10' } + glob-to-regexp@0.4.1: {} + + glob-watcher@5.0.5: dependencies: anymatch: 2.0.0 async-done: 1.3.2 @@ -9869,27 +13358,17 @@ packages: object.defaults: 1.1.0 transitivePeerDependencies: - supports-color - dev: true - /glob/7.1.6: - resolution: - { - integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==, - } + glob@10.4.5: 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 + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 - /glob/7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -9897,194 +13376,105 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /global-dirs/0.1.1: - resolution: - { - integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, - } - engines: { node: '>=4' } + global-dirs@0.1.1: dependencies: ini: 1.3.8 - dev: true - /global-modules/0.2.3: - resolution: - { - integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==, - } - engines: { node: '>=0.10.0' } + global-modules@0.2.3: dependencies: global-prefix: 0.1.5 is-windows: 0.2.0 - dev: true - /global-modules/1.0.0: - resolution: - { - integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, - } - engines: { node: '>=0.10.0' } + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - dev: true - /global-modules/2.0.0: - resolution: - { - integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, - } - engines: { node: '>=6' } + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - dev: true - /global-prefix/0.1.5: - resolution: - { - integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==, - } - engines: { node: '>=0.10.0' } + global-prefix@0.1.5: dependencies: homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 0.2.0 which: 1.3.1 - dev: true - /global-prefix/1.0.2: - resolution: - { - integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, - } - engines: { node: '>=0.10.0' } + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 - dev: true - /global-prefix/3.0.0: - resolution: - { - integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, - } - engines: { node: '>=6' } + global-prefix@3.0.0: dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 - dev: true - - /globals/11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } - dev: true - - /globals/13.17.0: - resolution: - { - integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==, - } - engines: { node: '>=8' } + + globals@11.12.0: {} + + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globby/10.0.0: - resolution: - { - integrity: sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==, - } - engines: { node: '>=8' } + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@10.0.0: dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.3 glob: 7.2.3 - ignore: 5.2.0 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby/10.0.2: - resolution: - { - integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==, - } - engines: { node: '>=8' } + globby@10.0.2: dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.3 glob: 7.2.3 - ignore: 5.2.0 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby/11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: '>=10' } + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.0 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - dev: true - - /globjoin/0.1.4: - resolution: - { - integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==, - } - dev: true - - /glogg/1.0.2: - resolution: - { - integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==, - } - engines: { node: '>= 0.10' } + + globjoin@0.1.4: {} + + glogg@1.0.2: dependencies: sparkles: 1.0.1 - dev: true - - /gonzales-pe/4.3.0: - resolution: - { - integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==, - } - engines: { node: '>=0.6.0' } - hasBin: true + + gonzales-pe@4.3.0: dependencies: - minimist: 1.2.7 - dev: true + minimist: 1.2.8 - /got/6.7.1: - resolution: - { - integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==, - } - engines: { node: '>=4' } + gopd@1.2.0: {} + + got@6.7.1: dependencies: '@types/keyv': 3.1.4 - '@types/responselike': 1.0.0 + '@types/responselike': 1.0.3 create-error-class: 3.0.2 duplexer3: 0.1.5 get-stream: 3.0.0 @@ -10096,59 +13486,27 @@ packages: timed-out: 4.0.1 unzip-response: 2.0.1 url-parse-lax: 1.0.0 - dev: true - - /graceful-fs/4.2.10: - resolution: - { - integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, - } - dev: true - - /gray-matter/4.0.3: - resolution: - { - integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==, - } - engines: { node: '>=6.0' } + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + gray-matter@4.0.3: dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - dev: true - - /growl/1.10.5: - resolution: - { - integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==, - } - engines: { node: '>=4.x' } - dev: true - - /gulp-babel/8.0.0_@babel+core@7.19.3: - resolution: - { - integrity: sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==, - } - engines: { node: '>=6' } - peerDependencies: - '@babel/core': ^7.0.0 + + gulp-babel@8.0.0(@babel/core@7.28.3): dependencies: - '@babel/core': 7.19.3 + '@babel/core': 7.28.3 plugin-error: 1.0.1 replace-ext: 1.0.1 through2: 2.0.5 vinyl-sourcemaps-apply: 0.2.1 - dev: true - - /gulp-cli/2.3.0: - resolution: - { - integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==, - } - engines: { node: '>= 0.10' } - hasBin: true + + gulp-cli@2.3.0: dependencies: ansi-colors: 1.1.0 archy: 1.0.0 @@ -10170,33 +13528,18 @@ packages: yargs: 7.1.2 transitivePeerDependencies: - supports-color - dev: true - - /gulp-typescript/6.0.0-alpha.1_typescript@4.8.4: - resolution: - { - integrity: sha512-KoT0TTfjfT7w3JItHkgFH1T/zK4oXWC+a8xxKfniRfVcA0Fa1bKrIhztYelYmb+95RB80OLMBreknYkdwzdi2Q==, - } - engines: { node: '>= 8' } - peerDependencies: - typescript: '~2.7.1 || >=2.8.0-dev || >=2.9.0-dev || ~3.0.0 || >=3.0.0-dev || >=3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev ' + + gulp-typescript@6.0.0-alpha.1(typescript@5.9.2): dependencies: ansi-colors: 4.1.3 plugin-error: 1.0.1 - source-map: 0.7.4 + source-map: 0.7.6 through2: 3.0.2 - typescript: 4.8.4 + typescript: 5.9.2 vinyl: 2.2.1 vinyl-fs: 3.0.3 - dev: true - - /gulp/4.0.2: - resolution: - { - integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==, - } - engines: { node: '>= 0.10' } - hasBin: true + + gulp@4.0.2: dependencies: glob-watcher: 5.0.5 gulp-cli: 2.3.0 @@ -10204,201 +13547,93 @@ packages: vinyl-fs: 3.0.3 transitivePeerDependencies: - supports-color - dev: true - /gulplog/1.0.0: - resolution: - { - integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==, - } - engines: { node: '>= 0.10' } + gulplog@1.0.0: dependencies: glogg: 1.0.2 - dev: true - - /har-schema/2.0.0: - resolution: - { - integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==, - } - engines: { node: '>=4' } - dev: true - - /har-validator/5.1.5: - resolution: - { - integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==, - } - engines: { node: '>=6' } - deprecated: this library is no longer supported + + har-schema@2.0.0: {} + + har-validator@5.1.5: dependencies: ajv: 6.12.6 har-schema: 2.0.0 - dev: true - - /hard-rejection/2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: '>=6' } - dev: true - - /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' } - dev: true - - /has-flag/4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } - dev: true - - /has-property-descriptors/1.0.0: - resolution: - { - integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, - } - dependencies: - get-intrinsic: 1.1.3 - dev: true - - /has-symbols/1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: '>= 0.4' } - dev: true - - /has-tostringtag/1.0.0: - resolution: - { - integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, - } - engines: { node: '>= 0.4' } - dependencies: - has-symbols: 1.0.3 - dev: true - - /has-value/0.3.1: - resolution: - { - integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==, - } - engines: { node: '>=0.10.0' } + + hard-rejection@2.1.0: {} + + has-bigints@1.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: dependencies: get-value: 2.0.6 has-values: 0.1.4 isobject: 2.1.0 - dev: true - /has-value/1.0.0: - resolution: - { - integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==, - } - engines: { node: '>=0.10.0' } + has-value@1.0.0: dependencies: get-value: 2.0.6 has-values: 1.0.0 isobject: 3.0.1 - dev: true - - /has-values/0.1.4: - resolution: - { - integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /has-values/1.0.0: - resolution: - { - integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==, - } - engines: { node: '>=0.10.0' } + + has-values@0.1.4: {} + + has-values@1.0.0: dependencies: is-number: 3.0.0 kind-of: 4.0.0 - dev: true - /has/1.0.3: - resolution: - { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, - } - engines: { node: '>= 0.4.0' } + hash-base@2.0.2: dependencies: - function-bind: 1.1.1 - dev: true + inherits: 2.0.4 - /hash-base/3.1.0: - resolution: - { - integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, - } - engines: { node: '>=4' } + hash-base@3.0.5: dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 safe-buffer: 5.2.1 - dev: true - /hash.js/1.1.7: - resolution: - { - integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, - } + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: true - /hast-to-hyperscript/9.0.1: - resolution: - { - integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==, - } + hasown@2.0.2: dependencies: - '@types/unist': 2.0.6 + function-bind: 1.1.2 + + hast-to-hyperscript@9.0.1: + dependencies: + '@types/unist': 2.0.11 comma-separated-tokens: 1.0.8 property-information: 5.6.0 space-separated-tokens: 1.1.5 style-to-object: 0.3.0 unist-util-is: 4.1.0 web-namespaces: 1.1.4 - dev: true - /hast-util-from-dom/3.0.0: - resolution: - { - integrity: sha512-4vQuGiD5Y/wlD7fZiY4mZML/6oh0GOnH38UNyeDFcSTE4AHF0zjKHZfbd+ekVwPvsZXRl8choc99INHUwSPJlg==, - } + hast-util-from-dom@3.0.0: dependencies: hastscript: 6.0.0 web-namespaces: 1.1.4 - dev: true - /hast-util-from-parse5/6.0.1: - resolution: - { - integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==, - } + hast-util-from-parse5@6.0.1: dependencies: '@types/parse5': 5.0.3 hastscript: 6.0.0 @@ -10406,43 +13641,18 @@ packages: vfile: 4.2.1 vfile-location: 3.2.0 web-namespaces: 1.1.4 - dev: true - - /hast-util-has-property/1.0.4: - resolution: - { - integrity: sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==, - } - dev: true - - /hast-util-is-conditional-comment/1.0.4: - resolution: - { - integrity: sha512-rtULxWWknVeSuU/vsJ9tHo+M3ExyaOrZcWvLxqY2nUfCHbDcq60EJzSJC5zNm6ZlbxbJ8l7Ej8C1Kzsi5PJS1A==, - } - dev: true - - /hast-util-is-element/1.1.0: - resolution: - { - integrity: sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==, - } - dev: true - - /hast-util-parse-selector/2.2.5: - resolution: - { - integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==, - } - dev: true - - /hast-util-raw/6.1.0: - resolution: - { - integrity: sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==, - } - dependencies: - '@types/hast': 2.3.4 + + hast-util-has-property@1.0.4: {} + + hast-util-is-conditional-comment@1.0.4: {} + + hast-util-is-element@1.1.0: {} + + hast-util-parse-selector@2.2.5: {} + + hast-util-raw@6.1.0: + dependencies: + '@types/hast': 2.3.10 hast-util-from-parse5: 6.0.1 hast-util-to-parse5: 6.0.0 html-void-elements: 1.0.5 @@ -10453,13 +13663,8 @@ packages: web-namespaces: 1.1.4 xtend: 4.0.2 zwitch: 1.0.5 - dev: true - /hast-util-to-html/7.1.3: - resolution: - { - integrity: sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==, - } + hast-util-to-html@7.1.3: dependencies: ccount: 1.1.0 comma-separated-tokens: 1.0.8 @@ -10471,612 +13676,239 @@ packages: stringify-entities: 3.1.0 unist-util-is: 4.1.0 xtend: 4.0.2 - dev: true - /hast-util-to-parse5/6.0.0: - resolution: - { - integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==, - } + hast-util-to-parse5@6.0.0: dependencies: hast-to-hyperscript: 9.0.1 property-information: 5.6.0 web-namespaces: 1.1.4 xtend: 4.0.2 zwitch: 1.0.5 - dev: true - /hast-util-to-string/1.0.4: - resolution: - { - integrity: sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==, - } - dev: true + hast-util-to-string@1.0.4: {} - /hast-util-to-text/2.0.1: - resolution: - { - integrity: sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==, - } + hast-util-to-text@2.0.1: dependencies: hast-util-is-element: 1.1.0 repeat-string: 1.6.1 unist-util-find-after: 3.0.0 - dev: true - - /hast-util-whitespace/1.0.4: - resolution: - { - integrity: sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==, - } - dev: true - - /hastscript/6.0.0: - resolution: - { - integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==, - } - dependencies: - '@types/hast': 2.3.4 + + hast-util-whitespace@1.0.4: {} + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 comma-separated-tokens: 1.0.8 hast-util-parse-selector: 2.2.5 property-information: 5.6.0 space-separated-tokens: 1.1.5 - dev: true - - /he/1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - } - hasBin: true - dev: true - /history-with-query/4.10.4: - resolution: - { - integrity: sha512-JnskQK8X+PbRFHSdDAExhoJyhLnlLZL+UuHQuQhys+Se9/ukRDRBWU4JVTjsiIfbv1fcEmR3oqKW56OYmk5M5w==, - } + history-with-query@4.10.4: dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 loose-envify: 1.4.0 query-string: 6.14.1 resolve-pathname: 3.0.0 - tiny-invariant: 1.3.1 + tiny-invariant: 1.3.3 tiny-warning: 1.0.3 value-equal: 1.0.1 - dev: true - /history/4.10.1: - resolution: - { - integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==, - } + history@4.10.1: dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 loose-envify: 1.4.0 resolve-pathname: 3.0.0 - tiny-invariant: 1.3.1 + tiny-invariant: 1.3.3 tiny-warning: 1.0.3 value-equal: 1.0.1 - dev: true - /history/5.3.0: - resolution: - { - integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==, - } + history@5.3.0: dependencies: - '@babel/runtime': 7.19.4 - dev: true + '@babel/runtime': 7.28.3 - /hmac-drbg/1.0.1: - resolution: - { - integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, - } + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /hoist-non-react-statics/3.3.2: - resolution: - { - integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, - } + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: true - /homedir-polyfill/1.0.3: - resolution: - { - integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, - } - engines: { node: '>=0.10.0' } + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - - /hosted-git-info/2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } - dev: true - - /hosted-git-info/3.0.8: - resolution: - { - integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, - } - engines: { node: '>=10' } + + hosted-git-info@2.8.9: {} + + hosted-git-info@3.0.8: dependencies: lru-cache: 6.0.0 - dev: true - /hosted-git-info/4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: '>=10' } + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /html-element-map/1.3.1: - resolution: - { - integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==, - } + html-encoding-sniffer@2.0.1: dependencies: - array.prototype.filter: 1.0.1 - call-bind: 1.0.2 - dev: true + whatwg-encoding: 1.0.5 - /html-encoding-sniffer/2.0.1: - resolution: - { - integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==, - } - engines: { node: '>=10' } + html-encoding-sniffer@4.0.0: dependencies: - whatwg-encoding: 1.0.5 - dev: true - - /html-entities/2.3.3: - resolution: - { - integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==, - } - dev: true - - /html-escaper/2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } - dev: true - - /html-tags/3.2.0: - resolution: - { - integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==, - } - engines: { node: '>=8' } - dev: true - - /html-void-elements/1.0.5: - resolution: - { - integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==, - } - dev: true - - /htmlparser2/3.10.1: - resolution: - { - integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==, - } + whatwg-encoding: 3.1.1 + + html-entities@2.6.0: {} + + html-escaper@2.0.2: {} + + html-tags@3.3.1: {} + + html-void-elements@1.0.5: {} + + htmlparser2@3.10.1: dependencies: domelementtype: 1.3.1 domhandler: 2.4.2 domutils: 1.7.0 entities: 1.1.2 inherits: 2.0.4 - readable-stream: 3.6.0 - dev: true + readable-stream: 3.6.2 - /htmlparser2/8.0.1: - resolution: - { - integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.0.1 - entities: 4.4.0 - dev: true - - /http-cache-semantics/3.8.1: - resolution: - { - integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==, - } - dev: true - - /http-proxy-agent/2.1.0: - resolution: - { - integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==, - } - engines: { node: '>= 4.5.0' } + http-cache-semantics@3.8.1: {} + + http-proxy-agent@2.1.0: dependencies: agent-base: 4.3.0 debug: 3.1.0 transitivePeerDependencies: - supports-color - dev: true - /http-proxy-agent/4.0.1: - resolution: - { - integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, - } - engines: { node: '>= 6' } + http-proxy-agent@4.0.1: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color - dev: true - /http-signature/1.2.0: - resolution: - { - integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==, - } - engines: { node: '>=0.8', npm: '>=1.3.7' } + http-signature@1.2.0: dependencies: assert-plus: 1.0.0 jsprim: 1.4.2 - sshpk: 1.17.0 - dev: true - - /https-browserify/1.0.0: - resolution: - { - integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==, - } - dev: true - - /https-proxy-agent/2.2.4: - resolution: - { - integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==, - } - engines: { node: '>= 4.5.0' } + sshpk: 1.18.0 + + https-browserify@1.0.0: {} + + https-proxy-agent@2.2.4: dependencies: agent-base: 4.3.0 debug: 3.2.7 transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent/5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: '>= 6' } + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color - dev: true - - /human-signals/1.1.1: - resolution: - { - integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==, - } - engines: { node: '>=8.12.0' } - dev: true - - /human-signals/2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: '>=10.17.0' } - dev: true - - /humanize-ms/1.2.1: - resolution: - { - integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, - } + + human-signals@1.1.1: {} + + human-signals@2.1.0: {} + + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: true - - /humps/2.0.1: - resolution: - { - integrity: sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g==, - } - dev: true - - /husky/8.0.1: - resolution: - { - integrity: sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==, - } - engines: { node: '>=14' } - hasBin: true - dev: true - - /hyphenate-style-name/1.0.4: - resolution: - { - integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==, - } - dev: true - - /iconv-lite/0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: '>=0.10.0' } + + humps@2.0.1: {} + + husky@8.0.3: {} + + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite/0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: '>=0.10.0' } + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - - /ieee754/1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - dev: true - - /iferr/0.1.5: - resolution: - { - integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==, - } - dev: true - - /ignore/4.0.6: - resolution: - { - integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==, - } - engines: { node: '>= 4' } - dev: true - - /ignore/5.2.0: - resolution: - { - integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==, - } - engines: { node: '>= 4' } - dev: true - - /image-size/0.8.3: - resolution: - { - integrity: sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==, - } - engines: { node: '>=6.9.0' } - hasBin: true + + ieee754@1.2.1: {} + + iferr@0.1.5: {} + + ignore@4.0.6: {} + + ignore@5.3.2: {} + + image-size@0.8.3: dependencies: queue: 6.0.1 - dev: true - - /immutable/4.1.0: - resolution: - { - integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==, - } - dev: true - - /import-cwd/2.1.0: - resolution: - { - integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==, - } - engines: { node: '>=4' } + + import-cwd@2.1.0: dependencies: import-from: 2.1.0 - dev: true - /import-fresh/2.0.0: - resolution: - { - integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==, - } - engines: { node: '>=4' } + import-fresh@2.0.0: dependencies: caller-path: 2.0.0 resolve-from: 3.0.0 - dev: true - /import-fresh/3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: '>=6' } + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-from/2.1.0: - resolution: - { - integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==, - } - engines: { node: '>=4' } + import-from@2.1.0: dependencies: resolve-from: 3.0.0 - dev: true - - /import-lazy/2.1.0: - resolution: - { - integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==, - } - engines: { node: '>=4' } - dev: true - - /import-lazy/4.0.0: - resolution: - { - integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, - } - engines: { node: '>=8' } - dev: true - - /import-local/2.0.0: - resolution: - { - integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==, - } - engines: { node: '>=6' } - hasBin: true - dependencies: - pkg-dir: 3.0.0 - resolve-cwd: 2.0.0 - dev: true - /import-local/3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - } - engines: { node: '>=8' } - hasBin: true + import-lazy@2.1.0: {} + + import-lazy@4.0.0: {} + + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true - - /import-modules/2.1.0: - resolution: - { - integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==, - } - engines: { node: '>=8' } - 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 - - /indexes-of/1.0.1: - resolution: - { - integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==, - } - dev: true - - /infer-owner/1.0.4: - resolution: - { - integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, - } - dev: true - - /inflight/1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + + import-modules@2.1.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indexes-of@1.0.1: {} + + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - - /inherits/2.0.1: - resolution: - { - integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==, - } - 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==, - } - dev: true - - /ini/1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: true - - /inline-style-parser/0.1.1: - resolution: - { - integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==, - } - dev: true - - /inline-style-prefixer/6.0.1: - resolution: - { - integrity: sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==, - } - dependencies: - css-in-js-utils: 2.0.1 - dev: true - - /inquirer/6.5.2: - resolution: - { - integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==, - } - engines: { node: '>=6.0.0' } + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inline-style-parser@0.1.1: {} + + inquirer@6.5.2: dependencies: ansi-escapes: 3.2.0 chalk: 2.4.2 @@ -11091,1910 +13923,575 @@ packages: string-width: 2.1.1 strip-ansi: 5.2.0 through: 2.3.8 - dev: true - - /internal-slot/1.0.3: - resolution: - { - integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==, - } - engines: { node: '>= 0.4' } - dependencies: - get-intrinsic: 1.1.3 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /interpret/1.4.0: - resolution: - { - integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, - } - engines: { node: '>= 0.10' } - dev: true - - /intersection-observer/0.12.2: - resolution: - { - integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==, - } - dev: false - - /invert-kv/1.0.0: - resolution: - { - integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /invert-kv/3.0.1: - resolution: - { - integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==, - } - engines: { node: '>=8' } - dev: true - - /ip/1.1.8: - resolution: - { - integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, - } - dev: true - - /irregular-plurals/3.3.0: - resolution: - { - integrity: sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==, - } - engines: { node: '>=8' } - dev: true - - /is-absolute/1.0.0: - resolution: - { - integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==, - } - engines: { node: '>=0.10.0' } + + internal-slot@1.1.0: dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: true + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@1.4.0: {} + + interpret@3.1.1: {} + + intersection-observer@0.12.2: {} + + invert-kv@1.0.0: {} + + invert-kv@3.0.1: {} - /is-accessor-descriptor/0.1.6: - resolution: - { - integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==, - } - engines: { node: '>=0.10.0' } + ip@1.1.9: {} + + irregular-plurals@3.5.0: {} + + is-absolute@1.0.0: dependencies: - kind-of: 3.2.2 - dev: true + is-relative: 1.0.0 + is-windows: 1.0.2 - /is-accessor-descriptor/1.0.0: - resolution: - { - integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==, - } - engines: { node: '>=0.10.0' } + is-accessor-descriptor@1.0.1: dependencies: - kind-of: 6.0.3 - dev: true + hasown: 2.0.2 - /is-alphabetical/1.0.4: - resolution: - { - integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==, - } - dev: true + is-alphabetical@1.0.4: {} - /is-alphanumerical/1.0.4: - resolution: - { - integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==, - } + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.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-binary-path/1.0.1: - resolution: - { - integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==, - } - engines: { node: '>=0.10.0' } + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@1.0.1: dependencies: binary-extensions: 1.13.1 - dev: true - - /is-binary-path/2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object/1.1.2: - resolution: - { - integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-buffer/1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } - dev: true - - /is-buffer/2.0.5: - resolution: - { - integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, - } - engines: { node: '>=4' } - dev: true - - /is-callable/1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: '>= 0.4' } - dev: true - - /is-ci/1.2.1: - resolution: - { - integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==, - } - hasBin: true + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-ci@1.2.1: dependencies: ci-info: 1.6.0 - dev: true - /is-core-module/2.10.0: - resolution: - { - integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==, - } + is-core-module@2.16.1: dependencies: - has: 1.0.3 - dev: true + hasown: 2.0.2 - /is-data-descriptor/0.1.4: - resolution: - { - integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==, - } - engines: { node: '>=0.10.0' } + is-data-descriptor@1.0.1: dependencies: - kind-of: 3.2.2 - dev: true + hasown: 2.0.2 - /is-data-descriptor/1.0.0: - resolution: - { - integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==, - } - engines: { node: '>=0.10.0' } + is-data-view@1.0.2: dependencies: - kind-of: 6.0.3 - dev: true - - /is-date-object/1.0.5: - resolution: - { - integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, - } - engines: { node: '>= 0.4' } - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-decimal/1.0.4: - resolution: - { - integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==, - } - dev: true - - /is-descriptor/0.1.6: - resolution: - { - integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==, - } - engines: { node: '>=0.10.0' } - dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 - dev: true + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - /is-descriptor/1.0.2: - resolution: - { - integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==, - } - engines: { node: '>=0.10.0' } + is-date-object@1.1.0: dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.3 - dev: true - - /is-directory/0.3.1: - resolution: - { - integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-docker/2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } - hasBin: true - dev: true - - /is-domain/0.0.1: - resolution: - { - integrity: sha512-hLm9uZUDm/sk0+xZgxyJluSf4B37sg3ivzv4ndTxNCAMnWFUUsHh1u4eh2maEcEvQl3mc65a9pJ/KURGItbLIg==, - } - dev: true - - /is-extendable/0.1.1: - resolution: - { - integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-extendable/1.0.1: - resolution: - { - integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==, - } - engines: { node: '>=0.10.0' } + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-directory@0.3.1: {} + + is-docker@2.2.1: {} + + is-domain@0.0.1: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: dependencies: is-plain-object: 2.0.4 - dev: true - - /is-extglob/2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-fullwidth-code-point/1.0.0: - resolution: - { - integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==, - } - engines: { node: '>=0.10.0' } + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point/2.0.0: - resolution: - { - integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, - } - engines: { node: '>=4' } - 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-glob/3.1.0: - resolution: - { - integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==, - } - engines: { node: '>=0.10.0' } + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@3.1.0: dependencies: is-extglob: 2.1.1 - dev: true - /is-glob/4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - - /is-hexadecimal/1.0.4: - resolution: - { - integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==, - } - dev: true - - /is-installed-globally/0.1.0: - resolution: - { - integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==, - } - engines: { node: '>=4' } + + is-hexadecimal@1.0.4: {} + + is-installed-globally@0.1.0: dependencies: global-dirs: 0.1.1 is-path-inside: 1.0.1 - dev: true - - /is-negated-glob/1.0.0: - resolution: - { - integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-negative-zero/2.0.2: - resolution: - { - integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, - } - engines: { node: '>= 0.4' } - dev: true - - /is-npm/1.0.0: - resolution: - { - integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-number-object/1.0.7: - resolution: - { - integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, - } - engines: { node: '>= 0.4' } - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number/3.0.0: - resolution: - { - integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, - } - engines: { node: '>=0.10.0' } + + is-map@2.0.3: {} + + is-negated-glob@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-npm@1.0.0: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@3.0.0: dependencies: kind-of: 3.2.2 - dev: true - - /is-number/4.0.0: - resolution: - { - integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-number/7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } - dev: true - - /is-obj/1.0.1: - resolution: - { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-obj/2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: '>=8' } - dev: true - - /is-path-cwd/2.2.0: - resolution: - { - integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==, - } - engines: { node: '>=6' } - dev: true - - /is-path-inside/1.0.1: - resolution: - { - integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==, - } - engines: { node: '>=0.10.0' } + + is-number@4.0.0: {} + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-obj@2.0.0: {} + + is-path-cwd@2.2.0: {} + + is-path-inside@1.0.1: dependencies: path-is-inside: 1.0.2 - dev: true - - /is-path-inside/3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: '>=8' } - dev: true - - /is-plain-obj/1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-plain-obj/2.1.0: - resolution: - { - integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, - } - engines: { node: '>=8' } - dev: true - - /is-plain-object/2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: '>=0.10.0' } + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - dev: true - - /is-plain-object/5.0.0: - resolution: - { - integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-potential-custom-element-name/1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } - dev: true - - /is-redirect/1.0.0: - resolution: - { - integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-regex/1.1.4: - resolution: - { - integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-regexp/1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-regexp/2.1.0: - resolution: - { - integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==, - } - engines: { node: '>=6' } - dev: true - - /is-relative/1.0.0: - resolution: - { - integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==, - } - engines: { node: '>=0.10.0' } + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-redirect@1.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-regexp@1.0.0: {} + + is-regexp@2.1.0: {} + + is-relative@1.0.0: dependencies: is-unc-path: 1.0.0 - dev: true - - /is-retry-allowed/1.2.0: - resolution: - { - integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-shared-array-buffer/1.0.2: - resolution: - { - integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, - } - dependencies: - call-bind: 1.0.2 - dev: true - - /is-stream/1.1.0: - resolution: - { - integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, - } - engines: { node: '>=0.10.0' } - 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.0 - dev: true - - /is-subset/0.1.1: - resolution: - { - integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==, - } - 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-text-path/1.0.1: - resolution: - { - integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, - } - engines: { node: '>=0.10.0' } + + is-retry-allowed@1.2.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - dev: true - - /is-typedarray/1.0.0: - resolution: - { - integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, - } - dev: true - - /is-unc-path/1.0.0: - resolution: - { - integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==, - } - engines: { node: '>=0.10.0' } + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-typedarray@1.0.0: {} + + is-unc-path@1.0.0: dependencies: unc-path-regex: 0.1.2 - dev: true - - /is-unicode-supported/0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: '>=10' } - dev: true - - /is-utf8/0.2.1: - resolution: - { - integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, - } - dev: true - - /is-valid-glob/1.0.0: - resolution: - { - integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-weakref/1.0.2: - resolution: - { - integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, - } - dependencies: - call-bind: 1.0.2 - dev: true - - /is-windows/0.2.0: - resolution: - { - integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-windows/1.0.2: - resolution: - { - integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /is-wsl/1.1.0: - resolution: - { - integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==, - } - engines: { node: '>=4' } - dev: true - - /is-wsl/2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } + + is-unicode-supported@0.1.0: {} + + is-utf8@0.2.1: {} + + is-valid-glob@1.0.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-windows@0.2.0: {} + + is-windows@1.0.2: {} + + is-wsl@1.1.0: {} + + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - - /isarray/0.0.1: - resolution: - { - integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, - } - dev: true - - /isarray/1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } - dev: true - - /isexe/2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - dev: true - - /isobject/2.1.0: - resolution: - { - integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==, - } - engines: { node: '>=0.10.0' } + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: dependencies: isarray: 1.0.0 - dev: true - - /isobject/3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /isomorphic-fetch/2.2.1: - resolution: - { - integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==, - } - dependencies: - node-fetch: 1.7.3 - whatwg-fetch: 3.6.2 - dev: true - - /isstream/0.1.2: - resolution: - { - integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==, - } - dev: true - - /istanbul-lib-coverage/3.2.0: - resolution: - { - integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==, - } - engines: { node: '>=8' } - dev: true - - /istanbul-lib-instrument/5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - } - engines: { node: '>=8' } - dependencies: - '@babel/core': 7.19.3 - '@babel/parser': 7.19.4 + + isobject@3.0.1: {} + + isstream@0.1.2: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report/3.0.0: - resolution: - { - integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==, - } - engines: { node: '>=8' } + istanbul-lib-report@3.0.1: dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + 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' } + istanbul-lib-source-maps@5.0.6: dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 + '@jridgewell/trace-mapping': 0.3.30 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports/3.1.5: - resolution: - { - integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, - } - engines: { node: '>=8' } + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true + istanbul-lib-report: 3.0.1 - /istextorbinary/2.6.0: - resolution: - { - integrity: sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==, - } - engines: { node: '>=0.12' } + istextorbinary@2.6.0: dependencies: binaryextensions: 2.3.0 editions: 2.3.1 textextensions: 2.6.0 - dev: true - - /javascript-stringify/2.1.0: - resolution: - { - integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==, - } - dev: true - - /jest-changed-files/27.5.1: - resolution: - { - integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - execa: 5.1.1 - throat: 6.0.1 - dev: true - - /jest-circus/27.5.1: - resolution: - { - integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli/27.5.1_ts-node@10.9.1: - resolution: - { - integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1_ts-node@10.9.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.10 - import-local: 3.1.0 - jest-config: 27.5.1_ts-node@10.9.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - 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 } - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.19.3 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.19.3 - chalk: 4.1.2 - ci-info: 3.5.0 - deepmerge: 4.2.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1_jcmx33t3olsvcxopqdljsohpme - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /jest-diff/27.5.1: - resolution: - { - integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + iterator.prototype@1.1.5: dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-diff/28.1.3: - resolution: - { - integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - dependencies: - chalk: 4.1.2 - diff-sequences: 28.1.1 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 - dev: true - - /jest-docblock/27.5.1: - resolution: - { - integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - detect-newline: 3.1.0 - dev: true + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 - /jest-each/27.5.1: - resolution: - { - integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + jackspeak@3.4.3: dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - jest-get-type: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-environment-jsdom/27.5.1: - resolution: - { - integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - jest-mock: 27.5.1 - jest-util: 27.5.1 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-environment-node/27.5.1: - resolution: - { - integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /jest-fetch-mock/3.0.3: - resolution: - { - integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==, - } - dependencies: - cross-fetch: 3.1.5 - promise-polyfill: 8.2.3 - transitivePeerDependencies: - - encoding - dev: true - - /jest-get-type/27.5.1: - resolution: - { - integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dev: true - - /jest-get-type/28.0.2: - resolution: - { - integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - dev: true - - /jest-haste-map/27.5.1: - resolution: - { - integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.5 - '@types/node': 18.8.4 - anymatch: 3.1.2 - fb-watchman: 2.0.2 - graceful-fs: 4.2.10 - jest-regex-util: 27.5.1 - jest-serializer: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - micromatch: 4.0.5 - walker: 1.0.8 + '@isaacs/cliui': 8.0.2 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-jasmine2/27.5.1: - resolution: - { - integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/environment': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - chalk: 4.1.2 - co: 4.6.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-leak-detector/27.5.1: - resolution: - { - integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-localstorage-mock/2.4.22: - resolution: - { - integrity: sha512-60PWSDFQOS5v7JzSmYLM3dPLg0JLl+2Vc4lIEz/rj2yrXJzegsFLn7anwc5IL0WzJbBa/Las064CHbFg491/DQ==, - } - engines: { node: '>=6.16.0' } - dev: true - - /jest-matcher-utils/27.5.1: - resolution: - { - integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-message-util/27.5.1: - resolution: - { - integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 27.5.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - - /jest-mock/27.5.1: - resolution: - { - integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - dev: true - - /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: - resolution: - { - integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==, - } - engines: { node: '>=6' } - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 27.5.1 - dev: true - - /jest-regex-util/27.5.1: - resolution: - { - integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dev: true - - /jest-resolve-dependencies/27.5.1: - resolution: - { - integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - jest-regex-util: 27.5.1 - jest-snapshot: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve/27.5.1: - resolution: - { - integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - resolve: 1.22.1 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - - /jest-runner/27.5.1: - resolution: - { - integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/console': 27.5.1 - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - chalk: 4.1.2 - emittery: 0.8.1 - graceful-fs: 4.2.10 - jest-docblock: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-haste-map: 27.5.1 - jest-leak-detector: 27.5.1 - jest-message-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runtime: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - source-map-support: 0.5.21 - throat: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-runtime/27.5.1: - resolution: - { - integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/globals': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - execa: 5.1.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-serializer/27.5.1: - resolution: - { - integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@types/node': 18.8.4 - graceful-fs: 4.2.10 - dev: true - - /jest-snapshot/27.5.1: - resolution: - { - integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@babel/core': 7.19.3 - '@babel/generator': 7.19.5 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.3 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__traverse': 7.18.2 - '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3 - chalk: 4.1.2 - expect: 27.5.1 - graceful-fs: 4.2.10 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - jest-haste-map: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - natural-compare: 1.4.0 - pretty-format: 27.5.1 - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - dev: true + '@pkgjs/parseargs': 0.11.0 - /jest-util/27.5.1: - resolution: - { - integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - chalk: 4.1.2 - ci-info: 3.5.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true + javascript-stringify@2.1.0: {} - /jest-validate/27.5.1: - resolution: - { - integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/types': 27.5.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 27.5.1 - leven: 3.1.0 - pretty-format: 27.5.1 - dev: true - - /jest-watcher/27.5.1: - resolution: - { - integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - dependencies: - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.8.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest-util: 27.5.1 - string-length: 4.0.2 - dev: true - - /jest-websocket-mock/2.4.0: - resolution: - { - integrity: sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==, - } - dependencies: - jest-diff: 28.1.3 - mock-socket: 9.1.5 - dev: true - - /jest-worker/24.9.0: - resolution: - { - integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==, - } - engines: { node: '>= 6' } + jest-worker@24.9.0: dependencies: merge-stream: 2.0.0 supports-color: 6.1.0 - dev: true - /jest-worker/26.6.2: - resolution: - { - integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, - } - engines: { node: '>= 10.13.0' } + jest-worker@26.6.2: dependencies: - '@types/node': 18.8.4 + '@types/node': 24.3.0 merge-stream: 2.0.0 supports-color: 7.2.0 - dev: true - /jest-worker/27.5.1: - resolution: - { - integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, - } - engines: { node: '>= 10.13.0' } + jest-worker@27.5.1: dependencies: - '@types/node': 18.8.4 + '@types/node': 24.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - - /jest/27.5.1_ts-node@10.9.1: - resolution: - { - integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1_ts-node@10.9.1 - import-local: 3.1.0 - jest-cli: 27.5.1_ts-node@10.9.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /js-cookie/2.2.1: - resolution: - { - integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==, - } - - /js-tokens/4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - - /js-yaml/3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } - hasBin: true + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml/4.0.0: - resolution: - { - integrity: sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==, - } - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - - /jsbn/0.1.1: - resolution: - { - integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==, - } - dev: true - - /jsdom/16.7.0: - resolution: - { - integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==, - } - engines: { node: '>=10' } - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true + + jsbn@0.1.1: {} + + jsdom@16.7.0: dependencies: abab: 2.0.6 - acorn: 8.8.0 + acorn: 8.15.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.4.1 + decimal.js: 10.6.0 domexception: 2.0.1 - escodegen: 2.0.0 - form-data: 3.0.1 + escodegen: 2.1.0 + form-data: 3.0.4 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.2 + nwsapi: 2.2.21 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 - tough-cookie: 4.1.2 + tough-cookie: 4.1.4 w3c-hr-time: 1.0.2 w3c-xmlserializer: 2.0.0 webidl-conversions: 6.1.0 whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.9 + ws: 7.5.10 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - 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 - - /json-parse-better-errors/1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } - dev: true - - /json-parse-even-better-errors/2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } - dev: true - - /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==, - } - dev: true - - /json-schema/0.4.0: - resolution: - { - integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, - } - dev: true - - /json-stable-stringify-without-jsonify/1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - dev: true - - /json-stringify-safe/5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } - dev: true - - /json2mq/0.2.0: - resolution: - { - integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==, - } + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.21 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@2.5.2: {} + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json2mq@0.2.0: dependencies: string-convert: 0.2.1 - dev: true - /json5/1.0.1: - resolution: - { - integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==, - } - hasBin: true + json5@1.0.2: dependencies: - minimist: 1.2.7 - dev: true + minimist: 1.2.8 - /json5/2.2.1: - resolution: - { - integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==, - } - engines: { node: '>=6' } - hasBin: true - dev: true + json5@2.2.3: {} - /jsonfile/3.0.1: - resolution: - { - integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==, - } + jsonfile@3.0.1: optionalDependencies: - graceful-fs: 4.2.10 - dev: true + graceful-fs: 4.2.11 - /jsonfile/6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } + jsonfile@6.2.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: - graceful-fs: 4.2.10 - dev: true - - /jsonparse/1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { '0': node >= 0.2.0 } - dev: true - - /jsprim/1.4.2: - resolution: - { - integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==, - } - engines: { node: '>=0.6.0' } + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + jsprim@1.4.2: dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 json-schema: 0.4.0 verror: 1.10.0 - dev: true - - /jsx-ast-utils/3.3.3: - resolution: - { - integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==, - } - engines: { node: '>=4.0' } - dependencies: - array-includes: 3.1.5 - object.assign: 4.1.4 - dev: true - - /just-debounce/1.1.0: - resolution: - { - integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==, - } - dev: true - - /katex/0.12.0: - resolution: - { - integrity: sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==, - } - hasBin: true + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + just-debounce@1.1.0: {} + + katex@0.12.0: dependencies: commander: 2.20.3 - dev: true - - /kebab-case/1.0.2: - resolution: - { - integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==, - } - dev: true - - /kind-of/3.2.2: - resolution: - { - integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, - } - engines: { node: '>=0.10.0' } + + kebab-case@1.0.2: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 - dev: true - /kind-of/4.0.0: - resolution: - { - integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==, - } - engines: { node: '>=0.10.0' } + kind-of@4.0.0: dependencies: is-buffer: 1.1.6 - dev: true - - /kind-of/5.1.0: - resolution: - { - integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /kind-of/6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /kleur/3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } - dev: true - - /known-css-properties/0.21.0: - resolution: - { - integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==, - } - dev: true - - /last-run/1.1.1: - resolution: - { - integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==, - } - engines: { node: '>= 0.10' } + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + known-css-properties@0.21.0: {} + + last-run@1.1.1: dependencies: default-resolution: 2.0.0 es6-weak-map: 2.0.3 - dev: true - /latest-version/3.1.0: - resolution: - { - integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==, - } - engines: { node: '>=4' } + latest-version@3.1.0: dependencies: package-json: 4.0.1 - dev: true - - /lazy-cache/1.0.4: - resolution: - { - integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /lazystream/1.0.1: - resolution: - { - integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, - } - engines: { node: '>= 0.6.3' } - dependencies: - readable-stream: 2.3.7 - dev: true - - /lcid/1.0.0: - resolution: - { - integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==, - } - engines: { node: '>=0.10.0' } + + lazy-cache@1.0.4: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lcid@1.0.0: dependencies: invert-kv: 1.0.0 - dev: true - /lcid/3.1.1: - resolution: - { - integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==, - } - engines: { node: '>=8' } + lcid@3.1.1: dependencies: invert-kv: 3.0.1 - dev: true - /lcov-parse/1.0.0: - resolution: - { - integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==, - } - hasBin: true - dev: true + lcov-parse@1.0.0: {} - /lead/1.0.0: - resolution: - { - integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==, - } - engines: { node: '>= 0.10' } + lead@1.0.0: dependencies: flush-write-stream: 1.1.1 - dev: true - - /leven/3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: '>=6' } - dev: true - - /levn/0.3.0: - resolution: - { - integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, - } - engines: { node: '>= 0.8.0' } - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - - /levn/0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } + + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /liftoff/3.1.0: - resolution: - { - integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==, - } - engines: { node: '>= 0.8' } + liftoff@3.1.0: dependencies: extend: 3.0.2 findup-sync: 3.0.0 @@ -13003,323 +14500,140 @@ packages: is-plain-object: 2.0.4 object.map: 1.0.1 rechoir: 0.6.2 - resolve: 1.22.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - dev: true - - /lines-and-columns/1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } - dev: true - - /load-json-file/1.1.0: - resolution: - { - integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==, - } - engines: { node: '>=0.10.0' } - dependencies: - graceful-fs: 4.2.10 + + lines-and-columns@1.2.4: {} + + load-json-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 - dev: true - - /loader-runner/2.4.0: - resolution: - { - integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==, - } - engines: { node: '>=4.3.0 <5.0.0 || >=5.10' } - dev: true - - /loader-utils/1.4.0: - resolution: - { - integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==, - } - engines: { node: '>=4.0.0' } - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.1 - dev: true - /loader-utils/2.0.2: - resolution: - { - integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==, - } - engines: { node: '>=8.9.0' } + loader-runner@4.3.0: {} + + loader-utils@1.4.2: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.1 - dev: true - - /locate-path/3.0.0: - resolution: - { - integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, - } - engines: { node: '>=6' } - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path/5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: '>=8' } + json5: 1.0.2 + + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path/6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - - /lodash.clonedeep/4.5.0: - resolution: - { - integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, - } - dev: true - - /lodash.debounce/4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } - dev: true - - /lodash.escape/4.0.1: - resolution: - { - integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==, - } - dev: true - - /lodash.flattendeep/4.4.0: - resolution: - { - integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, - } - dev: true - - /lodash.get/4.4.2: - resolution: - { - integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, - } - dev: true - - /lodash.isequal/4.5.0: - resolution: - { - integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, - } - 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.throttle/4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /lodash.truncate/4.4.2: - resolution: - { - integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, - } - dev: true - - /lodash.zip/4.2.0: - resolution: - { - integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==, - } - dev: true - - /lodash/4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - - /log-driver/1.2.7: - resolution: - { - integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==, - } - engines: { node: '>=0.8.6' } - dev: true - - /log-symbols/2.2.0: - resolution: - { - integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==, - } - engines: { node: '>=4' } - dependencies: - chalk: 2.4.2 - dev: true - /log-symbols/4.0.0: - resolution: - { - integrity: sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==, - } - engines: { node: '>=10' } + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.curry@4.1.1: {} + + lodash.debounce@4.0.8: {} + + lodash.flow@3.5.0: {} + + lodash.get@4.4.2: {} + + lodash.isfunction@3.0.9: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.throttle@4.1.1: {} + + lodash.truncate@4.4.2: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash.zip@4.2.0: {} + + lodash@4.17.21: {} + + log-driver@1.2.7: {} + + log-symbols@2.2.0: dependencies: - chalk: 4.1.2 - dev: true + chalk: 2.4.2 - /log-symbols/4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: '>=10' } + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - - /longest-streak/2.0.4: - resolution: - { - integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==, - } - dev: true - - /loose-envify/1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } - hasBin: true + + longest-streak@2.0.4: {} + + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /lowercase-keys/1.0.1: - resolution: - { - integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==, - } - engines: { node: '>=0.10.0' } - dev: true + loupe@3.2.1: {} + + lowercase-keys@1.0.1: {} + + lru-cache@10.4.3: {} - /lru-cache/4.1.5: - resolution: - { - integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, - } + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: true - /lru-cache/5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache/6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: '>=10' } + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lz-string/1.4.4: - resolution: - { - integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==, - } - hasBin: true - dev: true + lz-string@1.5.0: {} + + magic-string@0.30.18: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + source-map-js: 1.2.1 - /make-dir/1.3.0: - resolution: - { - integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==, - } - engines: { node: '>=4' } + make-dir@1.3.0: dependencies: pify: 3.0.0 - dev: true - /make-dir/2.1.0: - resolution: - { - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, - } - engines: { node: '>=6' } + make-dir@2.1.0: dependencies: pify: 4.0.1 - semver: 5.7.1 - dev: true - - /make-dir/3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: '>=8' } - dependencies: - semver: 6.3.0 - dev: true - - /make-error/1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } - dev: true - - /make-fetch-happen/2.6.0: - resolution: - { - integrity: sha512-FFq0lNI0ax+n9IWzWpH8A4JdgYiAp2DDYIZ3rsaav8JDe8I+72CzK6PQW/oom15YDZpV5bYW/9INd6nIJ2ZfZw==, - } - dependencies: - agentkeepalive: 3.5.2 + semver: 5.7.2 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + make-error@1.3.6: {} + + make-fetch-happen@2.6.0: + dependencies: + agentkeepalive: 3.5.3 cacache: 10.0.4 http-cache-semantics: 3.8.1 http-proxy-agent: 2.1.0 @@ -13332,215 +14646,101 @@ packages: ssri: 5.3.0 transitivePeerDependencies: - supports-color - dev: true - /make-iterator/1.0.1: - resolution: - { - integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==, - } - engines: { node: '>=0.10.0' } + make-iterator@1.0.1: dependencies: kind-of: 6.0.3 - dev: true - - /makeerror/1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } - dependencies: - tmpl: 1.0.5 - dev: true - /map-age-cleaner/0.1.3: - resolution: - { - integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==, - } - engines: { node: '>=6' } + map-age-cleaner@0.1.3: dependencies: p-defer: 1.0.0 - dev: true - - /map-cache/0.2.2: - resolution: - { - integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /map-obj/1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /map-obj/4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: '>=8' } - dev: true - - /map-visit/1.0.0: - resolution: - { - integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==, - } - engines: { node: '>=0.10.0' } + + map-cache@0.2.2: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + map-visit@1.0.0: dependencies: object-visit: 1.0.1 - dev: true - /markdown-table/2.0.0: - resolution: - { - integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==, - } + markdown-table@2.0.0: dependencies: repeat-string: 1.6.1 - dev: true - /matchdep/2.0.0: - resolution: - { - integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==, - } - engines: { node: '>= 0.10.0' } + matchdep@2.0.0: dependencies: findup-sync: 2.0.0 micromatch: 3.1.10 - resolve: 1.22.1 + resolve: 1.22.10 stack-trace: 0.0.10 transitivePeerDependencies: - supports-color - dev: true - /mathjax-full/3.2.2: - resolution: - { - integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==, - } + math-intrinsics@1.1.0: {} + + mathjax-full@3.2.2: dependencies: esm: 3.2.25 - mhchemparser: 4.1.1 + mhchemparser: 4.2.1 mj-context-menu: 0.6.1 - speech-rule-engine: 4.0.7 - dev: true - - /mathml-tag-names/2.1.3: - resolution: - { - integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==, - } - dev: true - - /md5.js/1.3.5: - resolution: - { - integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, - } - dependencies: - hash-base: 3.1.0 + speech-rule-engine: 4.1.2 + + mathml-tag-names@2.1.3: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.0.5 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /mdast-util-definitions/4.0.0: - resolution: - { - integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==, - } + mdast-util-definitions@4.0.0: dependencies: unist-util-visit: 2.0.3 - dev: true - /mdast-util-find-and-replace/1.1.1: - resolution: - { - integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==, - } + mdast-util-find-and-replace@1.1.1: dependencies: escape-string-regexp: 4.0.0 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: true - /mdast-util-from-markdown/0.8.5: - resolution: - { - integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==, - } + mdast-util-from-markdown@0.8.5: dependencies: - '@types/mdast': 3.0.10 + '@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-frontmatter/0.2.0: - resolution: - { - integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==, - } + mdast-util-frontmatter@0.2.0: dependencies: micromark-extension-frontmatter: 0.2.2 - dev: true - /mdast-util-gfm-autolink-literal/0.1.3: - resolution: - { - integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==, - } + mdast-util-gfm-autolink-literal@0.1.3: dependencies: ccount: 1.1.0 mdast-util-find-and-replace: 1.1.1 micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-gfm-strikethrough/0.2.3: - resolution: - { - integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==, - } + mdast-util-gfm-strikethrough@0.2.3: dependencies: mdast-util-to-markdown: 0.6.5 - dev: true - /mdast-util-gfm-table/0.1.6: - resolution: - { - integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==, - } + mdast-util-gfm-table@0.1.6: dependencies: markdown-table: 2.0.0 mdast-util-to-markdown: 0.6.5 - dev: true - /mdast-util-gfm-task-list-item/0.1.6: - resolution: - { - integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==, - } + mdast-util-gfm-task-list-item@0.1.6: dependencies: mdast-util-to-markdown: 0.6.5 - dev: true - /mdast-util-gfm/0.1.2: - resolution: - { - integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==, - } + mdast-util-gfm@0.1.2: dependencies: mdast-util-gfm-autolink-literal: 0.1.3 mdast-util-gfm-strikethrough: 0.2.3 @@ -13549,120 +14749,53 @@ packages: mdast-util-to-markdown: 0.6.5 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-math/0.1.2: - resolution: - { - integrity: sha512-fogAitds+wH+QRas78Yr1TwmQGN4cW/G2WRw5ePuNoJbBSPJCxIOCE8MTzHgWHVSpgkRaPQTgfzXRE1CrwWSlg==, - } + mdast-util-math@0.1.2: dependencies: longest-streak: 2.0.4 mdast-util-to-markdown: 0.6.5 repeat-string: 1.6.1 - dev: true - /mdast-util-to-hast/10.2.0: - resolution: - { - integrity: sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==, - } + mdast-util-to-hast@10.2.0: dependencies: - '@types/mdast': 3.0.10 - '@types/unist': 2.0.6 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 mdast-util-definitions: 4.0.0 mdurl: 1.0.1 unist-builder: 2.0.3 unist-util-generated: 1.1.6 unist-util-position: 3.1.0 unist-util-visit: 2.0.3 - dev: true - /mdast-util-to-markdown/0.6.5: - resolution: - { - integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==, - } + mdast-util-to-markdown@0.6.5: dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.11 longest-streak: 2.0.4 mdast-util-to-string: 2.0.0 parse-entities: 2.0.0 repeat-string: 1.6.1 zwitch: 1.0.5 - dev: true - - /mdast-util-to-string/2.0.0: - resolution: - { - integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==, - } - dev: true - - /mdn-data/2.0.14: - resolution: - { - integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, - } - dev: true - - /mdurl/1.0.1: - resolution: - { - integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==, - } - dev: true - - /mem/5.1.1: - resolution: - { - integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==, - } - engines: { node: '>=8' } + + mdast-util-to-string@2.0.0: {} + + mdurl@1.0.1: {} + + mem@5.1.1: dependencies: map-age-cleaner: 0.1.3 mimic-fn: 2.1.0 p-is-promise: 2.1.0 - dev: true - - /memoize-one/6.0.0: - resolution: - { - integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==, - } - dev: true - /memory-fs/0.4.1: - resolution: - { - integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==, - } + memory-fs@0.5.0: dependencies: errno: 0.1.8 - readable-stream: 2.3.7 - dev: true + readable-stream: 2.3.8 - /memory-fs/0.5.0: - resolution: - { - integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==, - } - engines: { node: '>=4.3.0 <5.0.0 || >=5.10' } + meow@8.1.2: dependencies: - errno: 0.1.8 - readable-stream: 2.3.7 - dev: true - - /meow/8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: '>=10' } - dependencies: - '@types/minimist': 1.2.2 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 - decamelize-keys: 1.1.0 + decamelize-keys: 1.1.1 hard-rejection: 2.1.0 minimist-options: 4.1.0 normalize-package-data: 3.0.3 @@ -13671,19 +14804,13 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /meow/9.0.0: - resolution: - { - integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, - } - engines: { node: '>=10' } + meow@9.0.0: dependencies: - '@types/minimist': 1.2.2 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 decamelize: 1.2.0 - decamelize-keys: 1.1.0 + decamelize-keys: 1.1.1 hard-rejection: 2.1.0 minimist-options: 4.1.0 normalize-package-data: 3.0.3 @@ -13692,95 +14819,44 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - 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 - - /mhchemparser/4.1.1: - resolution: - { - integrity: sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA==, - } - dev: true - - /micromark-extension-frontmatter/0.2.2: - resolution: - { - integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==, - } + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mhchemparser@4.2.1: {} + + micromark-extension-frontmatter@0.2.2: dependencies: fault: 1.0.4 - dev: true - /micromark-extension-gfm-autolink-literal/0.5.7: - resolution: - { - integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==, - } + micromark-extension-gfm-autolink-literal@0.5.7: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm-strikethrough/0.6.5: - resolution: - { - integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==, - } + micromark-extension-gfm-strikethrough@0.6.5: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm-table/0.4.3: - resolution: - { - integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==, - } + micromark-extension-gfm-table@0.4.3: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm-tagfilter/0.3.0: - resolution: - { - integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==, - } - dev: true + micromark-extension-gfm-tagfilter@0.3.0: {} - /micromark-extension-gfm-task-list-item/0.3.3: - resolution: - { - integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==, - } + micromark-extension-gfm-task-list-item@0.3.3: dependencies: micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-gfm/0.3.3: - resolution: - { - integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==, - } + micromark-extension-gfm@0.3.3: dependencies: micromark: 2.11.4 micromark-extension-gfm-autolink-literal: 0.5.7 @@ -13790,38 +14866,22 @@ packages: micromark-extension-gfm-task-list-item: 0.3.3 transitivePeerDependencies: - supports-color - dev: true - /micromark-extension-math/0.1.2: - resolution: - { - integrity: sha512-ZJXsT2eVPM8VTmcw0CPSDeyonOn9SziGK3Z+nkf9Vb6xMPeU+4JMEnO6vzDL10562Favw8Vste74f54rxJ/i6Q==, - } + micromark-extension-math@0.1.2: dependencies: katex: 0.12.0 micromark: 2.11.4 transitivePeerDependencies: - supports-color - dev: true - /micromark/2.11.4: - resolution: - { - integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==, - } + micromark@2.11.4: dependencies: - debug: 4.3.4 + debug: 4.4.1 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromatch/3.1.10: - resolution: - { - integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==, - } - engines: { node: '>=0.10.0' } + micromatch@3.1.10: dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -13838,196 +14898,84 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: true - - /micromatch/3.1.10_supports-color@6.1.0: - resolution: - { - integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==, - } - engines: { node: '>=0.10.0' } - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2_supports-color@6.1.0 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4_supports-color@6.1.0 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13_supports-color@6.1.0 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /micromatch/4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: '>=8.6' } + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 - dev: true - /miller-rabin/4.0.1: - resolution: - { - integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, - } - hasBin: true + miller-rabin@4.0.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.2 brorand: 1.1.0 - 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' } + + mime-db@1.52.0: {} + + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mime/1.3.6: - resolution: - { - integrity: sha512-a/kG+3WTtU8GJG1ngpkkHOHcH6zNjGrI47OQyoFsFBN0QpYYJ4u2yEORsGK5cZMI+cfu9HbSCCfGfRzG0fWE9A==, - } - hasBin: true - dev: true - - /mimer/1.1.0: - resolution: - { - integrity: sha512-y9dVfy2uiycQvDNiAYW6zp49ZhFlXDMr5wfdOiMbdzGM/0N5LNR6HTUn3un+WUQcM0koaw8FMTG1bt5EnHJdvQ==, - } - engines: { node: '>= 6.0' } - hasBin: true - dev: true - - /mimic-fn/1.2.0: - resolution: - { - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, - } - engines: { node: '>=4' } - dev: true - - /mimic-fn/2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: '>=6' } - dev: true - - /min-indent/1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: '>=4' } - dev: true - - /mini-create-react-context/0.4.1_4vyaxm4rsh2mpfdenvlqy7kmya: - resolution: - { - integrity: sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==, - } - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - prop-types: ^15.0.0 - react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + mime@1.4.1: {} + + mimer@1.1.0: {} + + mimic-fn@1.2.0: {} + + mimic-fn@2.1.0: {} + + min-indent@1.0.1: {} + + mini-create-react-context@0.4.1(prop-types@15.8.1)(react@16.14.0): dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 prop-types: 15.8.1 react: 16.14.0 tiny-warning: 1.0.3 - dev: true - - /minimalistic-assert/1.0.1: - resolution: - { - integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, - } - dev: true - - /minimalistic-crypto-utils/1.0.1: - resolution: - { - integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, - } - dev: true - - /minimatch/3.0.4: - resolution: - { - integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==, - } - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch/3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist-options/4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: '>= 6' } + + mini-create-react-context@0.4.1(prop-types@15.8.1)(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + prop-types: 15.8.1 + react: 19.1.1 + tiny-warning: 1.0.3 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - - /minimist/1.2.3: - resolution: - { - integrity: sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==, - } - dev: true - - /minimist/1.2.7: - resolution: - { - integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, - } - dev: true - - /mississippi/1.3.1: - resolution: - { - integrity: sha512-/6rB8YXFbAtsUVRphIRQqB0+9c7VaPHCjVtvto+JqwVxgz8Zz+I+f68/JgQ+Pb4VlZb2svA9OtdXnHHsZz7ltg==, - } + + minimist@1.2.3: {} + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mississippi@1.3.1: dependencies: concat-stream: 1.6.2 duplexify: 3.7.1 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 flush-write-stream: 1.1.1 from2: 2.3.0 parallel-transform: 1.2.0 @@ -14035,18 +14983,12 @@ packages: pumpify: 1.5.1 stream-each: 1.2.3 through2: 2.0.5 - dev: true - /mississippi/2.0.0: - resolution: - { - integrity: sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==, - } - engines: { node: '>=4.0.0' } + mississippi@2.0.0: dependencies: concat-stream: 1.6.2 duplexify: 3.7.1 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 flush-write-stream: 1.1.1 from2: 2.3.0 parallel-transform: 1.2.0 @@ -14054,134 +14996,29 @@ packages: pumpify: 1.5.1 stream-each: 1.2.3 through2: 2.0.5 - dev: true - - /mississippi/3.0.0: - resolution: - { - integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==, - } - engines: { node: '>=4.0.0' } - dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.4 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 3.0.0 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - dev: true - /mixin-deep/1.3.2: - resolution: - { - integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==, - } - engines: { node: '>=0.10.0' } + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 is-extendable: 1.0.1 - dev: true - - /mj-context-menu/0.6.1: - resolution: - { - integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==, - } - dev: true - - /mkdirp/0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } - hasBin: true - dependencies: - minimist: 1.2.7 - dev: true - /mocha/8.4.0: - resolution: - { - integrity: sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==, - } - engines: { node: '>= 10.12.0' } - hasBin: true + mj-context-menu@0.6.1: {} + + mkdirp@0.5.6: dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.1 - debug: 4.3.1_supports-color@8.1.1 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.1.6 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.0.0 - log-symbols: 4.0.0 - minimatch: 3.0.4 - ms: 2.1.3 - nanoid: 3.1.20 - serialize-javascript: 5.0.1 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - wide-align: 1.1.3 - workerpool: 6.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - dev: true - - /mock-socket/9.1.5: - resolution: - { - integrity: sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==, - } - engines: { node: '>= 8' } - dev: true - - /mockjs/1.1.0: - resolution: - { - integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==, - } - hasBin: true + minimist: 1.2.8 + + mock-socket@9.3.1: {} + + mockjs@1.1.0: dependencies: - commander: 9.4.1 - dev: true - - /moment/2.29.4: - resolution: - { - integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==, - } - dev: true - - /moniker/0.1.2: - resolution: - { - integrity: sha512-Uj9iV0QYr6281G+o0TvqhKwHHWB2Q/qUTT4LPQ3qDGc0r8cbMuqQjRXPZuVZ+gcL7APx+iQgE8lcfWPrj1LsLA==, - } - dev: true - - /moo/0.5.2: - resolution: - { - integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==, - } - dev: true - - /move-concurrently/1.0.1: - resolution: - { - integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==, - } + commander: 14.0.0 + + moment@2.30.1: {} + + moniker@0.1.2: {} + + move-concurrently@1.0.1: dependencies: aproba: 1.2.0 copy-concurrently: 1.0.5 @@ -14189,140 +15026,25 @@ packages: mkdirp: 0.5.6 rimraf: 2.7.1 run-queue: 1.0.3 - 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 - - /multimap/1.1.0: - resolution: - { - integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==, - } - dev: true - - /multimatch/4.0.0: - resolution: - { - integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==, - } - engines: { node: '>=8' } - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - - /mute-stdout/1.0.1: - resolution: - { - integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==, - } - engines: { node: '>= 0.10' } - dev: true - - /mute-stream/0.0.7: - resolution: - { - integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==, - } - dev: true - - /mute-stream/0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } - dev: true - - /nan/2.17.0: - resolution: - { - integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==, - } - dev: true + + ms@2.0.0: {} + + ms@2.1.3: {} + + multimap@1.1.0: {} + + mute-stdout@1.0.1: {} + + mute-stream@0.0.7: {} + + mute-stream@0.0.8: {} + + nan@2.23.0: optional: true - /nano-css/5.3.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==, - } - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - css-tree: 1.1.3 - csstype: 3.1.1 - fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 6.0.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - rtl-css-js: 1.16.0 - sourcemap-codec: 1.4.8 - stacktrace-js: 2.0.2 - stylis: 4.1.2 - dev: true - - /nanoid/2.1.11: - resolution: - { - integrity: sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==, - } - dev: true - - /nanoid/3.1.20: - resolution: - { - integrity: sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - dev: true - - /nanoid/3.3.4: - resolution: - { - integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - dev: true + nanoid@3.3.11: {} - /nanomatch/1.2.13: - resolution: - { - integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, - } - engines: { node: '>=0.10.0' } + nanomatch@1.2.13: dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -14337,135 +15059,39 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: true - /nanomatch/1.2.13_supports-color@6.1.0: - resolution: - { - integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, - } - engines: { node: '>=0.10.0' } - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /natural-compare/1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - dev: true - - /nearley/2.20.1: - resolution: - { - integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==, - } - hasBin: true - dependencies: - commander: 2.20.3 - moo: 0.5.2 - railroad-diagrams: 1.0.0 - randexp: 0.4.6 - dev: true - - /neo-async/2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - dev: true - - /netrc/0.1.4: - resolution: - { - integrity: sha512-ye8AIYWQcP9MvoM1i0Z2jV0qed31Z8EWXYnyGNkiUAd+Fo8J+7uy90xTV8g/oAbhtjkY7iZbNTizQaXdKUuwpQ==, - } - dev: true - - /next-tick/1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /nice-try/1.0.5: - resolution: - { - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, - } - dev: true - - /node-fetch-npm/2.0.4: - resolution: - { - integrity: sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==, - } - engines: { node: '>=4' } - deprecated: This module is not used anymore, npm uses minipass-fetch for its fetch implementation now + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + netrc@0.1.4: {} + + next-tick@1.1.0: {} + + nice-try@1.0.5: {} + + node-fetch-npm@2.0.4: dependencies: encoding: 0.1.13 json-parse-better-errors: 1.0.2 safe-buffer: 5.2.1 - dev: true - /node-fetch/1.7.3: - resolution: - { - integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==, - } + node-fetch@2.7.0(encoding@0.1.13): dependencies: + whatwg-url: 5.0.0 + optionalDependencies: encoding: 0.1.13 - is-stream: 1.1.0 - dev: true - - /node-fetch/2.6.7: - resolution: - { - integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + + node-libs-browser@2.2.1: dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-int64/0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } - dev: true - - /node-libs-browser/2.2.1: - resolution: - { - integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==, - } - dependencies: - assert: 1.5.0 + assert: 1.5.1 browserify-zlib: 0.2.0 buffer: 4.9.2 console-browserify: 1.2.0 constants-browserify: 1.0.0 - crypto-browserify: 3.12.0 + crypto-browserify: 3.12.1 domain-browser: 1.2.0 events: 3.3.0 https-browserify: 1.0.0 @@ -14474,607 +15100,251 @@ packages: process: 0.11.10 punycode: 1.4.1 querystring-es3: 0.2.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 stream-browserify: 2.0.2 stream-http: 2.8.3 string_decoder: 1.3.0 timers-browserify: 2.0.12 tty-browserify: 0.0.0 - url: 0.11.0 + url: 0.11.4 util: 0.11.1 vm-browserify: 1.1.2 - dev: true - /node-releases/2.0.6: - resolution: - { - integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==, - } - dev: true + node-releases@2.0.19: {} - /normalize-package-data/2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 - semver: 5.7.1 + resolve: 1.22.10 + semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data/3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: '>=10' } + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.10.0 - semver: 7.3.8 + is-core-module: 2.16.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path/2.1.1: - resolution: - { - integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==, - } - engines: { node: '>=0.10.0' } + normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 - dev: true - - /normalize-path/3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /normalize-range/0.1.2: - resolution: - { - integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /normalize-selector/0.2.0: - resolution: - { - integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==, - } - dev: true - - /normalize-url/1.9.1: - resolution: - { - integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==, - } - engines: { node: '>=4' } + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-selector@0.2.0: {} + + normalize-url@1.9.1: dependencies: object-assign: 4.1.1 prepend-http: 1.0.4 query-string: 4.3.4 sort-keys: 1.1.2 - dev: true - /now-and-later/2.0.1: - resolution: - { - integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==, - } - engines: { node: '>= 0.10' } + now-and-later@2.0.1: dependencies: once: 1.4.0 - dev: true - /npm-package-arg/5.1.2: - resolution: - { - integrity: sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==, - } + npm-package-arg@5.1.2: dependencies: hosted-git-info: 2.8.9 osenv: 0.1.5 - semver: 5.7.1 + semver: 5.7.2 validate-npm-package-name: 3.0.0 - dev: true - /npm-pick-manifest/1.0.4: - resolution: - { - integrity: sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ==, - } + npm-pick-manifest@1.0.4: dependencies: npm-package-arg: 5.1.2 - semver: 5.7.1 - dev: true + semver: 5.7.2 - /npm-run-path/2.0.2: - resolution: - { - integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==, - } - engines: { node: '>=4' } + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 - dev: true - /npm-run-path/4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: '>=8' } + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - - /nth-check/2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } - dependencies: - boolbase: 1.0.0 - dev: true - - /num2fraction/1.2.2: - resolution: - { - integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==, - } - dev: true - - /number-is-nan/1.0.1: - resolution: - { - integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /nwsapi/2.2.2: - resolution: - { - integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==, - } - dev: true - - /oauth-sign/0.9.0: - resolution: - { - integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==, - } - dev: true - - /object-assign/4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } - - /object-copy/0.1.0: - resolution: - { - integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==, - } - engines: { node: '>=0.10.0' } + + num2fraction@1.2.2: {} + + number-is-nan@1.0.1: {} + + nwsapi@2.2.21: {} + + oauth-sign@0.9.0: {} + + object-assign@4.1.1: {} + + object-copy@0.1.0: dependencies: copy-descriptor: 0.1.1 define-property: 0.2.5 kind-of: 3.2.2 - dev: true - - /object-inspect/1.12.2: - resolution: - { - integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==, - } - dev: true - - /object-is/1.1.5: - resolution: - { - integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - dev: true - - /object-keys/1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: '>= 0.4' } - dev: true - - /object-visit/1.0.1: - resolution: - { - integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==, - } - engines: { node: '>=0.10.0' } + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: dependencies: isobject: 3.0.1 - dev: true - - /object.assign/4.1.4: - resolution: - { - integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 - dev: true - /object.defaults/1.1.0: - resolution: - { - integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==, - } - engines: { node: '>=0.10.0' } + object.defaults@1.1.0: dependencies: array-each: 1.0.1 array-slice: 1.1.0 for-own: 1.0.0 isobject: 3.0.1 - dev: true - - /object.entries/1.1.5: - resolution: - { - integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /object.fromentries/2.0.5: - resolution: - { - integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /object.hasown/1.1.1: - resolution: - { - integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==, - } - dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /object.map/1.0.1: - resolution: - { - integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==, - } - engines: { node: '>=0.10.0' } + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.map@1.0.1: dependencies: for-own: 1.0.0 make-iterator: 1.0.1 - dev: true - /object.pick/1.3.0: - resolution: - { - integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==, - } - engines: { node: '>=0.10.0' } + object.pick@1.3.0: dependencies: isobject: 3.0.1 - dev: true - /object.reduce/1.0.1: - resolution: - { - integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==, - } - engines: { node: '>=0.10.0' } + object.reduce@1.0.1: dependencies: for-own: 1.0.0 make-iterator: 1.0.1 - dev: true - - /object.values/1.1.5: - resolution: - { - integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /omit.js/2.0.2: - resolution: - { - integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==, - } - dev: true - - /once/1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + omit.js@2.0.2: {} + + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime/2.0.1: - resolution: - { - integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, - } - engines: { node: '>=4' } + onetime@2.0.1: dependencies: mimic-fn: 1.2.0 - dev: true - /onetime/5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: '>=6' } + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /open/6.4.0: - resolution: - { - integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==, - } - engines: { node: '>=8' } + open@6.4.0: dependencies: is-wsl: 1.1.0 - dev: true - /optionator/0.8.3: - resolution: - { - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, - } - engines: { node: '>= 0.8.0' } - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - - /optionator/0.9.1: - resolution: - { - integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, - } - engines: { node: '>= 0.8.0' } + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 - dev: true + word-wrap: 1.2.5 - /ora/1.4.0: - resolution: - { - integrity: sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==, - } - engines: { node: '>=4' } + ora@1.4.0: dependencies: chalk: 2.4.2 cli-cursor: 2.1.0 cli-spinners: 1.3.1 log-symbols: 2.2.0 - dev: true - - /ordered-read-streams/1.0.1: - resolution: - { - integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==, - } - dependencies: - readable-stream: 2.3.7 - dev: true - - /os-browserify/0.3.0: - resolution: - { - integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==, - } - dev: true - - /os-homedir/1.0.2: - resolution: - { - integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /os-locale/1.4.0: - resolution: - { - integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==, - } - engines: { node: '>=0.10.0' } + + ordered-read-streams@1.0.1: + dependencies: + readable-stream: 2.3.8 + + os-browserify@0.3.0: {} + + os-homedir@1.0.2: {} + + os-locale@1.4.0: dependencies: lcid: 1.0.0 - dev: true - /os-locale/5.0.0: - resolution: - { - integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==, - } - engines: { node: '>=10' } + os-locale@5.0.0: dependencies: execa: 4.1.0 lcid: 3.1.1 mem: 5.1.1 - dev: true - - /os-tmpdir/1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - } - engines: { node: '>=0.10.0' } - dev: true - - /osenv/0.1.5: - resolution: - { - integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==, - } + + os-tmpdir@1.0.2: {} + + osenv@0.1.5: dependencies: os-homedir: 1.0.2 os-tmpdir: 1.0.2 - dev: true - - /p-defer/1.0.0: - resolution: - { - integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==, - } - engines: { node: '>=4' } - dev: true - - /p-finally/1.0.0: - resolution: - { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, - } - engines: { node: '>=4' } - dev: true - - /p-is-promise/2.1.0: - resolution: - { - integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==, - } - engines: { node: '>=6' } - dev: true - - /p-limit/2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: '>=6' } + + own-keys@1.0.1: dependencies: - p-try: 2.2.0 - dev: true + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-defer@1.0.0: {} + + p-finally@1.0.0: {} - /p-limit/3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } + p-is-promise@2.1.0: {} + + p-limit@2.3.0: dependencies: - yocto-queue: 0.1.0 - dev: true + p-try: 2.2.0 - /p-locate/3.0.0: - resolution: - { - integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, - } - engines: { node: '>=6' } + p-limit@3.1.0: dependencies: - p-limit: 2.3.0 - dev: true + yocto-queue: 0.1.0 - /p-locate/4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: '>=8' } + p-locate@4.1.0: 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' } + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map/3.0.0: - resolution: - { - integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==, - } - engines: { node: '>=8' } + p-map@3.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - - /p-try/2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: '>=6' } - dev: true - - /package-json/4.0.1: - resolution: - { - integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==, - } - engines: { node: '>=4' } + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-json@4.0.1: dependencies: got: 6.7.1 registry-auth-token: 3.4.0 registry-url: 3.1.0 - semver: 5.7.1 - dev: true + semver: 5.7.2 - /pacote/2.7.38: - resolution: - { - integrity: sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA==, - } + pacote@2.7.38: dependencies: bluebird: 3.7.2 cacache: 9.3.0 @@ -15087,66 +15357,41 @@ packages: npm-package-arg: 5.1.2 npm-pick-manifest: 1.0.4 osenv: 0.1.5 - promise-inflight: 1.0.1_bluebird@3.7.2 + promise-inflight: 1.0.1(bluebird@3.7.2) promise-retry: 1.1.1 protoduck: 4.0.0 safe-buffer: 5.2.1 - semver: 5.7.1 + semver: 5.7.2 ssri: 4.1.6 - tar-fs: 1.16.3 + tar-fs: 1.16.5 tar-stream: 1.6.2 unique-filename: 1.1.1 which: 1.3.1 transitivePeerDependencies: - supports-color - dev: true - - /pako/1.0.11: - resolution: - { - integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, - } - dev: true - - /parallel-transform/1.2.0: - resolution: - { - integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==, - } - dependencies: - cyclist: 1.0.1 + + pako@1.0.11: {} + + parallel-transform@1.2.0: + dependencies: + cyclist: 1.0.2 inherits: 2.0.4 - readable-stream: 2.3.7 - dev: true + readable-stream: 2.3.8 - /parent-module/1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-asn1/5.1.6: - resolution: - { - integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==, - } + parse-asn1@5.1.7: dependencies: - asn1.js: 5.4.1 + asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 - pbkdf2: 3.1.2 + hash-base: 3.0.5 + pbkdf2: 3.1.3 safe-buffer: 5.2.1 - dev: true - /parse-entities/2.0.0: - resolution: - { - integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==, - } + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -15154,766 +15399,315 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true - /parse-filepath/1.0.2: - resolution: - { - integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==, - } - engines: { node: '>=0.8' } + parse-filepath@1.0.2: dependencies: is-absolute: 1.0.0 map-cache: 0.2.2 path-root: 0.1.1 - dev: true - /parse-git-config/0.2.0: - resolution: - { - integrity: sha512-amapZFADOJtHvX2URcRfbzG2OFcW+UAwmdK2kht2N2vsH5Py65VxI5yZTlD2DjmxVhTz6htFoVCxROYUJaYOXQ==, - } - engines: { node: '>=0.10.0' } + parse-git-config@0.2.0: dependencies: ini: 1.3.8 - dev: true - /parse-git-config/1.1.1: - resolution: - { - integrity: sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ==, - } - engines: { node: '>=0.10.0' } + parse-git-config@1.1.1: dependencies: extend-shallow: 2.0.1 fs-exists-sync: 0.1.0 git-config-path: 1.0.1 ini: 1.3.8 - dev: true - /parse-json/2.2.0: - resolution: - { - integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==, - } - engines: { node: '>=0.10.0' } + parse-json@2.2.0: dependencies: error-ex: 1.3.2 - dev: true - /parse-json/4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: '>=4' } + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json/5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } + parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - - /parse-node-version/1.0.1: - resolution: - { - integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==, - } - engines: { node: '>= 0.10' } - dev: true - - /parse-passwd/1.0.0: - resolution: - { - integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, - } - engines: { node: '>=0.10.0' } - dev: true - - /parse5-htmlparser2-tree-adapter/7.0.0: - resolution: - { - integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==, - } - dependencies: - domhandler: 5.0.3 - parse5: 7.1.1 - dev: true - - /parse5/6.0.1: - resolution: - { - integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, - } - dev: true - - /parse5/7.1.1: - resolution: - { - integrity: sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==, - } - dependencies: - entities: 4.4.0 - dev: true - - /pascalcase/0.1.1: - resolution: - { - integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /path-browserify/0.0.1: - resolution: - { - integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==, - } - dev: true - - /path-dirname/1.0.2: - resolution: - { - integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==, - } - dev: true - - /path-exists/2.1.0: - resolution: - { - integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==, - } - engines: { node: '>=0.10.0' } + + parse-node-version@1.0.1: {} + + parse-passwd@1.0.0: {} + + parse5@6.0.1: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + pascalcase@0.1.1: {} + + path-browserify@0.0.1: {} + + path-dirname@1.0.2: {} + + path-exists@2.1.0: dependencies: pinkie-promise: 2.0.1 - dev: true - - /path-exists/3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: '>=4' } - 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-is-inside/1.0.2: - resolution: - { - integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==, - } - dev: true - - /path-key/2.0.1: - resolution: - { - integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, - } - engines: { node: '>=4' } - 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-root-regex/0.1.2: - resolution: - { - integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /path-root/0.1.1: - resolution: - { - integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==, - } - engines: { node: '>=0.10.0' } + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-is-inside@1.0.2: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: dependencies: path-root-regex: 0.1.2 - dev: true - /path-to-regexp/1.8.0: - resolution: - { - integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==, - } + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@1.9.0: dependencies: isarray: 0.0.1 - dev: true - /path-type/1.1.0: - resolution: - { - integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==, - } - engines: { node: '>=0.10.0' } + path-type@1.1.0: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: true - - /path-type/4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: '>=8' } - dev: true - - /pbkdf2/3.1.2: - resolution: - { - integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, - } - engines: { node: '>=0.12' } + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + pbkdf2@3.1.3: dependencies: - create-hash: 1.2.0 + create-hash: 1.1.3 create-hmac: 1.1.7 - ripemd160: 2.0.2 + ripemd160: 2.0.1 safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /performance-now/2.1.0: - resolution: - { - integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, - } - dev: true - - /picocolors/0.2.1: - resolution: - { - integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==, - } - dev: true - - /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 - - /pify/2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: '>=0.10.0' } - dev: true - - /pify/3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: '>=4' } - dev: true - - /pify/4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: '>=6' } - dev: true - - /pinkie-promise/2.0.1: - resolution: - { - integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==, - } - engines: { node: '>=0.10.0' } + sha.js: 2.4.12 + to-buffer: 1.2.1 + + performance-now@2.1.0: {} + + picocolors@0.2.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: true - - /pinkie/2.0.4: - resolution: - { - integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /pirates/4.0.5: - resolution: - { - integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, - } - engines: { node: '>= 6' } - dev: true - - /pkg-dir/3.0.0: - resolution: - { - integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==, - } - engines: { node: '>=6' } - dependencies: - find-up: 3.0.0 - dev: true - - /pkg-dir/4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: '>=8' } + + pinkie@2.0.4: {} + + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /plugin-error/1.0.1: - resolution: - { - integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==, - } - engines: { node: '>= 0.10' } + plugin-error@1.0.1: dependencies: ansi-colors: 1.1.0 arr-diff: 4.0.0 arr-union: 3.1.0 extend-shallow: 3.0.2 - dev: true - - /plur/4.0.0: - resolution: - { - integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==, - } - engines: { node: '>=10' } - dependencies: - irregular-plurals: 3.3.0 - dev: true - - /pluralize/8.0.0: - resolution: - { - integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==, - } - engines: { node: '>=4' } - dev: true - - /posix-character-classes/0.1.1: - resolution: - { - integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /postcss-attribute-case-insensitive/4.0.2: - resolution: - { - integrity: sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==, - } + + plur@4.0.0: dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.0.10 - dev: true + irregular-plurals: 3.5.0 + + pluralize@8.0.0: {} + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.1.0: {} - /postcss-color-functional-notation/2.0.1: - resolution: - { - integrity: sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==, - } - engines: { node: '>=6.0.0' } + postcss-attribute-case-insensitive@4.0.2: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 + postcss-selector-parser: 6.1.2 + + postcss-color-functional-notation@2.0.1: + dependencies: + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-color-gray/5.0.0: - resolution: - { - integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==, - } - engines: { node: '>=6.0.0' } + postcss-color-gray@5.0.0: dependencies: '@csstools/convert-colors': 1.4.0 - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-color-hex-alpha/5.0.3: - resolution: - { - integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==, - } - engines: { node: '>=6.0.0' } + postcss-color-hex-alpha@5.0.3: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-color-mod-function/3.0.3: - resolution: - { - integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==, - } - engines: { node: '>=6.0.0' } + postcss-color-mod-function@3.0.3: dependencies: '@csstools/convert-colors': 1.4.0 - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-color-rebeccapurple/4.0.1: - resolution: - { - integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==, - } - engines: { node: '>=6.0.0' } + postcss-color-rebeccapurple@4.0.1: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-custom-media/7.0.8: - resolution: - { - integrity: sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==, - } - engines: { node: '>=6.0.0' } + postcss-custom-media@7.0.8: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-custom-properties/8.0.11: - resolution: - { - integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==, - } - engines: { node: '>=6.0.0' } + postcss-custom-properties@8.0.11: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-custom-selectors/5.1.2: - resolution: - { - integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==, - } - engines: { node: '>=6.0.0' } + postcss-custom-selectors@5.1.2: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-selector-parser: 5.0.0 - dev: true - /postcss-dir-pseudo-class/5.0.0: - resolution: - { - integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==, - } - engines: { node: '>=4.0.0' } + postcss-dir-pseudo-class@5.0.0: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-selector-parser: 5.0.0 - dev: true - /postcss-double-position-gradients/1.0.0: - resolution: - { - integrity: sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==, - } - engines: { node: '>=6.0.0' } + postcss-double-position-gradients@1.0.0: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-env-function/2.0.2: - resolution: - { - integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==, - } - engines: { node: '>=6.0.0' } + postcss-env-function@2.0.2: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-flexbugs-fixes/4.2.1: - resolution: - { - integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==, - } + postcss-flexbugs-fixes@4.2.1: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-focus-visible/4.0.0: - resolution: - { - integrity: sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==, - } - engines: { node: '>=6.0.0' } + postcss-focus-visible@4.0.0: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-focus-within/3.0.0: - resolution: - { - integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==, - } - engines: { node: '>=6.0.0' } + postcss-focus-within@3.0.0: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-font-variant/4.0.1: - resolution: - { - integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==, - } + postcss-font-variant@4.0.1: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-gap-properties/2.0.0: - resolution: - { - integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==, - } - engines: { node: '>=6.0.0' } + postcss-gap-properties@2.0.0: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-html/0.36.0_j55xdkkcxc32kvnyvx3y7casfm: - resolution: - { - integrity: sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==, - } - peerDependencies: - postcss: '>=5.0.0' - postcss-syntax: '>=0.36.0' + postcss-html@0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39): dependencies: htmlparser2: 3.10.1 postcss: 7.0.39 - postcss-syntax: 0.36.2_postcss@7.0.39 - dev: true + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) - /postcss-image-set-function/3.0.1: - resolution: - { - integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==, - } - engines: { node: '>=6.0.0' } + postcss-image-set-function@3.0.1: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-initial/3.0.4: - resolution: - { - integrity: sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==, - } + postcss-initial@3.0.4: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-js/2.0.3: - resolution: - { - integrity: sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==, - } + postcss-js@2.0.3: dependencies: camelcase-css: 2.0.1 postcss: 7.0.39 - dev: true - /postcss-lab-function/2.0.1: - resolution: - { - integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==, - } - engines: { node: '>=6.0.0' } + postcss-lab-function@2.0.1: dependencies: '@csstools/convert-colors': 1.4.0 - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-less/3.1.4: - resolution: - { - integrity: sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==, - } - engines: { node: '>=6.14.4' } + postcss-less@3.1.4: dependencies: postcss: 7.0.39 - dev: true - /postcss-less/4.0.1: - resolution: - { - integrity: sha512-C92S4sHlbDpefJ2QQJjrucCcypq3+KZPstjfuvgOCNnGx0tF9h8hXgAlOIATGAxMXZXaF+nVp+/Mi8pCAWdSmw==, - } - engines: { node: '>=10' } + postcss-less@4.0.1: dependencies: - postcss: 8.4.17 - dev: true + postcss: 8.5.6 - /postcss-load-config/2.1.2: - resolution: - { - integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==, - } - engines: { node: '>= 4' } + postcss-load-config@2.1.2: dependencies: cosmiconfig: 5.2.1 import-cwd: 2.1.0 - dev: true - /postcss-loader/3.0.0: - resolution: - { - integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==, - } - engines: { node: '>= 6' } + postcss-loader@3.0.0: dependencies: - loader-utils: 1.4.0 - postcss: 7.0.39 + loader-utils: 1.4.2 + postcss: 7.0.32 postcss-load-config: 2.1.2 schema-utils: 1.0.0 - dev: true - /postcss-logical/3.0.0: - resolution: - { - integrity: sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==, - } - engines: { node: '>=6.0.0' } + postcss-logical@3.0.0: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-media-minmax/4.0.0: - resolution: - { - integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==, - } - engines: { node: '>=6.0.0' } + postcss-media-minmax@4.0.0: dependencies: - postcss: 7.0.39 - dev: true - - /postcss-media-query-parser/0.2.3: - resolution: - { - integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==, - } - dev: true - - /postcss-nesting/7.0.1: - resolution: - { - integrity: sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==, - } - engines: { node: '>=6.0.0' } + postcss: 7.0.32 + + postcss-media-query-parser@0.2.3: {} + + postcss-nesting@7.0.1: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-overflow-shorthand/2.0.0: - resolution: - { - integrity: sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==, - } - engines: { node: '>=6.0.0' } + postcss-overflow-shorthand@2.0.0: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-page-break/2.0.0: - resolution: - { - integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==, - } + postcss-page-break@2.0.0: dependencies: - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-place/4.0.1: - resolution: - { - integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==, - } - engines: { node: '>=6.0.0' } + postcss-place@4.0.1: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-values-parser: 2.0.1 - dev: true - /postcss-preset-env/6.7.0: - resolution: - { - integrity: sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==, - } - engines: { node: '>=6.0.0' } + postcss-preset-env@6.7.0: dependencies: autoprefixer: 9.8.8 - browserslist: 4.21.4 - caniuse-lite: 1.0.30001418 + browserslist: 4.25.3 + caniuse-lite: 1.0.30001737 css-blank-pseudo: 0.1.4 css-has-pseudo: 0.10.0 css-prefers-color-scheme: 3.1.1 cssdb: 4.4.0 - postcss: 7.0.39 + postcss: 7.0.32 postcss-attribute-case-insensitive: 4.0.2 postcss-color-functional-notation: 2.0.1 postcss-color-gray: 5.0.0 @@ -15943,1757 +15737,847 @@ packages: postcss-replace-overflow-wrap: 3.0.0 postcss-selector-matches: 4.0.0 postcss-selector-not: 4.0.1 - dev: true - /postcss-pseudo-class-any-link/6.0.0: - resolution: - { - integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==, - } - engines: { node: '>=6.0.0' } + postcss-pseudo-class-any-link@6.0.0: dependencies: - postcss: 7.0.39 + postcss: 7.0.32 postcss-selector-parser: 5.0.0 - dev: true - /postcss-replace-overflow-wrap/3.0.0: - resolution: - { - integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==, - } + postcss-replace-overflow-wrap@3.0.0: dependencies: - postcss: 7.0.39 - dev: true - - /postcss-resolve-nested-selector/0.1.1: - resolution: - { - integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==, - } - dev: true - - /postcss-safe-parser/4.0.2: - resolution: - { - integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==, - } - engines: { node: '>=6.0.0' } + postcss: 7.0.32 + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@4.0.2: dependencies: postcss: 7.0.39 - dev: true - /postcss-sass/0.4.4: - resolution: - { - integrity: sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==, - } + postcss-sass@0.4.4: dependencies: gonzales-pe: 4.3.0 postcss: 7.0.39 - dev: true - /postcss-scss/2.1.1: - resolution: - { - integrity: sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==, - } - engines: { node: '>=6.0.0' } + postcss-scss@2.1.1: dependencies: postcss: 7.0.39 - dev: true - /postcss-selector-matches/4.0.0: - resolution: - { - integrity: sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==, - } + postcss-selector-matches@4.0.0: dependencies: balanced-match: 1.0.2 - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-selector-not/4.0.1: - resolution: - { - integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==, - } + postcss-selector-not@4.0.1: dependencies: balanced-match: 1.0.2 - postcss: 7.0.39 - dev: true + postcss: 7.0.32 - /postcss-selector-parser/5.0.0: - resolution: - { - integrity: sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==, - } - engines: { node: '>=4' } + postcss-selector-parser@5.0.0: dependencies: cssesc: 2.0.0 indexes-of: 1.0.1 uniq: 1.0.1 - dev: true - /postcss-selector-parser/6.0.10: - resolution: - { - integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, - } - engines: { node: '>=4' } + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - /postcss-sorting/6.0.0_postcss@8.4.17: - resolution: - { - integrity: sha512-bYJ0vgAiGbjCBKi7B07CzsBc9eM84nLEbavUmwNp8rAa+PNyrgdH+6PpnqTtciLuUs99c4rFQQmCaYgeBQYmSQ==, - } - peerDependencies: - postcss: ^8.0.4 + postcss-sorting@6.0.0(postcss@8.5.6): dependencies: lodash: 4.17.21 - postcss: 8.4.17 - dev: true - - /postcss-syntax/0.36.2_postcss@7.0.39: - resolution: - { - integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==, - } - peerDependencies: - postcss: '>=5.0.0' - postcss-html: '*' - postcss-jsx: '*' - postcss-less: '*' - postcss-markdown: '*' - postcss-scss: '*' - peerDependenciesMeta: - postcss-html: - optional: true - postcss-jsx: - optional: true - postcss-less: - optional: true - postcss-markdown: - optional: true - postcss-scss: - optional: true + postcss: 8.5.6 + + postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39): dependencies: postcss: 7.0.39 - dev: true - - /postcss-value-parser/4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } - dev: true - - /postcss-values-parser/2.0.1: - resolution: - { - integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==, - } - engines: { node: '>=6.14.4' } + optionalDependencies: + postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39) + postcss-less: 3.1.4 + postcss-scss: 2.1.1 + + postcss-value-parser@4.2.0: {} + + postcss-values-parser@2.0.1: dependencies: flatten: 1.0.3 indexes-of: 1.0.1 uniq: 1.0.1 - dev: true - /postcss/7.0.32: - resolution: - { - integrity: sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==, - } - engines: { node: '>=6.0.0' } + postcss@7.0.32: dependencies: chalk: 2.4.2 source-map: 0.6.1 supports-color: 6.1.0 - dev: true - /postcss/7.0.39: - resolution: - { - integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==, - } - engines: { node: '>=6.0.0' } + postcss@7.0.39: dependencies: picocolors: 0.2.1 source-map: 0.6.1 - dev: true - - /postcss/8.4.17: - resolution: - { - integrity: sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==, - } - engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prelude-ls/1.1.2: - resolution: - { - integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /prelude-ls/1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } - dev: true - - /prepend-http/1.0.4: - resolution: - { - integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /prettier-plugin-packagejson/2.3.0_prettier@2.7.1: - resolution: - { - integrity: sha512-2SAPMMk1UDkqsB7DifWKcwCm6VC52JXMrzLHfbcQHJRWhRCj9zziOy+s+2XOyPBeyqFqS+A/1IKzOrxKFTo6pw==, - } - peerDependencies: - prettier: '>= 1.16.0' - peerDependenciesMeta: - prettier: - optional: true + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prepend-http@1.0.4: {} + + prettier-plugin-packagejson@2.3.0(prettier@2.8.8): dependencies: - prettier: 2.7.1 sort-package-json: 1.57.0 - dev: true + optionalDependencies: + prettier: 2.8.8 - /prettier-plugin-two-style-order/1.0.1_prettier@2.7.1: - resolution: - { - integrity: sha512-ETltO2FRR/Pxc7bsgz2XwuzWSPwafl7/v5+5Rria4S579CTas7dya+xsmbkix0q1tYQiuRjVVdfGnCKlH/aOuQ==, - } - peerDependencies: - prettier: '>= 2.0.0' + prettier-plugin-two-style-order@1.0.1(prettier@2.8.8): dependencies: - postcss: 8.4.17 + postcss: 8.5.6 postcss-less: 4.0.1 - postcss-sorting: 6.0.0_postcss@8.4.17 - prettier: 2.7.1 - dev: true - - /prettier/2.2.1: - resolution: - { - integrity: sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==, - } - engines: { node: '>=10.13.0' } - hasBin: true - dev: true - - /prettier/2.7.1: - resolution: - { - integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==, - } - engines: { node: '>=10.13.0' } - hasBin: true - dev: true + postcss-sorting: 6.0.0(postcss@8.5.6) + prettier: 2.8.8 - /pretty-format/26.6.2: - resolution: - { - integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==, - } - engines: { node: '>= 10' } - dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 - dev: true + prettier@2.2.1: {} + + prettier@2.8.8: {} - /pretty-format/27.5.1: - resolution: - { - integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: true - /pretty-format/28.1.3: - resolution: - { - integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - dependencies: - '@jest/schemas': 28.1.3 - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-hrtime/1.0.3: - resolution: - { - integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==, - } - engines: { node: '>= 0.8' } - dev: true - - /pretty-quick/3.1.3_prettier@2.7.1: - resolution: - { - integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==, - } - engines: { node: '>=10.13' } - hasBin: true - peerDependencies: - prettier: '>=2.0.0' - dependencies: - chalk: 3.0.0 - execa: 4.1.0 - find-up: 4.1.0 - ignore: 5.2.0 - mri: 1.2.0 - multimatch: 4.0.0 - prettier: 2.7.1 - dev: true - - /prism-react-renderer/1.3.5_react@16.14.0: - resolution: - { - integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==, - } - peerDependencies: - react: '>=0.14.9' - dependencies: - react: 16.14.0 - dev: true - - /prismjs/1.29.0: - resolution: - { - integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, - } - engines: { node: '>=6' } - dev: true - - /process-nextick-args/2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - dev: true - - /process/0.11.10: - resolution: - { - integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, - } - engines: { node: '>= 0.6.0' } - dev: true - - /progress/1.1.8: - resolution: - { - integrity: sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==, - } - engines: { node: '>=0.4.0' } - dev: true - - /progress/2.0.3: - resolution: - { - integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, - } - engines: { node: '>=0.4.0' } - dev: true - - /promise-inflight/1.0.1_bluebird@3.7.2: - resolution: - { - integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, - } - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true + pretty-hrtime@1.0.3: {} + + prism-react-renderer@1.3.5(react@19.1.1): dependencies: + react: 19.1.1 + + prismjs@1.30.0: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + progress@1.1.8: {} + + progress@2.0.3: {} + + promise-inflight@1.0.1(bluebird@3.7.2): + optionalDependencies: bluebird: 3.7.2 - dev: true - - /promise-polyfill/8.2.3: - resolution: - { - integrity: sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==, - } - dev: true - - /promise-retry/1.1.1: - resolution: - { - integrity: sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==, - } - engines: { node: '>=0.12' } + + promise-retry@1.1.1: dependencies: err-code: 1.1.2 retry: 0.10.1 - 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 - - /prop-types-exact/1.2.0: - resolution: - { - integrity: sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==, - } - dependencies: - has: 1.0.3 - object.assign: 4.1.4 - reflect.ownkeys: 0.2.0 - dev: true - - /prop-types/15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /property-information/5.6.0: - resolution: - { - integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==, - } + property-information@5.6.0: dependencies: xtend: 4.0.2 - dev: true - /protoduck/4.0.0: - resolution: - { - integrity: sha512-9sxuz0YTU/68O98xuDn8NBxTVH9EuMhrBTxZdiBL0/qxRmWhB/5a8MagAebDa+98vluAZTs8kMZibCdezbRCeQ==, - } + protoduck@4.0.0: dependencies: genfun: 4.0.1 - dev: true - - /prr/1.0.1: - resolution: - { - integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==, - } - dev: true - - /pseudomap/1.0.2: - resolution: - { - integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, - } - dev: true - - /psl/1.9.0: - resolution: - { - integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, - } - dev: true - - /public-encrypt/4.0.3: - resolution: - { - integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, - } - dependencies: - bn.js: 4.12.0 - browserify-rsa: 4.1.0 + + prr@1.0.1: {} + + pseudomap@1.0.2: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.2 + browserify-rsa: 4.1.1 create-hash: 1.2.0 - parse-asn1: 5.1.6 + parse-asn1: 5.1.7 randombytes: 2.1.0 safe-buffer: 5.2.1 - dev: true - /pump/1.0.3: - resolution: - { - integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==, - } + pump@1.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - dev: true - /pump/2.0.1: - resolution: - { - integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==, - } + pump@2.0.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - dev: true - /pump/3.0.0: - resolution: - { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, - } + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - dev: true - /pumpify/1.5.1: - resolution: - { - integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==, - } + pumpify@1.5.1: dependencies: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 - dev: true - - /punycode/1.3.2: - resolution: - { - integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, - } - dev: true - - /punycode/1.4.1: - resolution: - { - integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==, - } - dev: true - - /punycode/2.1.1: - resolution: - { - integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==, - } - engines: { node: '>=6' } - dev: true - - /q/1.5.1: - resolution: - { - integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, - } - engines: { node: '>=0.6.0', teleport: '>=0.2.0' } - dev: true - - /qs/6.11.0: - resolution: - { - integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, - } - engines: { node: '>=0.6' } - dependencies: - side-channel: 1.0.4 - dev: true - - /qs/6.5.3: - resolution: - { - integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==, - } - engines: { node: '>=0.6' } - dev: true - - /query-string/4.3.4: - resolution: - { - integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==, - } - engines: { node: '>=0.10.0' } - dependencies: - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - dev: true - - /query-string/6.14.1: - resolution: - { - integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==, - } - engines: { node: '>=6' } - dependencies: - decode-uri-component: 0.2.0 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - - /querystring-es3/0.2.1: - resolution: - { - integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==, - } - engines: { node: '>=0.4.x' } - dev: true - - /querystring/0.2.0: - resolution: - { - integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, - } - engines: { node: '>=0.4.x' } - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify/2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } - dev: true - - /queue-microtask/1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - dev: true - - /queue/6.0.1: - resolution: - { - integrity: sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==, - } - dependencies: - inherits: 2.0.4 - dev: true - - /quick-lru/4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: '>=8' } - dev: true - - /raf/3.4.1: - resolution: - { - integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, - } - dependencies: - performance-now: 2.1.0 - dev: true - - /railroad-diagrams/1.0.0: - resolution: - { - integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==, - } - dev: true - - /randexp/0.4.6: - resolution: - { - integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==, - } - engines: { node: '>=0.12' } - dependencies: - discontinuous-range: 1.0.0 - ret: 0.1.15 - dev: true - - /randombytes/2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /randomfill/1.0.4: - resolution: - { - integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, - } - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /rax-children/1.0.0_rax@1.2.2: - resolution: - { - integrity: sha512-sBKEXAMj9ik6SsPfPGgcQnqggmbWFyBdvAV/Cz/0f04bRA86BtWgbMri/9Dce0k8nkEC/BGWiiTdyA8Q49zIiw==, - } - engines: { npm: '>=3.0.0' } - peerDependencies: - rax: ^1.0.0 - dependencies: - rax: 1.2.2 - dev: true - - /rax-clone-element/1.0.0_rax@1.2.2: - resolution: - { - integrity: sha512-TaQMVuzoglvCTjbWATlvvwARmeWnG8kpENWNXrNDv0++x29GHNND/TBbx7sdtVs/QmYwYc8YmwRUhaBwKQi5eQ==, - } - engines: { npm: '>=3.0.0' } - peerDependencies: - rax: ^1.0.0 - dependencies: - rax: 1.2.2 - rax-is-valid-element: 1.0.0 - dev: true - - /rax-create-factory/1.0.0_rax@1.2.2: - resolution: - { - integrity: sha512-blBaVrurj/BOWelJhQWiuc0Kk8Ons1jsNsX78omaPBLkSOL7OkyJ3NC/0iKXHu425yWrGB6e5vho/qabROC7VQ==, - } - engines: { npm: '>=3.0.0' } - peerDependencies: - rax: ^1.0.0 - dependencies: - rax: 1.2.2 - dev: true - - /rax-is-valid-element/1.0.0: - resolution: - { - integrity: sha512-MM3IUAQRKn3EJ0D2vjxgobOJLplLAw3YxE7/IRM6ytDYzlPq5iIZ8wsXoPAp/qW3Y+n23HLQUIljmLKywcCEIA==, - } - engines: { npm: '>=3.0.0' } - dev: true - - /rax/1.2.2: - resolution: - { - integrity: sha512-SKUKSXoG2Dp+sFyiFyYzTGmhZlYGxusRSigcokAYTN3r4WTySreXs2WE+6nBBGg26aFyiCsBVHNeI86SQbVsQg==, - } - engines: { npm: '>=3.0.0' } - dependencies: - '@babel/runtime': 7.19.4 - driver-server: 1.0.0 - prop-types: 15.8.1 - rax-children: 1.0.0_rax@1.2.2 - rax-clone-element: 1.0.0_rax@1.2.2 - rax-create-factory: 1.0.0_rax@1.2.2 - rax-is-valid-element: 1.0.0 - dev: true - - /rc-align/4.0.12_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - dom-align: 1.12.3 - lodash: 4.17.21 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - resize-observer-polyfill: 1.5.1 - dev: true - - /rc-cascader/3.7.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - array-tree-filter: 2.1.0 - classnames: 2.3.2 - rc-select: 14.1.13_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree: 5.7.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-checkbox/2.3.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-collapse/3.3.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-cOJfcSe3R8vocrF8T+PgaHDrgeA1tX+lwfhwSj60NX9QVRidsILIbRNDLD6nAzmcvVC5PWiIRiR4S1OobxdhCg==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - shallowequal: 1.1.0 - dev: true - - /rc-dialog/8.9.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-Cp0tbJnrvPchJfnwIvOMWmJ4yjX3HWFatO6oBFD1jx8QkgsQCR0p8nUWAKdd3seLJhEC39/v56kZaEjwp9muoQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-drawer/5.1.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-pU3Tsn99pxGdYowXehzZbdDVE+4lDXSGb7p8vA9mSmr569oc2Izh4Zw5vLKSe/Xxn2p5MSNbLVqD4tz+pK6SOw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-dropdown/4.0.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==, - } - peerDependencies: - react: '>=16.11.0' - react-dom: '>=16.11.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-field-form/1.27.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-NaTjkSB8JsHRgm52wkDorsDzFf2HH6GmCQ2AqkwO8zo+zIqybw8K1lkzDBMDJI8nw1pFuD46U5QsYZv4blYvdw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - async-validator: 4.2.5 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-image/5.7.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-QyMfdhoUfb5W14plqXSisaYwpdstcLYnB0MjX5ccIK2rydQM9sDPuekQWu500DDGR2dBaIF5vx9XbWkNFK17Fg==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-dialog: 8.9.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-input-number/7.3.9_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-u0+miS+SATdb6DtssYei2JJ1WuZME+nXaG6XGtR8maNyW5uGDytfDu60OTWLQEb0Anv/AcCzehldV8CKmKyQfA==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-input/0.1.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-ZPmwcFspgfYpUfbSx3KnLk9gImBcLOrlQCr4oTJ4jBoIXgJLTfm26yelzRgBJewhkvD8uJbgX0sQ/yOzuOHnJg==, - } - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-mentions/1.10.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-oMlYWnwXSxP2NQVlgxOTzuG/u9BUc3ySY78K3/t7MNhJWpZzXTao+/Bic6tyZLuNCO89//hVQJBdaR2rnFQl6Q==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-menu: 9.6.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-textarea: 0.4.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-menu/9.6.4_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-6DiNAjxjVIPLZXHffXxxcyE15d4isRL7iQ1ru4MqYDH2Cqc5bW96wZOdMydFtGLyDdnmEQ9jVvdCE9yliGvzkw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-overflow: 1.2.8_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - shallowequal: 1.1.0 - dev: true - /rc-motion/2.6.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-4w1FaX3dtV749P8GwfS4fYnFG4Rb9pxvCYPc/b2fw1cmlHJWNNgOFIz7ysiD+eOrzJSvnLJWlNQQncpNMXwwpg==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-notification/4.6.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-overflow/1.2.8_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-pagination/3.1.17_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-/BQ5UxcBnW28vFAcP2hfh+Xg15W0QZn8TWYwdCApchMH1H0CxiaUUcULP8uXcFM1TygcdKWdt3JqsL9cTAfdkQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-picker/2.6.10_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-9wYtw0DFWs9FO92Qh2D76P0iojUr8ZhLOtScUeOit6ks/F+TBLrOC1uze3IOu+u9gbDAjmosNWLKbBzx/Yuv2w==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - date-fns: 2.29.3 - dayjs: 1.11.5 - moment: 2.29.4 - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - shallowequal: 1.1.0 - dev: true + punycode@1.4.1: {} - /rc-progress/3.3.3_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-MDVNVHzGanYtRy2KKraEaWeZLri2ZHWIRyaE1a9MQ2MuJ09m+Wxj5cfcaoaR6z5iRpHpA59YeUxAlpML8N4PJw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-rate/2.9.2_wcqkhtmu7mswc6yz4uyexck3ty: - 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.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-resize-observer/1.2.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - resize-observer-polyfill: 1.5.1 - dev: true + punycode@2.3.1: {} - /rc-segmented/2.1.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==, - } - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-select/14.1.13_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-WMEsC3gTwA1dbzWOdVIXDmWyidYNLq68AwvvUlRROw790uGUly0/vmqDozXrIr0QvN/A3CEULx12o+WtLCAefg==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-overflow: 1.2.8_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-virtual-list: 3.4.8_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-slider/10.0.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + pure-color@1.3.0: {} + + qs@6.14.0: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - shallowequal: 1.1.0 - dev: true - - /rc-steps/4.1.4_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + side-channel: 1.1.0 + + qs@6.5.3: {} + + query-string@4.3.4: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-switch/3.2.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + query-string@6.14.1: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-table/7.26.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + query-string@8.2.0: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - shallowequal: 1.1.0 - dev: true - - /rc-tabs/11.16.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-bR7Dap23YyfzZQwtKomhiFEFzZuE7WaKWo+ypNRSGB9PDKSc6tM12VP8LWYkvmmQHthgwP0WRN8nFbSJWuqLYw==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + + querystring-es3@0.2.1: {} + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + queue@6.0.1: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-dropdown: 4.0.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-menu: 9.6.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-tabs/12.1.0-alpha.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-M+B88WEnGSuE+mR54fpgPbZLAakzxa/H6FmEetLBl5WG4I3AcwSk9amuIPC/tu0KXBl+H6Bg5ZwrrEUOBUvgzg==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + inherits: 2.0.4 + + quick-lru@4.0.1: {} + + randombytes@2.1.0: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-dropdown: 4.0.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-menu: 9.6.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-textarea/0.4.3_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-IrvO5TbnRIC4+8s97MCdWJHWED4u5M+Uq3jVkkUAZJYhs/JuTV2yHwtxjidHdD3dEdGvZoAb7FTyqshMmRgyyw==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + safe-buffer: 5.2.1 + + randomfill@1.0.4: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - shallowequal: 1.1.0 - dev: true + randombytes: 2.1.0 + safe-buffer: 5.2.1 - /rc-tooltip/5.2.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rax-children@1.0.0(rax@1.2.3): dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-trigger: 5.3.1_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-tree-select/5.5.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-XS0Jvw4OjFz/Xvb2byEkBWv55JFKFz0HVvTBa/cPOHJaQh/3EaYwymEMnCCvGEzS1+5CfDVwMtA8j/v4rt1DHw==, - } - peerDependencies: - react: '*' - react-dom: '*' + rax: 1.2.3 + + rax-clone-element@1.0.0(rax@1.2.3): dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-select: 14.1.13_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree: 5.7.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-tree/5.7.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-F+Ewkv/UcutshnVBMISP+lPdHDlcsL+YH/MQDVWbk+QdkfID7vXiwrHMEZn31+2Rbbm21z/HPceGS8PXGMmnQg==, - } - engines: { node: '>=10.x' } - peerDependencies: - react: '*' - react-dom: '*' + rax: 1.2.3 + rax-is-valid-element: 1.0.1 + + rax-create-factory@1.0.0(rax@1.2.3): dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-virtual-list: 3.4.8_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-trigger/5.3.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + rax: 1.2.3 + + rax-is-valid-element@1.0.1: {} + + rax@1.2.3: dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-align: 4.0.12_wcqkhtmu7mswc6yz4uyexck3ty - rc-motion: 2.6.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-upload/4.3.4_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@babel/runtime': 7.28.3 + prop-types: 15.8.1 + rax-children: 1.0.0(rax@1.2.3) + rax-clone-element: 1.0.0(rax@1.2.3) + rax-create-factory: 1.0.0(rax@1.2.3) + rax-is-valid-element: 1.0.1 + + rc-align@4.0.15(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + dom-align: 1.12.4 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + resize-observer-polyfill: 1.5.1 + + rc-cascader@3.34.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-select: 14.16.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tree: 5.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-checkbox@3.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-collapse@3.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-dialog@9.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/portal': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-drawer@7.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/portal': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-dropdown@4.0.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-trigger: 5.3.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-dropdown@4.2.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-field-form@2.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/async-validator': 5.0.4 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-image@7.12.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/portal': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-dialog: 9.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-input-number@9.5.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/mini-decimal': 1.1.0 + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-input@1.8.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-mentions@2.20.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-menu: 9.16.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-textarea: 1.10.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-menu@9.16.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-overflow: 1.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-menu@9.6.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-overflow: 1.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-trigger: 5.3.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + shallowequal: 1.1.0 + + rc-motion@2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-notification@5.6.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-overflow@1.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-pagination@5.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-picker@4.11.3(dayjs@1.11.13)(moment@2.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-overflow: 1.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + dayjs: 1.11.13 + moment: 2.30.1 + + rc-progress@4.0.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@babel/runtime': 7.19.4 - classnames: 2.3.2 - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc-util/5.24.4_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-2a4RQnycV9eV7lVZPEJ7QwJRPlZNc06J7CwcwZo4vIHr3PfUqtYgl1EkUV9ETAc6VRRi8XZOMFhYG63whlIC9Q==, - } - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-rate@2.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@babel/runtime': 7.19.4 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-is: 16.13.1 - shallowequal: 1.1.0 - dev: true - - /rc-virtual-list/3.4.8_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-qSN+Rv4i/E7RCTvTMr1uZo7f3crJJg/5DekoCagydo9zsXrxj07zsFSxqizqW+ldGA16lwa8So/bIbV9Ofjddg==, - } - engines: { node: '>=8.x' } - peerDependencies: - react: '*' - react-dom: '*' + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-resize-observer@1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - classnames: 2.3.2 - rc-resize-observer: 1.2.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 5.24.4_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: true - - /rc/1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + resize-observer-polyfill: 1.5.1 + + rc-segmented@2.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-select@14.16.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-overflow: 1.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-virtual-list: 3.19.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-slider@11.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-steps@6.0.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-switch@4.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-table@7.51.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/context': 1.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-virtual-list: 3.19.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-tabs@11.16.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-dropdown: 4.0.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-menu: 9.6.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-tabs@15.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-dropdown: 4.2.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-menu: 9.16.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-textarea@1.10.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-tooltip@6.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + '@rc-component/trigger': 2.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-tree-select@5.27.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-select: 14.16.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-tree: 5.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-tree@5.13.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-virtual-list: 3.19.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-trigger@5.3.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-align: 4.0.15(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-motion: 2.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-upload@4.9.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc-util@5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-is: 18.3.1 + + rc-virtual-list@3.19.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + rc-util: 5.44.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 - minimist: 1.2.7 + minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - - /react-attr-converter/0.3.1: - resolution: - { - integrity: sha512-dSxo2Mn6Zx4HajeCeQNLefwEO4kNtV/0E682R1+ZTyFRPqxDa5zYb5qM/ocqw9Bxr/kFQO0IUiqdV7wdHw+Cdg==, - } - dev: true - - /react-docgen-typescript-dumi-tmp/1.22.1-0_typescript@4.8.4: - resolution: - { - integrity: sha512-wjuAm1yj+ZZucovow2VF0MXkH2SGZ+squZxfNdnam3oyUbHy/xZaU1ZabCn7rY+13ZFx0/NLda+ZuBgF3g8vBA==, - } - peerDependencies: - typescript: '>= 3.x' + + react-attr-converter@0.3.1: {} + + react-base16-styling@0.6.0: dependencies: - typescript: 4.8.4 - dev: true + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 - /react-dom/16.14.0_react@16.14.0: - resolution: - { - integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==, - } - peerDependencies: - react: ^16.14.0 + react-docgen-typescript-dumi-tmp@1.22.1-0(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + react-dom@16.14.0(react@16.14.0): dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 prop-types: 15.8.1 react: 16.14.0 scheduler: 0.19.1 - dev: true - /react-drag-listview/0.1.9: - resolution: - { - integrity: sha512-/OsYevKtCUlw4FhJIfZPH7INHEmyl89sSC5COzonHW5Z2c8rHg4DNYFnUxOyqH+65o7sHweL13oaf6wr7dFvPA==, - } + react-dom@19.1.1(react@19.1.1): + dependencies: + react: 19.1.1 + scheduler: 0.26.0 + + react-drag-listview@0.1.9: dependencies: babel-runtime: 6.26.0 prop-types: 15.8.1 - dev: true - - /react-error-boundary/3.1.4_react@16.14.0: - resolution: - { - integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==, - } - engines: { node: '>=10', npm: '>=6' } - peerDependencies: - react: '>=16.13.1' + + react-error-boundary@3.1.4(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + react: 19.1.1 + + react-fast-compare@3.2.2: {} + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-json-view@1.21.3(@types/react@19.1.11)(encoding@0.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + flux: 4.0.4(encoding@0.1.13)(react@19.1.1) + react: 19.1.1 + react-base16-styling: 0.6.0 + react-dom: 19.1.1(react@19.1.1) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.5.9(@types/react@19.1.11)(react@19.1.1) + transitivePeerDependencies: + - '@types/react' + - encoding + + react-lifecycles-compat@3.0.4: {} + + react-refresh@0.10.0: {} + + react-router-config@5.1.1(react-router@5.2.0(react@16.14.0))(react@16.14.0): dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 react: 16.14.0 - dev: true - - /react-is/16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } - - /react-is/17.0.2: - resolution: - { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, - } - dev: true - - /react-is/18.2.0: - resolution: - { - integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, - } - dev: true - - /react-lifecycles-compat/3.0.4: - resolution: - { - integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==, - } - dev: true - - /react-refresh/0.10.0: - resolution: - { - integrity: sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /react-router-config/5.1.1_6flbfkch6crntn4ac2g723iqde: - resolution: - { - integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==, - } - peerDependencies: - react: '>=15' - react-router: '>=5' + react-router: 5.2.0(react@16.14.0) + + react-router-config@5.1.1(react-router@6.30.1(react@19.1.1))(react@16.14.0): dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 react: 16.14.0 - react-router: 5.2.0_react@16.14.0 - dev: true - - /react-router-dom/5.2.0_react@16.14.0: - resolution: - { - integrity: sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==, - } - peerDependencies: - react: '>=15' + react-router: 6.30.1(react@19.1.1) + + react-router-config@5.1.1(react-router@6.30.1(react@19.1.1))(react@19.1.1): dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 + react: 19.1.1 + react-router: 6.30.1(react@19.1.1) + + react-router-dom@5.2.0(react@16.14.0): + dependencies: + '@babel/runtime': 7.28.3 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 16.14.0 - react-router: 5.2.0_react@16.14.0 - tiny-invariant: 1.3.1 + react-router: 5.2.0(react@16.14.0) + tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - dev: true - /react-router/5.2.0_react@16.14.0: - resolution: - { - integrity: sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==, - } - peerDependencies: - react: '>=15' + react-router-dom@5.2.0(react@19.1.1): + dependencies: + '@babel/runtime': 7.28.3 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.1.1 + react-router: 5.2.0(react@19.1.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react-router@5.2.0(react@16.14.0): dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 - mini-create-react-context: 0.4.1_4vyaxm4rsh2mpfdenvlqy7kmya - path-to-regexp: 1.8.0 + mini-create-react-context: 0.4.1(prop-types@15.8.1)(react@16.14.0) + path-to-regexp: 1.9.0 prop-types: 15.8.1 react: 16.14.0 react-is: 16.13.1 - tiny-invariant: 1.3.1 + tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - dev: true - - /react-router/6.4.2_react@16.14.0: - resolution: - { - integrity: sha512-Rb0BAX9KHhVzT1OKhMvCDMw776aTYM0DtkxqUBP8dNBom3mPXlfNs76JNGK8wKJ1IZEY1+WGj+cvZxHVk/GiKw==, - } - engines: { node: '>=14' } - peerDependencies: - react: '>=16.8' + + react-router@5.2.0(react@19.1.1): dependencies: - '@remix-run/router': 1.0.2 - react: 16.14.0 - dev: false + '@babel/runtime': 7.28.3 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + mini-create-react-context: 0.4.1(prop-types@15.8.1)(react@19.1.1) + path-to-regexp: 1.9.0 + prop-types: 15.8.1 + react: 19.1.1 + react-is: 16.13.1 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 - /react-shadow/19.0.3_ccrd4luiijsxnlhe6bgkvyy2z4: - resolution: - { - integrity: sha512-B1DoQC/rOyOjDdpgC1bd7nfhrYEF9ukV/vz8HcKaFTNmUkUmFnQCp4NHgEPxDfe3HJ1Mdr5ePzu+ZYAOvX6bNg==, - } - peerDependencies: - prop-types: ^15.0.0 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.0.0 || ^17.0.0 + react-router@6.30.1(react@19.1.1): + dependencies: + '@remix-run/router': 1.23.0 + react: 19.1.1 + + react-shadow@20.6.0(prop-types@15.8.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: humps: 2.0.1 prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-use: 15.3.8_wcqkhtmu7mswc6yz4uyexck3ty - dev: true - - /react-test-renderer/16.14.0_react@16.14.0: - resolution: - { - integrity: sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==, - } - peerDependencies: - react: ^16.14.0 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + react-textarea-autosize@8.5.9(@types/react@19.1.11)(react@19.1.1): dependencies: - object-assign: 4.1.1 - prop-types: 15.8.1 - react: 16.14.0 - react-is: 16.13.1 - scheduler: 0.19.1 - dev: true + '@babel/runtime': 7.28.3 + react: 19.1.1 + use-composed-ref: 1.4.0(@types/react@19.1.11)(react@19.1.1) + use-latest: 1.3.0(@types/react@19.1.11)(react@19.1.1) + transitivePeerDependencies: + - '@types/react' - /react-transition-group/2.9.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==, - } - peerDependencies: - react: '>=15.0.0' - react-dom: '>=15.0.0' + react-transition-group@2.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: dom-helpers: 3.4.0 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) react-lifecycles-compat: 3.0.4 - dev: true - /react-universal-interface/0.6.2_react@16.14.0+tslib@2.4.0: - resolution: - { - integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==, - } - peerDependencies: - react: '*' - tslib: '*' - dependencies: - react: 16.14.0 - tslib: 2.4.0 - dev: true - - /react-use/15.3.8_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: - { - integrity: sha512-GeGcrmGuUvZrY5wER3Lnph9DSYhZt5nEjped4eKDq8BRGr2CnLf9bDQWG9RFc7oCPphnscUUdOovzq0E5F2c6Q==, - } - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@types/js-cookie': 2.2.6 - '@xobotyi/scrollbar-width': 1.9.5 - copy-to-clipboard: 3.3.2 - fast-deep-equal: 3.1.3 - fast-shallow-equal: 1.0.0 - js-cookie: 2.2.1 - nano-css: 5.3.5_wcqkhtmu7mswc6yz4uyexck3ty - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-universal-interface: 0.6.2_react@16.14.0+tslib@2.4.0 - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - set-harmonic-interval: 1.0.1 - throttle-debounce: 2.3.0 - ts-easing: 0.2.0 - tslib: 2.4.0 - dev: true - - /react/16.14.0: - resolution: - { - integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==, - } - engines: { node: '>=0.10.0' } + react@16.14.0: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 prop-types: 15.8.1 - /read-pkg-up/1.0.1: - resolution: - { - integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==, - } - engines: { node: '>=0.10.0' } + react@19.1.1: {} + + read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 read-pkg: 1.1.0 - dev: true - /read-pkg-up/7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: '>=8' } + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg/1.1.0: - resolution: - { - integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==, - } - engines: { node: '>=0.10.0' } + read-pkg@1.1.0: dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 - dev: true - /read-pkg/5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: '>=8' } + read-pkg@5.2.0: dependencies: - '@types/normalize-package-data': 2.4.1 + '@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 - /read/1.0.5: - resolution: - { - integrity: sha512-hDLATrzYLoMu23c/69pMC6u3fO3Y0qLTIygJkEZHLOn+AO2gSapu6QgrgwX9ehyVtaRoZVZbF4IuiZPPRdGgdg==, - } - engines: { node: '>=0.8' } + read@1.0.5: dependencies: mute-stream: 0.0.8 - dev: true - /readable-stream/2.3.7: - resolution: - { - integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==, - } + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -17702,247 +16586,120 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream/3.6.0: - resolution: - { - integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==, - } - engines: { node: '>= 6' } + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp/2.2.1: - resolution: - { - integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==, - } - engines: { node: '>=0.10' } + readdirp@2.2.1: dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 micromatch: 3.1.10 - readable-stream: 2.3.7 + readable-stream: 2.3.8 transitivePeerDependencies: - supports-color - dev: true - /readdirp/3.5.0: - resolution: - { - integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==, - } - engines: { node: '>=8.10.0' } + readdirp@3.5.0: dependencies: picomatch: 2.3.1 - dev: true - /readdirp/3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true + optional: true + + rechoir@0.6.2: + dependencies: + resolve: 1.22.10 - /rechoir/0.6.2: - resolution: - { - integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, - } - engines: { node: '>= 0.10' } + rechoir@0.8.0: dependencies: - resolve: 1.22.1 - dev: true + resolve: 1.22.10 - /redent/3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: '>=8' } + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - - /reflect.ownkeys/0.2.0: - resolution: - { - integrity: sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==, - } - dev: true - - /regenerate-unicode-properties/10.0.1: - resolution: - { - integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==, - } - engines: { node: '>=4' } + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.0.1: dependencies: regenerate: 1.4.2 - dev: true - /regenerate-unicode-properties/10.1.0: - resolution: - { - integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==, - } - engines: { node: '>=4' } + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 - dev: true - - /regenerate/1.4.2: - resolution: - { - integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, - } - dev: true - - /regenerator-runtime/0.11.1: - resolution: - { - integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==, - } - dev: true - - /regenerator-runtime/0.13.5: - resolution: - { - integrity: sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==, - } - dev: true - - /regenerator-runtime/0.13.9: - resolution: - { - integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==, - } - dev: true - - /regenerator-transform/0.15.0: - resolution: - { - integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==, - } - dependencies: - '@babel/runtime': 7.19.4 - dev: true - - /regex-not/1.0.2: - resolution: - { - integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==, - } - engines: { node: '>=0.10.0' } + + regenerate@1.4.2: {} + + regenerator-runtime@0.11.1: {} + + regenerator-runtime@0.13.11: {} + + regenerator-runtime@0.13.5: {} + + regex-not@1.0.2: dependencies: extend-shallow: 3.0.2 safe-regex: 1.1.0 - dev: true - /regexp-tree/0.1.24: - resolution: - { - integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==, - } - hasBin: true - dev: true + regexp-tree@0.1.27: {} - /regexp.prototype.flags/1.4.3: - resolution: - { - integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==, - } - engines: { node: '>= 0.4' } + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 - dev: true - - /regexpp/3.2.0: - resolution: - { - integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, - } - engines: { node: '>=8' } - dev: true - - /regexpu-core/5.2.1: - resolution: - { - integrity: sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==, - } - engines: { node: '>=4' } + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsgen: 0.7.1 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.0.0 - dev: true + unicode-match-property-value-ecmascript: 2.2.0 - /registry-auth-token/3.4.0: - resolution: - { - integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==, - } + registry-auth-token@3.4.0: dependencies: rc: 1.2.8 safe-buffer: 5.2.1 - dev: true - /registry-url/3.1.0: - resolution: - { - integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==, - } - engines: { node: '>=0.10.0' } + registry-url@3.1.0: dependencies: rc: 1.2.8 - dev: true - - /regjsgen/0.7.1: - resolution: - { - integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==, - } - dev: true - - /regjsparser/0.9.1: - resolution: - { - integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, - } - hasBin: true + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: dependencies: - jsesc: 0.5.0 - dev: true + jsesc: 3.0.2 - /rehype-autolink-headings/4.0.0: - resolution: - { - integrity: sha512-2lglJ+4S3A4RCz+zlKVWj1wHvwO4bjunAoEOgMfjphT59EVXwdMiJzrL/A2fuAX/33k/LhkGW6BEK1Cl1I5WQw==, - } + rehype-autolink-headings@4.0.0: dependencies: extend: 3.0.2 hast-util-has-property: 1.0.4 hast-util-is-element: 1.1.0 unist-util-visit: 2.0.3 - dev: true - /rehype-mathjax/3.1.0: - resolution: - { - integrity: sha512-Pmz92Y56lBFmDjFc9nIdrKu1xzKSBYevcwKiKiG7b5JJg74q1E62nRSbPEm37vXaXn7Bn25iRsWcP39bJKkMxg==, - } + rehype-mathjax@3.1.0: dependencies: '@types/mathjax': 0.0.36 hast-util-from-dom: 3.0.0 @@ -17955,199 +16712,94 @@ packages: - canvas - supports-color - utf-8-validate - dev: true - /rehype-remove-comments/4.0.2: - resolution: - { - integrity: sha512-E2FNohTuIs7QzUnEQs3SdYdCScsTgUN7yPeDNWi+gsvx+pbLzIAyp27TWz3Gm64jpdLi7/6HxyRHxdd1NVQ37A==, - } + rehype-remove-comments@4.0.2: dependencies: hast-util-is-conditional-comment: 1.0.4 unist-util-filter: 2.0.3 - dev: true - /rehype-stringify/8.0.0: - resolution: - { - integrity: sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==, - } + rehype-stringify@8.0.0: dependencies: hast-util-to-html: 7.1.3 - dev: true - /remark-frontmatter/3.0.0: - resolution: - { - integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==, - } + remark-frontmatter@3.0.0: dependencies: mdast-util-frontmatter: 0.2.0 micromark-extension-frontmatter: 0.2.2 - dev: true - /remark-gfm/1.0.0: - resolution: - { - integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==, - } + remark-gfm@1.0.0: dependencies: mdast-util-gfm: 0.1.2 micromark-extension-gfm: 0.3.3 transitivePeerDependencies: - supports-color - dev: true - /remark-math/4.0.0: - resolution: - { - integrity: sha512-lH7SoQenXtQrvL0bm+mjZbvOk//YWNuyR+MxV18Qyv8rgFmMEGNuB0TSCQDkoDaiJ40FCnG8lxErc/zhcedYbw==, - } + remark-math@4.0.0: dependencies: mdast-util-math: 0.1.2 micromark-extension-math: 0.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-parse/9.0.0: - resolution: - { - integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==, - } + remark-parse@9.0.0: dependencies: mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - dev: true - /remark-rehype/8.1.0: - resolution: - { - integrity: sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==, - } + remark-rehype@8.1.0: dependencies: mdast-util-to-hast: 10.2.0 - dev: true - /remark-stringify/9.0.1: - resolution: - { - integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==, - } + remark-stringify@9.0.1: dependencies: mdast-util-to-markdown: 0.6.5 - dev: true - /remark/13.0.0: - resolution: - { - integrity: sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==, - } + remark@13.0.0: dependencies: remark-parse: 9.0.0 remark-stringify: 9.0.1 unified: 9.2.2 transitivePeerDependencies: - supports-color - dev: true - /remote-origin-url/0.4.0: - resolution: - { - integrity: sha512-HYhdsT2pNd0LP4Osb0vtQ1iassxIc3Yk1oze7j8dMJFciMkW8e0rdg9E/mOunqtSVHSzvMfwLDIYzPnEDmpk6Q==, - } - engines: { node: '>= 0.8.0' } + remote-origin-url@0.4.0: dependencies: parse-git-config: 0.2.0 - dev: true - /remote-origin-url/0.5.3: - resolution: - { - integrity: sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg==, - } - engines: { node: '>= 0.8.0' } + remote-origin-url@0.5.3: dependencies: parse-git-config: 1.1.1 - dev: true - /remove-bom-buffer/3.0.0: - resolution: - { - integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==, - } - engines: { node: '>=0.10.0' } + remove-bom-buffer@3.0.0: dependencies: is-buffer: 1.1.6 is-utf8: 0.2.1 - dev: true - /remove-bom-stream/1.2.0: - resolution: - { - integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==, - } - engines: { node: '>= 0.10' } + remove-bom-stream@1.2.0: dependencies: remove-bom-buffer: 3.0.0 safe-buffer: 5.2.1 through2: 2.0.5 - dev: true - - /remove-trailing-separator/1.1.0: - resolution: - { - integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, - } - dev: true - - /repeat-element/1.1.4: - resolution: - { - integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /repeat-string/1.6.1: - resolution: - { - integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, - } - engines: { node: '>=0.10' } - dev: true - - /replace-ext/1.0.1: - resolution: - { - integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==, - } - engines: { node: '>= 0.10' } - dev: true - - /replace-homedir/1.0.0: - resolution: - { - integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==, - } - engines: { node: '>= 0.10' } + + remove-trailing-separator@1.1.0: {} + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + replace-ext@1.0.1: {} + + replace-homedir@1.0.0: dependencies: homedir-polyfill: 1.0.3 is-absolute: 1.0.0 remove-trailing-separator: 1.1.0 - dev: true - - /request/2.88.2: - resolution: - { - integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==, - } - engines: { node: '>= 6' } - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + request@2.88.2: dependencies: aws-sign2: 0.7.0 - aws4: 1.11.0 + aws4: 1.13.2 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -18166,795 +16818,367 @@ packages: tough-cookie: 2.5.0 tunnel-agent: 0.6.0 uuid: 3.4.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' } - dev: true - - /require-main-filename/1.0.1: - resolution: - { - integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==, - } - dev: true - - /require-main-filename/2.0.0: - resolution: - { - integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, - } - dev: true - - /requires-port/1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } - dev: true - - /reserved-words/0.1.2: - resolution: - { - integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==, - } - dev: true - - /resize-observer-polyfill/1.5.1: - resolution: - { - integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==, - } - - /resolve-cwd/2.0.0: - resolution: - { - integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==, - } - engines: { node: '>=4' } - dependencies: - resolve-from: 3.0.0 - dev: true - /resolve-cwd/3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: '>=8' } + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@1.0.1: {} + + requires-port@1.0.0: {} + + reserved-words@0.1.2: {} + + resize-observer-polyfill@1.5.1: {} + + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - dev: true - /resolve-dir/0.1.1: - resolution: - { - integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==, - } - engines: { node: '>=0.10.0' } + resolve-dir@0.1.1: dependencies: expand-tilde: 1.2.2 global-modules: 0.2.3 - dev: true - /resolve-dir/1.0.1: - resolution: - { - integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, - } - engines: { node: '>=0.10.0' } + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - dev: true - - /resolve-from/3.0.0: - resolution: - { - integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==, - } - engines: { node: '>=4' } - 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-global/1.0.0: - resolution: - { - integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, - } - engines: { node: '>=8' } + + resolve-from@3.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-global@1.0.0: dependencies: global-dirs: 0.1.1 - dev: true - /resolve-options/1.1.0: - resolution: - { - integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==, - } - engines: { node: '>= 0.10' } + resolve-options@1.1.0: dependencies: value-or-function: 3.0.0 - dev: true - - /resolve-pathname/3.0.0: - resolution: - { - integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==, - } - dev: true - - /resolve-url/0.2.1: - resolution: - { - integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==, - } - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: true - - /resolve.exports/1.1.0: - resolution: - { - integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==, - } - engines: { node: '>=10' } - dev: true - - /resolve/1.22.1: - resolution: - { - integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==, - } - hasBin: true + + resolve-pathname@3.0.0: {} + + resolve-url@0.2.1: {} + + resolve@1.22.10: dependencies: - is-core-module: 2.10.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve/2.0.0-next.4: - resolution: - { - integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==, - } - hasBin: true + resolve@2.0.0-next.5: dependencies: - is-core-module: 2.10.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor/2.0.0: - resolution: - { - integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, - } - engines: { node: '>=4' } + restore-cursor@2.0.0: dependencies: onetime: 2.0.1 signal-exit: 3.0.7 - dev: true - - /ret/0.1.15: - resolution: - { - integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, - } - engines: { node: '>=0.12' } - dev: true - - /retry/0.10.1: - resolution: - { - integrity: sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==, - } - dev: true - - /reusify/1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } - dev: true - - /rimraf/2.7.1: - resolution: - { - integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, - } - hasBin: true + + ret@0.1.15: {} + + retry@0.10.1: {} + + reusify@1.1.0: {} + + rimraf@2.7.1: dependencies: glob: 7.2.3 - dev: true - /rimraf/3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /ripemd160/2.0.2: - resolution: - { - integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, - } + ripemd160@2.0.1: + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + + ripemd160@2.0.2: dependencies: - hash-base: 3.1.0 + hash-base: 3.0.5 inherits: 2.0.4 - dev: true - - /rst-selector-parser/2.2.3: - resolution: - { - integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==, - } - dependencies: - lodash.flattendeep: 4.4.0 - nearley: 2.20.1 - dev: true - - /rtl-css-js/1.16.0: - resolution: - { - integrity: sha512-Oc7PnzwIEU4M0K1J4h/7qUUaljXhQ0kCObRsZjxs2HjkpKsnoTMvSmvJ4sqgJZd0zBoEfAyTdnK/jMIYvrjySQ==, - } - dependencies: - '@babel/runtime': 7.19.4 - dev: true - - /run-async/2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: '>=0.12.0' } - dev: true - - /run-parallel/1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + + rollup@4.48.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.48.0 + '@rollup/rollup-android-arm64': 4.48.0 + '@rollup/rollup-darwin-arm64': 4.48.0 + '@rollup/rollup-darwin-x64': 4.48.0 + '@rollup/rollup-freebsd-arm64': 4.48.0 + '@rollup/rollup-freebsd-x64': 4.48.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.48.0 + '@rollup/rollup-linux-arm-musleabihf': 4.48.0 + '@rollup/rollup-linux-arm64-gnu': 4.48.0 + '@rollup/rollup-linux-arm64-musl': 4.48.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.48.0 + '@rollup/rollup-linux-ppc64-gnu': 4.48.0 + '@rollup/rollup-linux-riscv64-gnu': 4.48.0 + '@rollup/rollup-linux-riscv64-musl': 4.48.0 + '@rollup/rollup-linux-s390x-gnu': 4.48.0 + '@rollup/rollup-linux-x64-gnu': 4.48.0 + '@rollup/rollup-linux-x64-musl': 4.48.0 + '@rollup/rollup-win32-arm64-msvc': 4.48.0 + '@rollup/rollup-win32-ia32-msvc': 4.48.0 + '@rollup/rollup-win32-x64-msvc': 4.48.0 + fsevents: 2.3.3 + + rrweb-cssom@0.8.0: {} + + run-async@2.4.1: {} + + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /run-queue/1.0.3: - resolution: - { - integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==, - } + run-queue@1.0.3: dependencies: aproba: 1.2.0 - dev: true - /rxjs/6.6.7: - resolution: - { - integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, - } - engines: { npm: '>=2.0.0' } + rxjs@6.6.7: dependencies: tslib: 1.14.1 - dev: true - - /safe-buffer/5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } - dev: true - - /safe-buffer/5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: true - - /safe-regex-test/1.0.0: - resolution: - { - integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, - } - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - is-regex: 1.1.4 - dev: true - - /safe-regex/1.1.0: - resolution: - { - integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==, - } + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: dependencies: ret: 0.1.15 - dev: true - - /safe-regex/2.1.1: - resolution: - { - integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==, - } - dependencies: - regexp-tree: 0.1.24 - dev: true - - /safer-buffer/2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - dev: true - - /sass-loader/8.0.2_sass@1.55.0+webpack@4.46.0: - resolution: - { - integrity: sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==, - } - engines: { node: '>= 8.9.0' } - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 - sass: ^1.3.0 - webpack: ^4.36.0 || ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true + + safe-regex@2.1.1: dependencies: - clone-deep: 4.0.1 - loader-utils: 1.4.0 - neo-async: 2.6.2 - sass: 1.55.0 - schema-utils: 2.7.1 - semver: 6.3.0 - webpack: 4.46.0_webpack-cli@3.3.12 - dev: true - - /sass/1.55.0: - resolution: - { - integrity: sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==, - } - engines: { node: '>=12.0.0' } - hasBin: true + regexp-tree: 0.1.27 + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + saxes@5.0.1: dependencies: - chokidar: 3.5.3 - immutable: 4.1.0 - source-map-js: 1.0.2 - dev: true - - /sax/1.2.4: - resolution: - { - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, - } - dev: true - - /saxes/5.0.1: - resolution: - { - integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==, - } - engines: { node: '>=10' } + xmlchars: 2.2.0 + + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - /scheduler/0.19.1: - resolution: - { - integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==, - } + scheduler@0.19.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - dev: true - /schema-utils/1.0.0: - resolution: - { - integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==, - } - engines: { node: '>= 4' } + scheduler@0.26.0: {} + + schema-utils@1.0.0: dependencies: ajv: 6.12.6 - ajv-errors: 1.0.1_ajv@6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true - - /schema-utils/2.7.1: - resolution: - { - integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==, - } - engines: { node: '>= 8.9.0' } - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/3.1.1: - resolution: - { - integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==, - } - engines: { node: '>= 10.13.0' } + schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true - - /screenfull/5.2.0: - resolution: - { - integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==, - } - engines: { node: '>=0.10.0' } - - /scroll-into-view-if-needed/2.2.29: - resolution: - { - integrity: sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==, - } - dependencies: - compute-scroll-into-view: 1.0.17 - dev: true - - /section-matter/1.0.0: - resolution: - { - integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==, - } - engines: { node: '>=4' } + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + screenfull@5.2.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - dev: true - /semver-diff/2.1.0: - resolution: - { - integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==, - } - engines: { node: '>=0.10.0' } + semver-diff@2.1.0: dependencies: - semver: 5.7.1 - dev: true + semver: 5.7.2 - /semver-greatest-satisfied-range/1.1.0: - resolution: - { - integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==, - } - engines: { node: '>= 0.10' } + semver-greatest-satisfied-range@1.1.0: dependencies: sver-compat: 1.5.0 - dev: true - /semver/5.7.1: - resolution: - { - integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, - } - hasBin: true - dev: true + semver@5.7.2: {} - /semver/6.3.0: - resolution: - { - integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, - } - hasBin: true - dev: true - - /semver/7.3.7: - resolution: - { - integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==, - } - engines: { node: '>=10' } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver/7.3.8: - resolution: - { - integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, - } - engines: { node: '>=10' } - hasBin: true + semver@6.3.1: {} + + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /serialize-javascript/4.0.0: - resolution: - { - integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, - } + semver@7.7.2: {} + + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /serialize-javascript/5.0.1: - resolution: - { - integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==, - } + set-blocking@2.0.0: {} + + set-function-length@1.2.2: dependencies: - randombytes: 2.1.0 - dev: true - - /set-blocking/2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } - dev: true - - /set-harmonic-interval/1.0.1: - resolution: - { - integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==, - } - engines: { node: '>=6.9' } - dev: true - - /set-value/2.0.1: - resolution: - { - integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, - } - engines: { node: '>=0.10.0' } + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + set-value@2.0.1: dependencies: extend-shallow: 2.0.1 is-extendable: 0.1.1 is-plain-object: 2.0.4 split-string: 3.1.0 - dev: true - - /setimmediate/1.0.5: - resolution: - { - integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, - } - dev: true - - /sha.js/2.4.11: - resolution: - { - integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, - } - hasBin: true + + setimmediate@1.0.5: {} + + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true + to-buffer: 1.2.1 - /shallow-clone/3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: '>=8' } + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - dev: true - /shallow-element-equals/1.0.1: - resolution: - { - integrity: sha512-TwyvU5ZIISuZAmX7juTupVggTW9avkp+Swz0amKicADbQrnhP5kAPkPbL8gKSFv9QkkzhTg2u3Se6TjGhn1xlQ==, - } + shallow-element-equals@1.0.1: dependencies: style-equal: 1.0.0 - dev: true - - /shallowequal/1.1.0: - resolution: - { - integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==, - } - dev: true - - /shebang-command/1.2.0: - resolution: - { - integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, - } - engines: { node: '>=0.10.0' } + + shallowequal@1.1.0: {} + + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: true - /shebang-command/2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - - /shebang-regex/1.0.0: - resolution: - { - integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /shebang-regex/3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } - dev: true - - /shortid/2.2.16: - resolution: - { - integrity: sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==, - } - dependencies: - nanoid: 2.1.11 - dev: true - - /side-channel/1.0.4: - resolution: - { - integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, - } - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - object-inspect: 1.12.2 - dev: true - - /signal-exit/3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: true - - /sisteransi/1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } - dev: true - - /sitemap/6.4.0: - resolution: - { - integrity: sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==, - } - engines: { node: '>=10.3.0', npm: '>=5.6.0' } - hasBin: true + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shortid@2.2.17: + dependencies: + nanoid: 3.3.11 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: dependencies: - '@types/node': 14.18.32 - '@types/sax': 1.2.4 + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sitemap@6.4.0: + dependencies: + '@types/node': 14.18.63 + '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.2.4 - dev: true - - /slash/2.0.0: - resolution: - { - integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==, - } - engines: { node: '>=6' } - dev: true - - /slash/3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: '>=8' } - dev: true - - /slash2/2.0.0: - resolution: - { - integrity: sha512-7ElvBydJPi3MHU/KEOblFSbO/skl4Z69jKkFCpYIYVOMSIZsKi4gYU43HGeZPmjxCXrHekoDAAewphPQNnsqtA==, - } - engines: { node: '>=6' } - dev: true - - /slice-ansi/4.0.0: - resolution: - { - integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, - } - engines: { node: '>=10' } + sax: 1.4.1 + + slash2@2.0.0: {} + + slash@2.0.0: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true - - /smart-buffer/1.1.15: - resolution: - { - integrity: sha512-1+8bxygjTsNfvQe0/0pNBesTOlSHtOeG6b6LYbvsZCCHDKYZ40zcQo6YTnZBWrBSLWOCbrHljLdEmGMYebu7aQ==, - } - engines: { node: '>= 0.10.15', npm: '>= 1.3.5' } - dev: true - - /snapdragon-node/2.1.1: - resolution: - { - integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, - } - engines: { node: '>=0.10.0' } + + smart-buffer@1.1.15: {} + + snapdragon-node@2.1.1: dependencies: define-property: 1.0.0 isobject: 3.0.1 snapdragon-util: 3.0.1 - dev: true - /snapdragon-util/3.0.1: - resolution: - { - integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==, - } - engines: { node: '>=0.10.0' } + snapdragon-util@3.0.1: dependencies: kind-of: 3.2.2 - dev: true - /snapdragon/0.8.2: - resolution: - { - integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, - } - engines: { node: '>=0.10.0' } + snapdragon@0.8.2: dependencies: base: 0.11.2 debug: 2.6.9 @@ -18966,72 +17190,24 @@ packages: use: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - - /snapdragon/0.8.2_supports-color@6.1.0: - resolution: - { - integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, - } - engines: { node: '>=0.10.0' } - dependencies: - base: 0.11.2 - debug: 2.6.9_supports-color@6.1.0 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /socks-proxy-agent/3.0.1: - resolution: - { - integrity: sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==, - } + socks-proxy-agent@3.0.1: dependencies: agent-base: 4.3.0 socks: 1.1.10 - dev: true - - /socks/1.1.10: - resolution: - { - integrity: sha512-ArX4vGPULWjKDKgUnW8YzfI2uXW7kzgkJuB0GnFBA/PfT3exrrOk+7Wk2oeb894Qf20u1PWv9LEgrO0Z82qAzA==, - } - engines: { node: '>= 0.10.0', npm: '>= 1.3.5' } - deprecated: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0 + + socks@1.1.10: dependencies: - ip: 1.1.8 + ip: 1.1.9 smart-buffer: 1.1.15 - dev: true - /sort-keys/1.1.2: - resolution: - { - integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==, - } - engines: { node: '>=0.10.0' } + sort-keys@1.1.2: dependencies: is-plain-obj: 1.1.0 - dev: true - - /sort-object-keys/1.1.3: - resolution: - { - integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==, - } - dev: true - - /sort-package-json/1.57.0: - resolution: - { - integrity: sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==, - } - hasBin: true + + sort-object-keys@1.1.3: {} + + sort-package-json@1.57.0: dependencies: detect-indent: 6.1.0 detect-newline: 3.1.0 @@ -19039,212 +17215,75 @@ packages: globby: 10.0.0 is-plain-obj: 2.1.0 sort-object-keys: 1.1.3 - dev: true - - /source-list-map/2.0.1: - resolution: - { - integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==, - } - dev: true - - /source-map-js/1.0.2: - resolution: - { - integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /source-map-resolve/0.5.3: - resolution: - { - integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==, - } - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: dependencies: atob: 2.1.2 - decode-uri-component: 0.2.0 + decode-uri-component: 0.2.2 resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 - dev: true - /source-map-support/0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map-url/0.4.1: - resolution: - { - integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==, - } - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: true - - /source-map/0.5.6: - resolution: - { - integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /source-map/0.5.7: - resolution: - { - integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /source-map/0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: '>=0.10.0' } - dev: true - - /source-map/0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: '>= 8' } - dev: true - - /sourcemap-codec/1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - dev: true - - /space-separated-tokens/1.1.5: - resolution: - { - integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==, - } - dev: true - - /sparkles/1.0.1: - resolution: - { - integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==, - } - engines: { node: '>= 0.10' } - dev: true - - /spdx-correct/3.1.1: - resolution: - { - integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==, - } + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@1.1.5: {} + + sparkles@1.0.1: {} + + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 - dev: true - - /spdx-exceptions/2.3.0: - resolution: - { - integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, - } - dev: true - - /spdx-expression-parse/3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 - dev: true - - /spdx-license-ids/3.0.12: - resolution: - { - integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==, - } - dev: true - - /specificity/0.4.1: - resolution: - { - integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==, - } - hasBin: true - dev: true + spdx-license-ids: 3.0.22 - /speech-rule-engine/4.0.7: - resolution: - { - integrity: sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==, - } - hasBin: true + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + specificity@0.4.1: {} + + speech-rule-engine@4.1.2: dependencies: - commander: 9.2.0 + '@xmldom/xmldom': 0.9.8 + commander: 13.1.0 wicked-good-xpath: 1.3.0 - xmldom-sre: 0.1.31 - dev: true - - /split-on-first/1.1.0: - resolution: - { - integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==, - } - engines: { node: '>=6' } - - /split-string/3.1.0: - resolution: - { - integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, - } - engines: { node: '>=0.10.0' } + + split-on-first@1.1.0: {} + + split-on-first@3.0.0: {} + + split-string@3.1.0: dependencies: extend-shallow: 3.0.2 - dev: true - /split/0.3.1: - resolution: - { - integrity: sha512-hCHXkQDs1HFKRsrT9EutGT1hmjS1FW1Aei8dk/CxrT7mslcMtAxbiv8LYA/AYDvjB6h9rSXgW8zAZwg20tKMTw==, - } + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + split@0.3.1: dependencies: through: 2.3.8 - dev: true - - /split2/3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } - dependencies: - readable-stream: 3.6.0 - dev: true - - /sprintf-js/1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } - dev: true - - /sshpk/1.17.0: - resolution: - { - integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==, - } - engines: { node: '>=0.10.0' } - hasBin: true + + sprintf-js@1.0.3: {} + + sshpk@1.18.0: dependencies: asn1: 0.2.6 assert-plus: 1.0.0 @@ -19255,559 +17294,249 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 tweetnacl: 0.14.5 - dev: true - /ssr-window/3.0.0: - resolution: - { - integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==, - } - dev: true + ssr-window@3.0.0: {} - /ssri/4.1.6: - resolution: - { - integrity: sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==, - } + ssri@4.1.6: dependencies: safe-buffer: 5.2.1 - dev: true - /ssri/5.3.0: - resolution: - { - integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==, - } + ssri@5.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /ssri/6.0.2: - resolution: - { - integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==, - } - dependencies: - figgy-pudding: 3.5.2 - dev: true + stack-trace@0.0.10: {} - /stack-generator/2.0.10: - resolution: - { - integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==, - } - dependencies: - stackframe: 1.3.4 - dev: true - - /stack-trace/0.0.10: - resolution: - { - integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==, - } - dev: true - - /stack-utils/2.0.5: - resolution: - { - integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==, - } - engines: { node: '>=10' } - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stackframe/1.3.4: - resolution: - { - integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, - } - dev: true - - /stacktrace-gps/3.1.2: - resolution: - { - integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==, - } - dependencies: - source-map: 0.5.6 - stackframe: 1.3.4 - dev: true + stackback@0.0.2: {} - /stacktrace-js/2.0.2: - resolution: - { - integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==, - } - dependencies: - error-stack-parser: 2.1.4 - stack-generator: 2.0.10 - stacktrace-gps: 3.1.2 - dev: true + stackframe@1.3.4: {} - /static-extend/0.1.2: - resolution: - { - integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, - } - engines: { node: '>=0.10.0' } + static-extend@0.1.2: dependencies: define-property: 0.2.5 object-copy: 0.1.0 - dev: true - /stream-browserify/2.0.2: - resolution: - { - integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==, - } + std-env@3.9.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stream-browserify@2.0.2: dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 - dev: true - - /stream-each/1.2.3: - resolution: - { - integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==, - } - dependencies: - end-of-stream: 1.4.4 - stream-shift: 1.0.1 - dev: true - - /stream-exhaust/1.0.2: - resolution: - { - integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==, - } - dev: true - - /stream-http/2.8.3: - resolution: - { - integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==, - } + readable-stream: 2.3.8 + + stream-each@1.2.3: + dependencies: + end-of-stream: 1.4.5 + stream-shift: 1.0.3 + + stream-exhaust@1.0.2: {} + + stream-http@2.8.3: dependencies: builtin-status-codes: 3.0.0 inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 to-arraybuffer: 1.0.1 xtend: 4.0.2 - dev: true - - /stream-shift/1.0.1: - resolution: - { - integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==, - } - dev: true - - /strict-uri-encode/1.1.0: - resolution: - { - integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /strict-uri-encode/2.0.0: - resolution: - { - integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==, - } - engines: { node: '>=4' } - - /string-convert/0.2.1: - resolution: - { - integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==, - } - 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/1.0.2: - resolution: - { - integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==, - } - engines: { node: '>=0.10.0' } + stream-shift@1.0.3: {} + + strict-uri-encode@1.1.0: {} + + strict-uri-encode@2.0.0: {} + + string-convert@0.2.1: {} + + string-width@1.0.2: dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: true - /string-width/2.1.1: - resolution: - { - integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, - } - engines: { node: '>=4' } + string-width@2.1.1: dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 - dev: true - /string-width/3.1.0: - resolution: - { - integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==, - } - engines: { node: '>=6' } - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - dev: true - - /string-width/4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - - /string.prototype.matchall/4.0.7: - resolution: - { - integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==, - } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 - dev: true - - /string.prototype.trim/1.2.6: - resolution: - { - integrity: sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==, - } - engines: { node: '>= 0.4' } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /string.prototype.trimend/1.0.5: - resolution: - { - integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==, - } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /string.prototype.trimstart/1.0.5: - resolution: - { - integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==, - } - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - dev: true - - /string_decoder/1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder/1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-entities/3.1.0: - resolution: - { - integrity: sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==, - } + stringify-entities@3.1.0: dependencies: character-entities-html4: 1.1.4 character-entities-legacy: 1.1.4 xtend: 4.0.2 - dev: true - /stringify-object/3.3.0: - resolution: - { - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, - } - engines: { node: '>=4' } + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: true - /strip-ansi/3.0.1: - resolution: - { - integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, - } - engines: { node: '>=0.10.0' } + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - dev: true - /strip-ansi/4.0.0: - resolution: - { - integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, - } - engines: { node: '>=4' } + strip-ansi@4.0.0: dependencies: ansi-regex: 3.0.1 - dev: true - /strip-ansi/5.2.0: - resolution: - { - integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==, - } - engines: { node: '>=6' } + strip-ansi@5.2.0: dependencies: ansi-regex: 4.1.1 - dev: true - /strip-ansi/6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - - /strip-bom-string/1.0.0: - resolution: - { - integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==, - } - engines: { node: '>=0.10.0' } - dev: true - - /strip-bom/2.0.0: - resolution: - { - integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==, - } - engines: { node: '>=0.10.0' } + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.0 + + strip-bom-string@1.0.0: {} + + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 - dev: true - - /strip-bom/4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: '>=8' } - dev: true - - /strip-eof/1.0.0: - resolution: - { - integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==, - } - engines: { node: '>=0.10.0' } - 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' } + + strip-eof@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - - /strip-json-comments/2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /strip-json-comments/3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } - dev: true - - /style-equal/1.0.0: - resolution: - { - integrity: sha512-gf20kfwh7eXsgPcwvYqViCBHr+GXIlpXOZR1wQftNH4/ee2P/yolWUVA/MdMdmMp+0BMfvaMKSIR1DQlY64Btw==, - } - dev: true - - /style-search/0.1.0: - resolution: - { - integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==, - } - dev: true - - /style-to-object/0.3.0: - resolution: - { - integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==, - } + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + style-equal@1.0.0: {} + + style-search@0.1.0: {} + + style-to-object@0.3.0: dependencies: inline-style-parser: 0.1.1 - dev: true - /style-unit/2.0.1: - resolution: - { - integrity: sha512-1OHU+0lWHrK22W3DDfLKFl5cOIwTxghbVRgtzgue+/9m5dqsYQhVBObQupMdtN6FIhpM375l18h8nLqPKgHfPQ==, - } + style-unit@2.0.1: dependencies: universal-env: 2.0.0 - dev: true - /style-unit/3.0.5: - resolution: - { - integrity: sha512-xL+kev1W1dPthdhpQqZs9Qk1zenQiHKyy9oy2/VasW4z6wi7m7qQvMe67foPsr99JSs0115X0TCN1ch1n0XqSw==, - } + style-unit@3.0.5: dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.28.3 universal-env: 3.3.3 - dev: true - /stylelint-config-css-modules/2.3.0_stylelint@13.13.1: - resolution: - { - integrity: sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==, - } - peerDependencies: - stylelint: 11.x - 14.x + stylelint-config-css-modules@2.3.0(stylelint@13.13.1): dependencies: stylelint: 13.13.1 - dev: true - - /stylelint-config-prettier/8.0.2_stylelint@13.13.1: - resolution: - { - integrity: sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==, - } - engines: { node: '>= 10', npm: '>= 5' } - hasBin: true - peerDependencies: - stylelint: '>=11.0.0' + + stylelint-config-prettier@8.0.2(stylelint@13.13.1): dependencies: stylelint: 13.13.1 - dev: true - /stylelint-config-recommended/3.0.0_stylelint@13.13.1: - resolution: - { - integrity: sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==, - } - peerDependencies: - stylelint: '>=10.1.0' + stylelint-config-recommended@3.0.0(stylelint@13.13.1): dependencies: stylelint: 13.13.1 - dev: true - /stylelint-config-standard/20.0.0_stylelint@13.13.1: - resolution: - { - integrity: sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==, - } - peerDependencies: - stylelint: '>=10.1.0' + stylelint-config-standard@20.0.0(stylelint@13.13.1): dependencies: stylelint: 13.13.1 - stylelint-config-recommended: 3.0.0_stylelint@13.13.1 - dev: true - - /stylelint-declaration-block-no-ignored-properties/2.5.0_stylelint@13.13.1: - resolution: - { - integrity: sha512-UNz5nUC5GMgMb6GPc/pHUTC0+ydxTdj2mUn7XcKRdwQoiUzzUmWWdSf1aFv2UzrW4x8JYNReE1u5JOj7g0ThJw==, - } - engines: { node: '>=6' } - peerDependencies: - stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 + stylelint-config-recommended: 3.0.0(stylelint@13.13.1) + + stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@13.13.1): dependencies: stylelint: 13.13.1 - dev: true - - /stylelint/13.13.1: - resolution: - { - integrity: sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==, - } - engines: { node: '>=10.13.0' } - hasBin: true + + stylelint@13.13.1: dependencies: - '@stylelint/postcss-css-in-js': 0.37.3_j55xdkkcxc32kvnyvx3y7casfm - '@stylelint/postcss-markdown': 0.36.2_j55xdkkcxc32kvnyvx3y7casfm + '@stylelint/postcss-css-in-js': 0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39) + '@stylelint/postcss-markdown': 0.36.2(postcss-syntax@0.36.2)(postcss@7.0.39) autoprefixer: 9.8.8 balanced-match: 2.0.0 chalk: 4.1.2 - cosmiconfig: 7.0.1 - debug: 4.3.4 + cosmiconfig: 7.1.0 + debug: 4.4.1 execall: 2.0.0 - fast-glob: 3.2.12 + fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 6.0.1 get-stdin: 8.0.0 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 - html-tags: 3.2.0 - ignore: 5.2.0 + html-tags: 3.3.1 + ignore: 5.3.2 import-lazy: 4.0.0 imurmurhash: 0.1.4 known-css-properties: 0.21.0 @@ -19815,18 +17544,18 @@ packages: log-symbols: 4.1.0 mathml-tag-names: 2.1.3 meow: 9.0.0 - micromatch: 4.0.5 + micromatch: 4.0.8 normalize-selector: 0.2.0 postcss: 7.0.39 - postcss-html: 0.36.0_j55xdkkcxc32kvnyvx3y7casfm + postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39) postcss-less: 3.1.4 postcss-media-query-parser: 0.2.3 - postcss-resolve-nested-selector: 0.1.1 + postcss-resolve-nested-selector: 0.1.6 postcss-safe-parser: 4.0.2 postcss-sass: 0.4.4 postcss-scss: 2.1.1 - postcss-selector-parser: 6.0.10 - postcss-syntax: 0.36.2_postcss@7.0.39 + postcss-selector-parser: 6.1.2 + postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39) postcss-value-parser: 4.2.0 resolve-from: 5.0.0 slash: 3.0.0 @@ -19836,114 +17565,52 @@ packages: style-search: 0.1.0 sugarss: 2.0.0 svg-tags: 1.0.0 - table: 6.8.0 - v8-compile-cache: 2.3.0 + table: 6.9.0 + v8-compile-cache: 2.4.0 write-file-atomic: 3.0.3 transitivePeerDependencies: - postcss-jsx - postcss-markdown - supports-color - dev: true - /stylis/4.1.2: - resolution: - { - integrity: sha512-Nn2CCrG2ZaFziDxaZPN43CXqn+j7tcdjPFCkRBkFue8QYXC2HdEwnw5TCBo4yQZ2WxKYeSi0fdoOrtEqgDrXbA==, - } - dev: true + stylis@4.3.6: {} - /sugarss/2.0.0: - resolution: - { - integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==, - } + sugarss@2.0.0: dependencies: postcss: 7.0.39 - dev: true - /supports-color/5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: '>=4' } + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color/6.1.0: - resolution: - { - integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==, - } - engines: { node: '>=6' } + supports-color@6.1.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color/7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-color/8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: '>=10' } + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-hyperlinks/2.3.0: - resolution: - { - integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, - } - engines: { node: '>=8' } + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true - - /supports-preserve-symlinks-flag/1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } - dev: true - - /surge-fstream-ignore/1.0.6: - resolution: - { - integrity: sha512-hNN52cz2fYCAzhlHmWPn4aE3bFbpBt01AkWFLljrtSzFvxlipLAeLuLtQ3t4f0RKoUkjzXWCAFK13WoET2iM1A==, - } + + supports-preserve-symlinks-flag@1.0.0: {} + + surge-fstream-ignore@1.1.0: dependencies: fstream: 1.0.12 inherits: 2.0.4 - minimatch: 3.1.2 - dev: true - - /surge-ignore/0.2.0: - resolution: - { - integrity: sha512-ay4MPFjfiQzDsyTidljJLXQi22l2AwjcuamYnJWj/LdhaHdKmDJxRox52WXimdcLpMuLDtkQvv4+jEu+wu9eSw==, - } - dev: true - - /surge/0.21.7: - resolution: - { - integrity: sha512-XcMY2Z3I4kBZ1zVTOkeKmTcnAy/r9Mnu87+/3fAaN6ZCVnNy4Qtdh6ai77NwyORIltRP1cOn05sAi+nYoy5taQ==, - } - hasBin: true + minimatch: 7.4.6 + + surge-ignore@0.2.0: {} + + surge@0.21.7: dependencies: cli-table3: 0.5.1 colors: 1.4.0 @@ -19956,797 +17623,353 @@ packages: read: 1.0.5 request: 2.88.2 split: 0.3.1 - surge-fstream-ignore: 1.0.6 + surge-fstream-ignore: 1.1.0 surge-ignore: 0.2.0 tarr: 1.1.0 url-parse-as-address: 1.0.0 - dev: true - /sver-compat/1.5.0: - resolution: - { - integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==, - } + sver-compat@1.5.0: dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - dev: true - - /svg-tags/1.0.0: - resolution: - { - integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, - } - dev: true - - /swiper/6.5.0: - resolution: - { - integrity: sha512-cSx1SpfgrHlgwku++3Ce3cjPBpXgB7P+bGik5S3+F+j6ID0NUeV6qtmedFdr3C8jXR/W+TJPVNIT9fH/cwVAiA==, - } - engines: { node: '>= 4.7.0' } - requiresBuild: true + es6-symbol: 3.1.4 + + svg-tags@1.0.0: {} + + swiper@6.5.0: dependencies: dom7: 3.0.0 ssr-window: 3.0.0 - dev: true - - /symbol-tree/3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } - dev: true - - /table/6.8.0: - resolution: - { - integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==, - } - engines: { node: '>=10.0.0' } - dependencies: - ajv: 8.11.0 + + symbol-tree@3.2.4: {} + + table@6.9.0: + dependencies: + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - - /tapable/1.1.3: - resolution: - { - integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==, - } - engines: { node: '>=6' } - dev: true - - /tar-fs/1.16.3: - resolution: - { - integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==, - } + + tapable@1.1.3: {} + + tapable@2.2.3: {} + + tar-fs@1.16.5: dependencies: chownr: 1.1.4 mkdirp: 0.5.6 pump: 1.0.3 tar-stream: 1.6.2 - dev: true - /tar-stream/1.6.2: - resolution: - { - integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==, - } - engines: { node: '>= 0.8.0' } + tar-stream@1.6.2: dependencies: bl: 1.2.3 buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 - readable-stream: 2.3.7 - to-buffer: 1.1.1 + readable-stream: 2.3.8 + to-buffer: 1.2.1 xtend: 4.0.2 - dev: true - /tarr/1.1.0: - resolution: - { - integrity: sha512-tENbQ43IQckay71stp1p1lljRhoEZpZk10FzEZKW2tJcMcnLwV3CfZdxBAERlH6nwnFvnHMS9eJOJl6IzSsG0g==, - } + tarr@1.1.0: dependencies: block-stream: 0.0.9 fstream: 1.0.12 inherits: 2.0.4 - dev: true - /term-size/1.2.0: - resolution: - { - integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==, - } - engines: { node: '>=4' } + term-size@1.2.0: dependencies: execa: 0.7.0 - dev: true - /terminal-link/2.1.1: - resolution: - { - integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, - } - engines: { node: '>=8' } - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - dev: true - - /terser-webpack-plugin/1.4.5_webpack@4.46.0: - resolution: - { - integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==, - } - engines: { node: '>= 6.9.0' } - peerDependencies: - webpack: ^4.0.0 + terser-webpack-plugin@5.3.14(webpack@5.101.3): dependencies: - cacache: 12.0.4 - find-cache-dir: 2.1.0 - is-wsl: 1.1.0 - schema-utils: 1.0.0 - serialize-javascript: 4.0.0 - source-map: 0.6.1 - terser: 4.8.1 - webpack: 4.46.0_webpack-cli@3.3.12 - webpack-sources: 1.4.3 - worker-farm: 1.7.0 - dev: true - - /terser/4.8.1: - resolution: - { - integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==, - } - engines: { node: '>=6.0.0' } - hasBin: true - dependencies: - acorn: 8.8.0 - commander: 2.20.3 - source-map: 0.6.1 - source-map-support: 0.5.21 - dev: true - - /terser/5.15.1: - resolution: - { - integrity: sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==, - } - engines: { node: '>=10' } - hasBin: true + '@jridgewell/trace-mapping': 0.3.30 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.43.1 + webpack: 5.101.3(webpack-cli@6.0.1) + + terser@5.14.2: dependencies: - '@jridgewell/source-map': 0.3.2 - acorn: 8.8.0 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - - /terser/5.6.0: - resolution: - { - integrity: sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==, - } - engines: { node: '>=10' } - hasBin: true + + terser@5.43.1: dependencies: - acorn: 8.8.0 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 - source-map: 0.7.4 source-map-support: 0.5.21 - dev: true - /test-exclude/6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: '>=8' } + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions/1.9.0: - resolution: - { - integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, - } - engines: { node: '>=0.10' } - dev: true - - /text-table/0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - dev: true - - /textextensions/2.6.0: - resolution: - { - integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==, - } - engines: { node: '>=0.8' } - dev: true - - /throat/6.0.1: - resolution: - { - integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==, - } - dev: true - - /throttle-debounce/2.3.0: - resolution: - { - integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==, - } - engines: { node: '>=8' } - dev: true - - /through/2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } - dev: true - - /through2-filter/3.0.0: - resolution: - { - integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==, - } + glob: 10.4.5 + minimatch: 9.0.5 + + text-extensions@1.9.0: {} + + text-table@0.2.0: {} + + textextensions@2.6.0: {} + + throttle-debounce@5.0.2: {} + + through2-filter@3.0.0: dependencies: through2: 2.0.5 xtend: 4.0.2 - dev: true - /through2/2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } + through2@2.0.5: dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 - dev: true - /through2/3.0.2: - resolution: - { - integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==, - } + through2@3.0.2: dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 - dev: true - - /through2/4.0.2: - resolution: - { - integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, - } - dependencies: - readable-stream: 3.6.0 - dev: true - - /time-stamp/1.1.0: - resolution: - { - integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==, - } - engines: { node: '>=0.10.0' } - dev: true - - /timed-out/4.0.1: - resolution: - { - integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==, - } - engines: { node: '>=0.10.0' } - dev: true - - /timers-browserify/2.0.12: - resolution: - { - integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==, - } - engines: { node: '>=0.6.0' } + readable-stream: 3.6.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + time-stamp@1.1.0: {} + + timed-out@4.0.1: {} + + timers-browserify@2.0.12: dependencies: setimmediate: 1.0.5 - dev: true - - /tiny-invariant/1.3.1: - resolution: - { - integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==, - } - dev: true - - /tiny-warning/1.0.3: - resolution: - { - integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==, - } - dev: true - - /tmp/0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: '>=0.6.0' } + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - - /tmpl/1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } - dev: true - - /to-absolute-glob/2.0.2: - resolution: - { - integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==, - } - engines: { node: '>=0.10.0' } + + to-absolute-glob@2.0.2: dependencies: is-absolute: 1.0.0 is-negated-glob: 1.0.0 - dev: true - - /to-arraybuffer/1.0.1: - resolution: - { - integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==, - } - dev: true - - /to-buffer/1.1.1: - resolution: - { - integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==, - } - dev: true - - /to-fast-properties/2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: '>=4' } - dev: true - - /to-object-path/0.3.0: - resolution: - { - integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==, - } - engines: { node: '>=0.10.0' } + + to-arraybuffer@1.0.1: {} + + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-fast-properties@2.0.0: {} + + to-object-path@0.3.0: dependencies: kind-of: 3.2.2 - dev: true - /to-regex-range/2.1.1: - resolution: - { - integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, - } - engines: { node: '>=0.10.0' } + to-regex-range@2.1.1: dependencies: is-number: 3.0.0 repeat-string: 1.6.1 - dev: true - /to-regex-range/5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /to-regex/3.0.2: - resolution: - { - integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==, - } - engines: { node: '>=0.10.0' } + to-regex@3.0.2: dependencies: define-property: 2.0.2 extend-shallow: 3.0.2 regex-not: 1.0.2 safe-regex: 1.1.0 - dev: true - /to-through/2.0.0: - resolution: - { - integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==, - } - engines: { node: '>= 0.10' } + to-through@2.0.0: dependencies: through2: 2.0.5 - dev: true - - /toggle-selection/1.0.6: - resolution: - { - integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==, - } - dev: true - - /tough-cookie/2.5.0: - resolution: - { - integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==, - } - engines: { node: '>=0.8' } - dependencies: - psl: 1.9.0 - punycode: 2.1.1 - dev: true - - /tough-cookie/4.1.2: - resolution: - { - integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, - } - engines: { node: '>=6' } - dependencies: - psl: 1.9.0 - punycode: 2.1.1 + + toggle-selection@1.0.6: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true - - /tr46/0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: true - - /tr46/2.1.0: - resolution: - { - integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==, - } - engines: { node: '>=8' } - dependencies: - punycode: 2.1.1 - dev: true - - /trim-newlines/3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: '>=8' } - dev: true - - /trough/1.0.5: - resolution: - { - integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==, - } - dev: true - - /ts-easing/0.2.0: - resolution: - { - integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==, - } - dev: true - - /ts-jest/27.1.5_zgo3ukr7wfsrfu7w73hol4lxpy: - resolution: - { - integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@types/jest': ^27.0.0 - babel-jest: '>=27.0.0 <28' - esbuild: '*' - jest: ^27.0.0 - typescript: '>=3.8 <5.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/jest': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + + tough-cookie@5.1.2: dependencies: - '@babel/core': 7.19.3 - '@types/jest': 27.5.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 27.5.1_ts-node@10.9.1 - jest-util: 27.5.1 - json5: 2.2.1 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.3.8 - typescript: 4.8.4 - yargs-parser: 20.2.9 - dev: true + tldts: 6.1.86 - /ts-node/10.9.1_jcmx33t3olsvcxopqdljsohpme: - 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 + tr46@0.0.3: {} + + tr46@2.1.0: + dependencies: + punycode: 2.3.1 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + trim-newlines@3.0.1: {} + + trough@1.0.5: {} + + ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.32 - acorn: 8.8.0 - acorn-walk: 8.2.0 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.5.1 + acorn: 8.15.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.8.4 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - - /tslib/1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } - dev: true - - /tslib/2.4.0: - resolution: - { - integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==, - } - dev: true - - /tsutils/3.21.0_typescript@4.8.4: - 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' + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsutils@3.21.0(typescript@4.9.5): dependencies: tslib: 1.14.1 - typescript: 4.8.4 - dev: true - - /tty-browserify/0.0.0: - resolution: - { - integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==, - } - dev: true - - /tunnel-agent/0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } + typescript: 4.9.5 + + tty-browserify@0.0.0: {} + + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - dev: true - - /tweetnacl/0.14.5: - resolution: - { - integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==, - } - dev: true - - /type-check/0.3.2: - resolution: - { - integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, - } - engines: { node: '>= 0.8.0' } - dependencies: - prelude-ls: 1.1.2 - dev: true - - /type-check/0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } + + tweetnacl@0.14.5: {} + + type-check@0.4.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.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: '>=10' } - 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/1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: true - - /type/2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: true - - /typedarray-to-buffer/3.1.5: - resolution: - { - integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==, - } + + type-fest@0.18.1: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type@2.7.3: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - - /typedarray/0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } - dev: true - - /typescript/4.8.4: - resolution: - { - integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==, - } - engines: { node: '>=4.2.0' } - hasBin: true - dev: true - - /umi-request/1.4.0: - resolution: - { - integrity: sha512-OknwtQZddZHi0Ggi+Vr/olJ7HNMx4AzlywyK0W3NZBT7B0stjeZ9lcztA85dBgdAj3KVk8uPJPZSnGaDjELhrA==, - } - dependencies: - isomorphic-fetch: 2.2.1 - qs: 6.11.0 - dev: true - - /umi/3.5.34_react-router@5.2.0: - resolution: - { - integrity: sha512-ia6hqY1NfuZb4XdFjJ3LQjNqgJdlDdaPyYKsqWg0V/ifbMweA5Xh+fwE6PkvB1xd2eWreKtSI/Oei/PE7Cdawg==, - } - hasBin: true + + typedarray@0.0.6: {} + + typescript@4.9.5: {} + + typescript@5.9.2: {} + + ua-parser-js@1.0.41: {} + + umi@3.5.43(react-router@6.30.1(react@19.1.1)): dependencies: - '@umijs/bundler-webpack': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/core': 3.5.34 - '@umijs/deps': 3.5.34 - '@umijs/preset-built-in': 3.5.34_wcqkhtmu7mswc6yz4uyexck3ty - '@umijs/runtime': 3.5.34_react@16.14.0 - '@umijs/types': 3.5.34_hflg5r6ml7trnjm7sh3tgaza54 - '@umijs/utils': 3.5.34 + '@umijs/bundler-webpack': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0) + '@umijs/core': 3.5.43 + '@umijs/deps': 3.5.43 + '@umijs/preset-built-in': 3.5.43(react-dom@16.14.0(react@16.14.0))(react@16.14.0) + '@umijs/runtime': 3.5.43(react@16.14.0) + '@umijs/types': 3.5.43(react-dom@16.14.0(react@16.14.0))(react-router@6.30.1(react@19.1.1))(react@16.14.0) + '@umijs/utils': 3.5.43 react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react-dom: 16.14.0(react@16.14.0) v8-compile-cache: 2.3.0 transitivePeerDependencies: - react-router - dev: true - - /unbox-primitive/1.0.2: - resolution: - { - integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, - } - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /unc-path-regex/0.1.2: - resolution: - { - integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==, - } - engines: { node: '>=0.10.0' } - dev: true - - /undertaker-registry/1.0.1: - resolution: - { - integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==, - } - engines: { node: '>= 0.10' } - dev: true - - /undertaker/1.3.0: - resolution: - { - integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==, - } - engines: { node: '>= 0.10' } + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unc-path-regex@0.1.2: {} + + undertaker-registry@1.0.1: {} + + undertaker@1.3.0: dependencies: arr-flatten: 1.1.0 arr-map: 2.0.2 @@ -20758,393 +17981,164 @@ packages: object.defaults: 1.1.0 object.reduce: 1.0.1 undertaker-registry: 1.0.1 - dev: true - - /unicode-canonical-property-names-ecmascript/2.0.0: - resolution: - { - integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, - } - engines: { node: '>=4' } - dev: true - - /unicode-match-property-ecmascript/2.0.0: - resolution: - { - integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, - } - engines: { node: '>=4' } - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + + undici-types@7.10.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - dev: true - - /unicode-match-property-value-ecmascript/2.0.0: - resolution: - { - integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==, - } - engines: { node: '>=4' } - dev: true - - /unicode-property-aliases-ecmascript/2.1.0: - resolution: - { - integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, - } - engines: { node: '>=4' } - dev: true - - /unified/8.4.2: - resolution: - { - integrity: sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==, - } - dependencies: - '@types/unist': 2.0.6 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unified@8.4.2: + dependencies: + '@types/unist': 2.0.11 bail: 1.0.5 extend: 3.0.2 is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: true - /unified/9.2.2: - resolution: - { - integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==, - } + unified@9.2.2: dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.11 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: true - /union-value/1.0.1: - resolution: - { - integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, - } - engines: { node: '>=0.10.0' } + union-value@1.0.1: dependencies: arr-union: 3.1.0 get-value: 2.0.6 is-extendable: 0.1.1 set-value: 2.0.1 - dev: true - /uniq/1.0.1: - resolution: - { - integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==, - } - dev: true + uniq@1.0.1: {} - /unique-filename/1.1.1: - resolution: - { - integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, - } + unique-filename@1.1.1: dependencies: unique-slug: 2.0.2 - dev: true - /unique-slug/2.0.2: - resolution: - { - integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, - } + unique-slug@2.0.2: dependencies: imurmurhash: 0.1.4 - dev: true - /unique-stream/2.3.1: - resolution: - { - integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==, - } + unique-stream@2.3.1: dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 - dev: true - /unique-string/1.0.0: - resolution: - { - integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==, - } - engines: { node: '>=4' } + unique-string@1.0.0: dependencies: crypto-random-string: 1.0.0 - dev: true - /unist-builder/2.0.3: - resolution: - { - integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==, - } - dev: true + unist-builder@2.0.3: {} - /unist-util-filter/2.0.3: - resolution: - { - integrity: sha512-8k6Jl/KLFqIRTHydJlHh6+uFgqYHq66pV75pZgr1JwfyFSjbWb12yfb0yitW/0TbHXjr9U4G9BQpOvMANB+ExA==, - } + unist-util-filter@2.0.3: dependencies: unist-util-is: 4.1.0 - dev: true - /unist-util-find-after/3.0.0: - resolution: - { - integrity: sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==, - } + unist-util-find-after@3.0.0: dependencies: unist-util-is: 4.1.0 - dev: true - /unist-util-find-all-after/3.0.2: - resolution: - { - integrity: sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==, - } + unist-util-find-all-after@3.0.2: dependencies: unist-util-is: 4.1.0 - dev: true - - /unist-util-generated/1.1.6: - resolution: - { - integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==, - } - dev: true - - /unist-util-is/4.1.0: - resolution: - { - integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==, - } - dev: true - - /unist-util-position/3.1.0: - resolution: - { - integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==, - } - 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-visit-parents/3.1.1: - resolution: - { - integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==, - } - dependencies: - '@types/unist': 2.0.6 + + unist-util-generated@1.1.6: {} + + unist-util-is@4.1.0: {} + + unist-util-position@3.1.0: {} + + unist-util-stringify-position@2.0.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.11 unist-util-is: 4.1.0 - dev: true - /unist-util-visit/2.0.3: - resolution: - { - integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==, - } + unist-util-visit@2.0.3: dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.11 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: true - - /universal-canvas-context/1.0.0: - resolution: - { - integrity: sha512-ZjdoQyp7sDNB6o1xj93ulD2u1KYjEmMqZMGvIABREjREFlix70O4BTWFrADpMRI3uW6A2N7L45y4xksKqaIvwQ==, - } - engines: { npm: '>=3.0.0' } - dev: true - - /universal-choose-image/1.3.0_rax@1.2.2: - resolution: - { - integrity: sha512-j7L7Qk4X4rvBb8nsG5cqYPMahj1+/jkGsPUN1+1hvbX+H1aOs4gYcbnYCnQvmIZv1r4ghggvoS8Wgh95RcgfAA==, - } - engines: { npm: '>=3.0.0' } - peerDependencies: - rax: ^1.1.0 + + universal-canvas-context@1.0.0: {} + + universal-choose-image@1.3.0(rax@1.2.3): dependencies: - rax: 1.2.2 + rax: 1.2.3 universal-env: 3.3.3 - dev: true - /universal-device/1.0.3: - resolution: - { - integrity: sha512-27VnA0IXJ70JRLwxtmCYRxXJSe+r6KwgiPu0dx9e+WD3Y0Gn5nKbK083KG5FK1Nbtxjyl0kRgvfG6MpK3YKXrg==, - } - engines: { npm: '>=3.0.0' } + universal-device@1.0.3: dependencies: universal-env: 3.3.3 - dev: true - /universal-device/2.3.1: - resolution: - { - integrity: sha512-Z7aMODPW3CdhU4IicZ41l1PUZJLxENtEBZsks6fOKD4pyRkip1Z5EFdaDv/NdC35ccs7uR9SbkVF6QL3qwPWsw==, - } - engines: { npm: '>=3.0.0' } + universal-device@2.3.1: dependencies: universal-env: 3.3.3 - dev: true - /universal-element/0.0.6: - resolution: - { - integrity: sha512-J1olYldUlj35w4pBt1LljiRuRjohATGHCIiiOHOepXtELB8zESOdYDlrFtXfxGtb6TUZm8oAaOPbTwhb+6A4BA==, - } - engines: { npm: '>=3.0.0' } + universal-element@0.0.6: dependencies: universal-env: 3.3.3 - dev: true - - /universal-env/0.6.6: - resolution: - { - integrity: sha512-CqBdTKFStTEV7wETHjWm7CDIbSdUxIlN3zQ5xraTG6Wb1XEmBgyW1pu8lJW0buRXjACgjrD+pr97akumbQ0Y6A==, - } - dev: true - - /universal-env/2.0.0: - resolution: - { - integrity: sha512-jfPJvPXFdhJHsDhuCHj3Njc3nxF+dmj6LeqKE9R41EdKKOJ1d5GGpFu3DrT+Ff+pxS9jsnbtj7BZYFAcLlxdPg==, - } - engines: { npm: '>=3.0.0' } - dev: true - - /universal-env/3.3.3: - resolution: - { - integrity: sha512-4ZyITvWhtcurCEA66Cb7jcd4zpEiAAo91wSwbEscbiu033pIsC2yjgT8LYyasFgsst6jZHD1gtVoSyYcL8oH1Q==, - } - engines: { npm: '>=3.0.0' } - dependencies: - '@uni/env': 1.1.0 - dev: true - - /universal-panresponder/0.6.5: - resolution: - { - integrity: sha512-7N9xSPgILxBr12krtyTl2KjN7wWxirtdH2/NsQj234KHrHt8yQ8hIgi6sjW4eyP3/5QtAn2JWwPSYdFmgHvg4w==, - } + + universal-env@0.6.6: {} + + universal-env@2.0.0: {} + + universal-env@3.3.3: + dependencies: + '@uni/env': 1.1.1 + + universal-panresponder@0.6.5: dependencies: universal-env: 0.6.6 - dev: true - /universal-transition/1.1.1: - resolution: - { - integrity: sha512-TeYwWDhoYSYeGwX2L80gAQx7wByGvQ1WsPxqp+c6yYzqrc6BUuqpohtWY5Gh4ZPo0nToSNeadhly9sjeGLlV6Q==, - } - engines: { npm: '>=3.0.0' } + universal-transition@1.1.1: dependencies: style-unit: 2.0.1 universal-device: 1.0.3 universal-env: 3.3.3 universal-unit-tool: 1.0.0 - dev: true - /universal-unit-tool/1.0.0: - resolution: - { - integrity: sha512-YTKN4pUqgAQqP5duZQSTxv2zswkUdZ4z3KtRgpXOxlo3huJm7xbiwhxeX8RM675Tjfo4entn8yQHclFJy9iaQQ==, - } + universal-unit-tool@1.0.0: dependencies: universal-device: 2.3.1 - dev: true - - /universalify/0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - } - engines: { node: '>= 4.0.0' } - dev: true - - /universalify/0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: '>= 4.0.0' } - dev: true - - /universalify/2.0.0: - resolution: - { - integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, - } - engines: { node: '>= 10.0.0' } - dev: true - - /unset-value/1.0.0: - resolution: - { - integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==, - } - engines: { node: '>=0.10.0' } + + universalify@0.1.2: {} + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + unset-value@1.0.0: dependencies: has-value: 0.3.1 isobject: 3.0.1 - dev: true - - /unzip-response/2.0.1: - resolution: - { - integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==, - } - engines: { node: '>=4' } - dev: true - - /upath/1.2.0: - resolution: - { - integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, - } - engines: { node: '>=4' } - dev: true - - /update-browserslist-db/1.0.10_browserslist@4.21.4: - resolution: - { - integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==, - } - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + + unzip-response@2.0.1: {} + + upath@1.2.0: {} + + update-browserslist-db@1.1.3(browserslist@4.25.3): dependencies: - browserslist: 4.21.4 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true + browserslist: 4.25.3 + escalade: 3.2.0 + picocolors: 1.1.1 - /update-notifier/2.5.0: - resolution: - { - integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==, - } - engines: { node: '>=4' } + update-notifier@2.5.0: dependencies: boxen: 1.3.0 chalk: 2.4.2 @@ -21156,243 +18150,126 @@ packages: latest-version: 3.1.0 semver-diff: 2.1.0 xdg-basedir: 3.0.0 - dev: true - - /uri-js/4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.1.1 - dev: true - - /urix/0.1.0: - resolution: - { - integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==, - } - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: true - - /url-parse-as-address/1.0.0: - resolution: - { - integrity: sha512-1WJ8YX1Kcec9wgxy8d/ATzGP1ayO6BRnd3iB6NlM+7cOnn6U8p5PKppRTCPLobh3CSdJ4d0TdPjopzyU2KcVFw==, - } - dev: true - - /url-parse-lax/1.0.0: - resolution: - { - integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==, - } - engines: { node: '>=0.10.0' } + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + url-parse-as-address@1.0.0: {} + + url-parse-lax@1.0.0: dependencies: prepend-http: 1.0.4 - dev: true - /url-parse/1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true - - /url/0.11.0: - resolution: - { - integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==, - } - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - - /use-subscription/1.5.1_react@16.14.0: - resolution: - { - integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==, - } - peerDependencies: - react: ^16.8.0 || ^17.0.0 + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + + use-composed-ref@1.4.0(@types/react@19.1.11)(react@19.1.1): + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.11 + + use-isomorphic-layout-effect@1.2.1(@types/react@19.1.11)(react@19.1.1): + dependencies: + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.11 + + use-latest@1.3.0(@types/react@19.1.11)(react@19.1.1): + dependencies: + react: 19.1.1 + use-isomorphic-layout-effect: 1.2.1(@types/react@19.1.11)(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.11 + + use-subscription@1.5.1(react@16.14.0): dependencies: object-assign: 4.1.1 react: 16.14.0 - dev: true - - /use/3.1.1: - resolution: - { - integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /util-deprecate/1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: true - - /util/0.10.3: - resolution: - { - integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==, - } - dependencies: - inherits: 2.0.1 - dev: true - - /util/0.11.1: - resolution: - { - integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==, - } + + use-subscription@1.5.1(react@19.1.1): + dependencies: + object-assign: 4.1.1 + react: 19.1.1 + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + util@0.10.4: dependencies: inherits: 2.0.3 - dev: true - /uuid/3.4.0: - resolution: - { - integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, - } - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true - - /v8-compile-cache-lib/3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } - dev: true - - /v8-compile-cache/2.3.0: - resolution: - { - integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, - } - dev: true - - /v8-to-istanbul/8.1.1: - resolution: - { - integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==, - } - engines: { node: '>=10.12.0' } - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - source-map: 0.7.4 - dev: true + util@0.11.1: + dependencies: + inherits: 2.0.3 + + uuid@3.4.0: {} + + v8-compile-cache-lib@3.0.1: {} + + v8-compile-cache@2.3.0: {} - /v8flags/3.2.0: - resolution: - { - integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==, - } - engines: { node: '>= 0.10' } + v8-compile-cache@2.4.0: {} + + v8flags@3.2.0: dependencies: homedir-polyfill: 1.0.3 - dev: true - /validate-npm-package-license/3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } + validate-npm-package-license@3.0.4: dependencies: - spdx-correct: 3.1.1 + spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name/3.0.0: - resolution: - { - integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, - } + validate-npm-package-name@3.0.0: dependencies: builtins: 1.0.3 - dev: true - - /value-equal/1.0.1: - resolution: - { - integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==, - } - dev: true - - /value-or-function/3.0.0: - resolution: - { - integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==, - } - engines: { node: '>= 0.10' } - dev: true - - /verror/1.10.0: - resolution: - { - integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==, - } - engines: { '0': node >=0.6.0 } + + value-equal@1.0.1: {} + + value-or-function@3.0.0: {} + + verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 - dev: true - - /vfile-location/3.2.0: - resolution: - { - integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==, - } - dev: true - - /vfile-message/2.0.4: - resolution: - { - integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==, - } - dependencies: - '@types/unist': 2.0.6 + + vfile-location@3.2.0: {} + + vfile-message@2.0.4: + dependencies: + '@types/unist': 2.0.11 unist-util-stringify-position: 2.0.3 - dev: true - /vfile/4.2.1: - resolution: - { - integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==, - } + vfile@4.2.1: dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.11 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: true - /vinyl-fs/3.0.3: - resolution: - { - integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==, - } - engines: { node: '>= 0.10' } + vinyl-fs@3.0.3: dependencies: fs-mkdirp-stream: 1.0.0 glob-stream: 6.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 is-valid-glob: 1.0.0 lazystream: 1.0.1 lead: 1.0.0 - object.assign: 4.1.4 + object.assign: 4.1.7 pumpify: 1.5.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 remove-bom-buffer: 3.0.0 remove-bom-stream: 1.2.0 resolve-options: 1.1.0 @@ -21401,39 +18278,22 @@ packages: value-or-function: 3.0.0 vinyl: 2.2.1 vinyl-sourcemap: 1.1.0 - dev: true - /vinyl-sourcemap/1.1.0: - resolution: - { - integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==, - } - engines: { node: '>= 0.10' } + vinyl-sourcemap@1.1.0: dependencies: append-buffer: 1.0.2 convert-source-map: 1.9.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 normalize-path: 2.1.1 now-and-later: 2.0.1 remove-bom-buffer: 3.0.0 vinyl: 2.2.1 - dev: true - /vinyl-sourcemaps-apply/0.2.1: - resolution: - { - integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==, - } + vinyl-sourcemaps-apply@0.2.1: dependencies: source-map: 0.5.7 - dev: true - /vinyl/2.2.1: - resolution: - { - integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==, - } - engines: { node: '>= 0.10' } + vinyl@2.2.1: dependencies: clone: 2.1.2 clone-buffer: 1.0.0 @@ -21441,624 +18301,356 @@ packages: cloneable-readable: 1.1.3 remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - dev: true - /vm-browserify/1.1.2: - resolution: - { - integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, - } - dev: true + vite-node@3.2.4(@types/node@20.5.1)(terser@5.43.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.3(@types/node@20.5.1)(terser@5.43.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.1.3(@types/node@20.5.1)(terser@5.43.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.48.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 20.5.1 + fsevents: 2.3.3 + terser: 5.43.1 + + vitest-websocket-mock@0.5.0(vitest@3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1)): + dependencies: + '@vitest/utils': 3.2.4 + mock-socket: 9.3.1 + vitest: 3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1) + + vitest@3.2.4(@types/node@20.5.1)(jsdom@26.1.0)(terser@5.43.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@20.5.1)(terser@5.43.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.18 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.3(@types/node@20.5.1)(terser@5.43.1) + vite-node: 3.2.4(@types/node@20.5.1)(terser@5.43.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.5.1 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vm-browserify@1.1.2: {} - /w3c-hr-time/1.0.2: - resolution: - { - integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==, - } + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 - dev: true - /w3c-xmlserializer/2.0.0: - resolution: - { - integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==, - } - engines: { node: '>=10' } + w3c-xmlserializer@2.0.0: dependencies: xml-name-validator: 3.0.0 - dev: true - /walker/1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } + w3c-xmlserializer@5.0.0: dependencies: - makeerror: 1.0.12 - dev: true + xml-name-validator: 5.0.0 - /watchpack-chokidar2/2.0.1: - resolution: - { - integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==, - } - requiresBuild: true + watchpack@2.4.4: dependencies: - chokidar: 2.1.8 - transitivePeerDependencies: - - supports-color - dev: true - optional: true + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 - /watchpack/1.7.5: - resolution: - { - integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==, - } - dependencies: - graceful-fs: 4.2.10 - neo-async: 2.6.2 - optionalDependencies: - chokidar: 3.5.3 - watchpack-chokidar2: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /web-namespaces/1.1.4: - resolution: - { - integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==, - } - dev: true - - /webidl-conversions/3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - dev: true - - /webidl-conversions/5.0.0: - resolution: - { - integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==, - } - engines: { node: '>=8' } - dev: true - - /webidl-conversions/6.1.0: - resolution: - { - integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==, - } - engines: { node: '>=10.4' } - dev: true - - /webpack-chain/6.5.1: - resolution: - { - integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==, - } - engines: { node: '>=8' } + web-namespaces@1.1.4: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@5.0.0: {} + + webidl-conversions@6.1.0: {} + + webidl-conversions@7.0.0: {} + + webpack-chain@6.5.1: dependencies: deepmerge: 1.5.2 javascript-stringify: 2.1.0 - dev: true - - /webpack-cli/3.3.12_webpack@4.46.0: - resolution: - { - integrity: sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==, - } - engines: { node: '>=6.11.5' } - hasBin: true - peerDependencies: - webpack: 4.x.x - dependencies: - chalk: 2.4.2 - cross-spawn: 6.0.5 - enhanced-resolve: 4.5.0 - findup-sync: 3.0.0_supports-color@6.1.0 - global-modules: 2.0.0 - import-local: 2.0.0 - interpret: 1.4.0 - loader-utils: 1.4.0 - supports-color: 6.1.0 - v8-compile-cache: 2.3.0 - webpack: 4.46.0_webpack-cli@3.3.12 - yargs: 13.3.2 - dev: true - /webpack-merge/4.2.2: - resolution: - { - integrity: sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==, - } + webpack-cli@6.0.1(webpack@5.101.3): dependencies: - lodash: 4.17.21 - dev: true + '@discoveryjs/json-ext': 0.6.3 + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + colorette: 2.0.20 + commander: 12.1.0 + cross-spawn: 7.0.6 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-merge: 6.0.1 - /webpack-sources/1.4.3: - resolution: - { - integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==, - } - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - dev: true - - /webpack/4.46.0_webpack-cli@3.3.12: - resolution: - { - integrity: sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==, - } - engines: { node: '>=6.11.5' } - hasBin: true - peerDependencies: - webpack-cli: '*' - webpack-command: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webpack-command: - optional: true + webpack-merge@6.0.1: dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/wasm-edit': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - acorn: 6.4.2 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - chrome-trace-event: 1.0.3 - enhanced-resolve: 4.5.0 - eslint-scope: 4.0.3 - json-parse-better-errors: 1.0.2 - loader-runner: 2.4.0 - loader-utils: 1.4.0 - memory-fs: 0.4.1 - micromatch: 3.1.10 - mkdirp: 0.5.6 + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.3.3: {} + + webpack@5.101.3(webpack-cli@6.0.1): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.25.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 neo-async: 2.6.2 - node-libs-browser: 2.2.1 - schema-utils: 1.0.0 - tapable: 1.1.3 - terser-webpack-plugin: 1.4.5_webpack@4.46.0 - watchpack: 1.7.5 - webpack-cli: 3.3.12_webpack@4.46.0 - webpack-sources: 1.4.3 + schema-utils: 4.3.2 + tapable: 2.2.3 + terser-webpack-plugin: 5.3.14(webpack@5.101.3) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + optionalDependencies: + webpack-cli: 6.0.1(webpack@5.101.3) transitivePeerDependencies: - - supports-color - dev: true + - '@swc/core' + - esbuild + - uglify-js - /whatwg-encoding/1.0.5: - resolution: - { - integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==, - } + whatwg-encoding@1.0.5: dependencies: iconv-lite: 0.4.24 - dev: true - - /whatwg-fetch/3.6.2: - resolution: - { - integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==, - } - dev: true - - /whatwg-mimetype/2.3.0: - resolution: - { - integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==, - } - dev: true - - /whatwg-url/5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@2.3.0: {} + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /whatwg-url/8.7.0: - resolution: - { - integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==, - } - engines: { node: '>=10' } + whatwg-url@8.7.0: dependencies: lodash: 4.17.21 tr46: 2.1.0 webidl-conversions: 6.1.0 - dev: true - - /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-module/1.0.0: - resolution: - { - integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==, - } - dev: true - - /which-module/2.0.0: - resolution: - { - integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==, - } - dev: true - - /which/1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } - hasBin: true + + which-boxed-primitive@1.1.1: dependencies: - isexe: 2.0.0 - dev: true - - /which/2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } - hasBin: true + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-module@1.0.0: {} + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /wicked-good-xpath/1.3.0: - resolution: - { - integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==, - } - dev: true + which@2.0.2: + dependencies: + isexe: 2.0.0 - /wide-align/1.1.3: - resolution: - { - integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==, - } + why-is-node-running@2.3.0: dependencies: - string-width: 2.1.1 - dev: true + siginfo: 2.0.0 + stackback: 0.0.2 + + wicked-good-xpath@1.3.0: {} - /widest-line/2.0.1: - resolution: - { - integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==, - } - engines: { node: '>=4' } + widest-line@2.0.1: dependencies: string-width: 2.1.1 - dev: true - - /word-wrap/1.2.3: - resolution: - { - integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, - } - engines: { node: '>=0.10.0' } - dev: true - - /worker-farm/1.7.0: - resolution: - { - integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==, - } - dependencies: - errno: 0.1.8 - dev: true - - /workerpool/6.1.0: - resolution: - { - integrity: sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==, - } - dev: true - - /wrap-ansi/2.1.0: - resolution: - { - integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==, - } - engines: { node: '>=0.10.0' } + + wildcard@2.0.1: {} + + word-wrap@1.2.5: {} + + wrap-ansi@2.1.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 - dev: true - - /wrap-ansi/5.1.0: - resolution: - { - integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==, - } - engines: { node: '>=6' } - dependencies: - ansi-styles: 3.2.1 - string-width: 3.1.0 - strip-ansi: 5.2.0 - dev: true - /wrap-ansi/7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - - /wrappy/1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - dev: true - - /write-file-atomic/2.4.3: - resolution: - { - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, - } - dependencies: - graceful-fs: 4.2.10 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /write-file-atomic/3.0.3: - resolution: - { - integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==, - } + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - - /ws/7.5.9: - resolution: - { - integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==, - } - engines: { node: '>=8.3.0' } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xdg-basedir/3.0.0: - resolution: - { - integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==, - } - engines: { node: '>=4' } - dev: true - - /xml-name-validator/3.0.0: - resolution: - { - integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==, - } - dev: true - - /xmlchars/2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } - dev: true - - /xmldom-sre/0.1.31: - resolution: - { - integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==, - } - engines: { node: '>=0.1' } - dev: true - - /xtend/4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: '>=0.4' } - dev: true - - /y18n/3.2.2: - resolution: - { - integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==, - } - dev: true - - /y18n/4.0.3: - resolution: - { - integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, - } - dev: true - - /y18n/5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } - dev: true - - /yallist/2.1.2: - resolution: - { - integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, - } - 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 - - /yaml/1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: '>= 6' } - dev: true - - /yargs-parser/13.1.2: - resolution: - { - integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==, - } - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser/20.2.4: - resolution: - { - integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, - } - engines: { node: '>=10' } - dev: true - - /yargs-parser/20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: '>=10' } - dev: true - - /yargs-parser/21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: '>=12' } - dev: true - - /yargs-parser/5.0.1: - resolution: - { - integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==, - } - dependencies: - camelcase: 3.0.0 - object.assign: 4.1.4 - dev: true - - /yargs-unparser/2.0.0: - resolution: - { - integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, - } - engines: { node: '>=10' } - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - dev: true - /yargs/13.3.2: - resolution: - { - integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==, - } + ws@7.5.10: {} + + ws@8.18.3: {} + + xdg-basedir@3.0.0: {} + + xml-name-validator@3.0.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + xtend@4.0.2: {} + + y18n@3.2.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-parser@5.0.1: dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 13.1.2 - dev: true - - /yargs/16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: '>=10' } - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true + camelcase: 3.0.0 + object.assign: 4.1.7 - /yargs/17.6.0: - resolution: - { - integrity: sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==, - } - engines: { node: '>=12' } + yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.2.0 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 - /yargs/7.1.2: - resolution: - { - integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==, - } + yargs@7.1.2: dependencies: camelcase: 3.0.0 cliui: 3.2.0 @@ -22073,27 +18665,9 @@ packages: which-module: 1.0.0 y18n: 3.2.2 yargs-parser: 5.0.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 - - /zwitch/1.0.5: - resolution: - { - integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==, - } - dev: true + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zwitch@1.0.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9298591404..dee51e928d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,2 @@ -prefer-workspace-packages: true packages: - - 'packages/*' + - "packages/*" diff --git a/public/style.css b/public/style.css index fd32c993a2..1846f76a3d 100644 --- a/public/style.css +++ b/public/style.css @@ -6,7 +6,7 @@ width: 250px; } -a[title='站长统计'] { +a[title="站长统计"] { display: none; } @@ -15,15 +15,15 @@ button { padding: 4px; } -input[type='number'] { +input[type="number"] { border: 1px solid rgb(118, 118, 118); } -[data-prefers-color='dark'] button { +[data-prefers-color="dark"] button { color: #141414; } -[data-prefers-color='dark'] input { +[data-prefers-color="dark"] input { color: #141414; } diff --git a/public/useExternal/bootstrap-badge.css b/public/useExternal/bootstrap-badge.css index 4041daa915..22c71ab4db 100644 --- a/public/useExternal/bootstrap-badge.css +++ b/public/useExternal/bootstrap-badge.css @@ -8,8 +8,11 @@ white-space: nowrap; vertical-align: baseline; border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, - border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: + color 0.15s ease-in-out, + background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; margin-right: 0.24rem; } .badge-pill { diff --git a/scripts/build-with-relative-paths.js b/scripts/build-with-relative-paths.js new file mode 100644 index 0000000000..cba622424f --- /dev/null +++ b/scripts/build-with-relative-paths.js @@ -0,0 +1,61 @@ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const configPath = path.join(__dirname, '../config/config.ts'); +const backupPath = path.join(__dirname, '../config/config.ts.backup'); + +// 备份原配置 +fs.copyFileSync(configPath, backupPath); + +try { + // 读取配置文件 + let config = fs.readFileSync(configPath, 'utf8'); + + // 修改配置 + config = config.replace(/publicPath: ['"].*['"],/, "publicPath: '/hooks/',"); + config = config.replace( + /{ rel: 'stylesheet', href: '\/style\.css' }/, + "{ rel: 'stylesheet', href: '/hooks/style.css' }", + ); + config = config.replace(/logo: '\/logo\.svg',/, "logo: '/hooks/logo.svg',"); + + // 写入修改后的配置 + fs.writeFileSync(configPath, config); + + // 运行构建命令 + execSync('pnpm run build:doc', { stdio: 'inherit' }); + + // 进入 dist 目录 + process.chdir(path.join(__dirname, '../dist')); + + // 初始化 git 仓库(如果不存在) + try { + execSync('git init', { stdio: 'inherit' }); + } catch (e) { + // 如果已经初始化过,忽略错误 + } + + // 添加所有文件 + execSync('git add .', { stdio: 'inherit' }); + + // 提交更改 + execSync('git commit -m "chore: update gh-pages"', { stdio: 'inherit' }); + + // 添加远程仓库(如果不存在) + try { + execSync('git remote add origin git@github.com:alibaba/hooks.git', { stdio: 'inherit' }); + } catch (e) { + // 如果远程仓库已存在,忽略错误 + } + + // 强制推送到 gh-pages 分支 + execSync('git push -f origin HEAD:gh-pages', { stdio: 'inherit' }); + + // 返回到项目根目录 + process.chdir(path.join(__dirname, '..')); +} finally { + // 恢复原配置 + fs.copyFileSync(backupPath, configPath); + fs.unlinkSync(backupPath); +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000000..d56e3df1ca --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + // 模块解析 + "lib": ["ESNext", "DOM"], // 使用的库的声明 + "jsx": "react-jsx", // JSX 语法支持 + "target": "ESNext", // 生成的目标代码规范 + "module": "ESNext", // 生成的模块规范 + "moduleResolution": "bundler", // 可以在使用用 exports 声明类型的同时,使用相对路径模块可以不写扩展名 + "verbatimModuleSyntax": true, // 禁止混用 ESM 或 CommonJS 的导入导出语法 + "resolveJsonModule": true, // 允许导入 JSON 文件 + "noEmit": true, + // 路径解析 + "baseUrl": "${configDir}", + "paths": { + "src/*": ["${configDir}/src/*"] + }, + "types": [], + "rootDir": "${configDir}", + "outDir": "${configDir}/dist", + "sourceMap": true, // 生成源映射文件 + "sourceRoot": "${configDir}", // 源文件的根目录 + "declaration": true, // 生成 .d.ts 文件 + // 检查 + "strict": true, + "allowJs": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "${configDir}/src", + "${configDir}/types", + "${configDir}/scripts", + "${configDir}/docs", + "${configDir}/tests", + "${configDir}/e2e", + "${configDir}/demo", + "${configDir}/example", + "${configDir}/site" + ] +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 3fe88105f4..0000000000 --- a/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES6", - "moduleResolution": "node", - "jsx": "react", - "esModuleInterop": true, - "downlevelIteration": true, - "sourceMap": true, - "baseUrl": ".", - "paths": { - "@/*": ["src/*"], - "ahooks": ["./packages/hooks/src/index.ts"], - "ahooks/lib/*": ["./packages/hooks/src/*"], - "@ahooksjs/use-url-state": ["./packages/use-url-state/src/index.ts"] - }, - "allowSyntheticDefaultImports": true, - "skipLibCheck": true, - "declaration": false, - "strictNullChecks": true, - "importHelpers": true - }, - "exclude": ["node_modules", "lib", "es", "dist", "example"] -} diff --git a/tsconfig.pro.json b/tsconfig.pro.json index ab68c6817a..83d4972435 100644 --- a/tsconfig.pro.json +++ b/tsconfig.pro.json @@ -1,5 +1,24 @@ { - "extends": "./tsconfig.json", + "compilerOptions": { + "target": "ES5", + "moduleResolution": "node", + "jsx": "react", + "esModuleInterop": true, + "downlevelIteration": true, + "sourceMap": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@ahooks.js/use-url-state": ["./packages/use-url-state/src/index.ts"] + }, + "types": [], + "allowJs": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "declaration": false, + "strictNullChecks": true, + "importHelpers": true + }, "exclude": [ "node_modules", "lib", @@ -9,6 +28,7 @@ "**/__test__", "**/demo", "example", - "gulpfile.js" + "gulpfile.js", + "vitest.config.ts" ] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000000..a3d3abf150 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + projects: ['packages/*/vitest.config.ts'], + coverage: { + provider: 'istanbul', + include: ['packages/*/src/**/*.ts'], + reporter: ['text', 'lcov'], + }, + }, +});