├── .cursor └── rules │ └── rule.mdc ├── .gitignore ├── .npmignore ├── .vscode └── settings.json ├── README-zh_CN.md ├── README.md ├── jest.config.json ├── package.json ├── pnpm-lock.yaml ├── src ├── _utils │ ├── createEffectWithTarget.ts │ ├── depsAreSame.ts │ ├── domTarget.ts │ ├── useDeepCompareMemoize.ts │ ├── useEffectWithTarget.ts │ └── useLayoutEffectWithTarget.ts ├── advanced │ ├── index.ts │ └── useLatest.ts ├── dom │ ├── index.ts │ ├── useEventListener.ts │ ├── useFavicon.ts │ ├── useHover.ts │ ├── useMouse.ts │ └── useTitle.ts ├── effect │ ├── index.ts │ ├── useAsyncEffect.ts │ ├── useDebounceEffect.ts │ ├── useDebounceFn.ts │ ├── useDeepCompareEffect.ts │ ├── useInterval.ts │ ├── useLockFn.ts │ ├── useThrottleEffect.ts │ ├── useThrottleFn.ts │ ├── useTimeout.ts │ └── useUpdateEffect.ts ├── index.ts ├── lifeCycle │ ├── index.ts │ ├── useMount.ts │ └── useUnmount.ts ├── state │ ├── index.ts │ ├── useBoolean.ts │ ├── useDebounce.ts │ ├── useRafState.ts │ ├── useSetState.ts │ ├── useThrottle.ts │ └── useToggle.ts └── typings │ └── index.d.ts └── tsconfig.json /.cursor/rules/rule.mdc: -------------------------------------------------------------------------------- 1 | 8 | 9 | # Common Hook 项目编码规范 10 | 11 | ## 代码风格 12 | 13 | ### TypeScript 规范 14 | 15 | - 使用 TypeScript 严格模式 (`strict: true`) 16 | - 目标版本:ES6 17 | - 模块系统:ES2015 18 | - 强制文件名大小写一致性 19 | - 启用 ES 模块互操作性 20 | 21 | ### 函数定义 22 | 23 | - 优先使用箭头函数 24 | - 使用 `const` 声明函数 25 | - 函数参数使用类型注解 26 | - 避免使用 `any` 类型,优先使用具体类型 27 | 28 | ### 导入导出 29 | 30 | - 使用 ES6 模块语法 (`import`/`export`) 31 | - 优先使用命名导出 32 | - 在 `src/index.ts` 中统一导出所有模块 33 | 34 | ### 注释规范 35 | 36 | - 使用 JSDoc 风格的注释 37 | - 包含 `@name`、`@description`、`@example` 标签 38 | - 注释使用中文描述 39 | - 示例代码要清晰易懂 40 | 41 | ### 代码结构 42 | 43 | - 每个 Hook 文件包含一个主要的 Hook 函数 44 | - 使用 `useMemo` 优化性能 45 | - 合理使用依赖数组 46 | - 遵循 React Hooks 的使用规则 47 | 48 | ### 命名规范 49 | 50 | - 文件名使用 camelCase 51 | - Hook 函数名以 `use` 开头 52 | - 变量名使用 camelCase 53 | - 类型名使用 PascalCase 54 | 55 | ### 错误处理 56 | 57 | - 添加必要的类型检查 58 | - 使用可选链操作符 (`?.`) 59 | - 提供合理的默认值 60 | 61 | ### 性能优化 62 | 63 | - 使用 `useLatest` 避免闭包问题 64 | - 合理使用 `useMemo` 和 `useCallback` 65 | - 避免不必要的重新渲染 66 | 67 | ### 测试规范 68 | 69 | - 使用 Jest 进行单元测试 70 | - 测试文件命名:`*.test.ts` 或 `*.spec.ts` 71 | - 提供完整的测试覆盖率 72 | 73 | ### Git 提交规范 74 | 75 | - 提交信息格式:`type(scope): description` 76 | - 类型包括:feat、fix、docs、style、refactor、test、chore 77 | - 范围:对应模块名称(如 state、dom、effect 等) 78 | - 描述:简洁明了的中文描述 79 | 80 | ### 文件组织 81 | 82 | - 按功能模块组织代码 83 | - 工具函数放在 `_utils` 目录 84 | - 类型定义放在 `typings` 目录 85 | - 每个模块都有独立的 `index.ts` 文件 86 | 87 | ### 依赖管理 88 | 89 | - 使用 pnpm 作为包管理器 90 | - 最小化外部依赖 91 | - 定期更新依赖版本 92 | - 使用 `sideEffects: false` 优化打包 93 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | examples/es/ 2 | examples/node_modules/ 3 | examples/yarn.lock 4 | node_modules/ 5 | coverage/ 6 | es/ 7 | package-lock.json 8 | .idea 9 | .DS_Store -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | coverage/ 3 | src/ 4 | .gitignore 5 | .npmignore 6 | .idea 7 | .vscode 8 | .DS_Store 9 | jest.config.json 10 | tsconfig.json -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, // 保存文件时自动格式化代码 3 | "eslint.enable": true, // 启用 ESLint 检查 4 | "editor.quickSuggestions": { 5 | // 控制在不同上下文中是否显示快速建议 6 | "other": true, // 在代码中显示建议 7 | "comments": false, // 在注释中不显示建议 8 | "strings": false // 在字符串中不显示建议 9 | }, 10 | "editor.suggest.snippetsPreventQuickSuggestions": false, // 允许代码片段与快速建议一起显示 11 | "typescript.validate.enable": true, // 启用 TypeScript 验证 12 | "editor.tabSize": 2, // 设置缩进为2个空格,与你的代码风格一致 13 | "typescript.updateImportsOnFileMove.enabled": "always" // 移动文件时自动更新导入路径 14 | } 15 | -------------------------------------------------------------------------------- /README-zh_CN.md: -------------------------------------------------------------------------------- 1 |

common-hook

2 |
3 | 4 | [English](./README.md) | 简体中文 5 | 6 |
7 | 8 | > 前端业务代码工具库 9 | 10 | 提供项目中常用的 React Hooks,对输入输出函数做了特殊处理,避免闭包问题,包含丰富的基础 Hooks 以及提炼自业务的高级 Hooks 11 | 12 | ### 安装说明 13 | 14 | ```js 15 | npm i common-hook 16 | 17 | ``` 18 | 19 | ```js 20 | yarn add common-hook 21 | 22 | ``` 23 | 24 | ### 按需加载 25 | 26 | > 默认支持基于 ES Modules 的 Tree Shaking 27 | 28 | ```js 29 | import { useMount, useUnmount } from "common-hook" 30 | 31 | useMount(() => { 32 | console.log("useMount") 33 | }) 34 | useUnmount(() => { 35 | console.log("useUnmount") 36 | }) 37 | ``` 38 | 39 | ## :package: API 文档 40 | 41 | ### 辅助 Hooks 42 | 43 | ####   [useLatest](https://github.com/JainaXiong/common-hook/blob/main/src/advanced/useLatest.ts)    返回的永远是最新值 44 | 45 | ### 浏览器 Hooks 46 | 47 | ####   [useEventListener](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useEventListener.ts)    事件监听 48 | 49 | ####   [useTitle](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useTitle.ts)    设置页面标题 50 | 51 | ####   [useFavicon](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useFavicon.ts)    设置页面 favicon 52 | 53 | ####   [useHover](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useHover.ts)    监听 DOM 元素是否鼠标悬停 54 | 55 | ####   [useMouse](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useMouse.ts)    监听鼠标位置 56 | 57 | ### Effect Hooks 58 | 59 | ####   [useUpdateEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useUpdateEffect.ts)    首次不执行,只在依赖项更新时执行 60 | 61 | ####   [useDeepCompareEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDeepCompareEffect.ts)    依赖项更新时,深度比较执行 62 | 63 | ####   [useAsyncEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useAsyncEffect.ts)    支持异步函数 64 | 65 | ####   [useLockFn](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useLockFn.ts)    给一个异步函数增加竞态锁,防止并发执行 66 | 67 | ####   [useDebounceEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDebounceEffect.ts)    useEffect+防抖 68 | 69 | ####   [useDebounceFn](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDebounceFn.ts)    处理防抖函数的 Hook 70 | 71 | ####   [useThrottleEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useThrottleEffect.ts)    useEffect+节流 72 | 73 | ####   [useThrottleFn](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDebounceFn.ts)    处理函数节流的 Hook 74 | 75 | ####   [useInterval](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useInterval.ts)    处理 setInterval 的 Hook 76 | 77 | ####   [useTimeout](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useTimeout.ts)    处理 setTimeout 的 Hook 78 | 79 | ### 生命周期 Hooks 80 | 81 | ####   [useMount](https://github.com/JainaXiong/common-hook/blob/main/src/lifeCycle/useMount.ts)    在组件首次渲染时,执行方法 82 | 83 | ####   [useUnmount](https://github.com/JainaXiong/common-hook/blob/main/src/lifeCycle/useUnmount.ts)    在组件卸载时,执行函数 84 | 85 | ### 状态 Hooks 86 | 87 | ####   [useSetState](https://github.com/JainaXiong/common-hook/blob/main/src/state/useSetState.ts)    管理 object 类型 state 的 Hooks 88 | 89 | ####   [useBoolean](https://github.com/JainaXiong/common-hook/blob/main/src/state/useBoolean.ts)    切换 boolean,可以接收默认值 90 | 91 | ####   [useToggle](https://github.com/JainaXiong/common-hook/blob/main/src/state/useToggle.ts)    用于在两个状态值间切换 Hook 92 | 93 | ####   [useDebounce](https://github.com/JainaXiong/common-hook/blob/main/src/state/useDebounce.ts)    处理防抖值 Hook 94 | 95 | ####   [useThrottle](https://github.com/JainaXiong/common-hook/blob/main/src/state/useThrottle.ts)    处理节流值 Hook 96 | 97 | ####   [useRafState](https://github.com/JainaXiong/common-hook/blob/main/src/state/useRafState.ts)    只在 requestAnimationFrame callback 时更新 state 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

common-hook

2 |
3 | 4 | English | [简体中文](./README-zh_CN.md) 5 | 6 |
7 | 8 | > Front-end business code tool library 9 | 10 | Provide the commonly used React Hooks in the project, and the input and output functions do a special treatment to avoid closure problems, including a wealth of basic Hooks and refined from the business of advanced Hooks. 11 | 12 | ### Install 13 | 14 | ```js 15 | npm i common-hook 16 | 17 | ``` 18 | 19 | ```js 20 | yarn add common-hook 21 | 22 | ``` 23 | 24 | ### Demand Loading 25 | 26 | > Default support for ES Modules-based Tree Shaking 27 | 28 | ```js 29 | import { useMount, useUnmount } from "common-hook" 30 | 31 | useMount(() => { 32 | console.log("useMount") 33 | }) 34 | useUnmount(() => { 35 | console.log("useUnmount") 36 | }) 37 | ``` 38 | 39 | ## :package: API Documentation 40 | 41 | ### Advanced Hooks 42 | 43 | ####   [useLatest](https://github.com/JainaXiong/common-hook/blob/main/src/advanced/useLatest.ts)    The returned value is always the latest 44 | 45 | ### Dom Hooks 46 | 47 | ####   [useEventListener](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useEventListener.ts)    Event Listener 48 | 49 | ####   [useTitle](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useTitle.ts)    Set page title 50 | 51 | ####   [useFavicon](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useFavicon.ts)    Set page favicon 52 | 53 | ####   [useHover](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useHover.ts)    Listen to DOM elements for mouse hover 54 | 55 | ####   [useMouse](https://github.com/JainaXiong/common-hook/blob/main/src/dom/useMouse.ts)    Listen to mouse position 56 | 57 | ### Effect Hooks 58 | 59 | ####   [useUpdateEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useUpdateEffect.ts)    Not executed for the first time, only when dependencies are updated 60 | 61 | ####   [useDeepCompareEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDeepCompareEffect.ts)    When a dependency is updated, a deep comparison is performed 62 | 63 | ####   [useAsyncEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useAsyncEffect.ts)    Support asynchronous functions 64 | 65 | ####   [useLockFn](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useLockFn.ts)    Add a competing lock to an asynchronous function to prevent concurrent execution 66 | 67 | ####   [useDebounceEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDebounceEffect.ts)    useEffect + Debounce 68 | 69 | ####   [useDebounceFn](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDebounceFn.ts)    Hooks to handle debounce 70 | 71 | ####   [useThrottleEffect](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useThrottleEffect.ts)    useEffect + Throttle 72 | 73 | ####   [useThrottleFn](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useDebounceFn.ts)    Hooks to handle debounce 74 | 75 | ####   [useInterval](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useInterval.ts)    Hooks to handle setInterval 76 | 77 | ####   [useTimeout](https://github.com/JainaXiong/common-hook/blob/main/src/effect/useTimeout.ts)    Hooks to handle setTimeout 78 | 79 | ### LifeCycle Hooks 80 | 81 | ####   [useMount](https://github.com/JainaXiong/common-hook/blob/main/src/lifeCycle/useMount.ts)    Executed when the component is first rendered 82 | 83 | ####   [useUnmount](https://github.com/JainaXiong/common-hook/blob/main/src/lifeCycle/useUnmount.ts)    Execute on component unmount 84 | 85 | ### State Hooks 86 | 87 | ####   [useSetState](https://github.com/JainaXiong/common-hook/blob/main/src/state/useSetState.ts)    Hooks to manage object type states 88 | 89 | ####   [useBoolean](https://github.com/JainaXiong/common-hook/blob/main/src/state/useBoolean.ts)    Toggle boolean to receive default value 90 | 91 | ####   [useToggle](https://github.com/JainaXiong/common-hook/blob/main/src/state/useToggle.ts)    Hooks to switch between two state values 92 | 93 | ####   [useDebounce](https://github.com/JainaXiong/common-hook/blob/main/src/state/useDebounce.ts)    Hook for handling debounce values 94 | 95 | ####   [useThrottle](https://github.com/JainaXiong/common-hook/blob/main/src/state/useThrottle.ts)    Hook for handling throttle values 96 | 97 | ####   [useRafState](https://github.com/JainaXiong/common-hook/blob/main/src/state/useRafState.ts)    Update state only on requestAnimationFrame callback 98 | -------------------------------------------------------------------------------- /jest.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "transform": { 3 | "^.+\\.(t|j)sx?$": "ts-jest" 4 | }, 5 | "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", 6 | "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"], 7 | "collectCoverage": true, 8 | "clearMocks": true, 9 | "coveragePathIgnorePatterns": [ 10 | "/node_modules/", 11 | "/examples/", 12 | "/es/", 13 | "/src/_testComponent" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "common-hook", 3 | "version": "1.3.2", 4 | "description": "提供项目中常用的 React Hooks", 5 | "main": "es/index.js", 6 | "module": "es/index.js", 7 | "types": "es/index.d.ts", 8 | "sideEffects": false, 9 | "scripts": { 10 | "test": "jest", 11 | "test:watch": "jest --watchAll", 12 | "build": "tsc", 13 | "coverage": "jest --coverage", 14 | "prepare": "npm run build", 15 | "publish": "npm publish" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/JainaXiong/common-hook.git" 20 | }, 21 | "keywords": [ 22 | "common-hook", 23 | "typescript", 24 | "hooks", 25 | "useHooks" 26 | ], 27 | "author": "JainaXiong https://github.com/JainaXiong", 28 | "license": "ISC", 29 | "bugs": { 30 | "url": "https://github.com/JainaXiong/common-hook/issues" 31 | }, 32 | "homepage": "https://github.com/JainaXiong/common-hook#readme", 33 | "dependencies": { 34 | "common-screw": ">=1.4.3" 35 | }, 36 | "devDependencies": { 37 | "@types/jest": "^29.5.14", 38 | "jest": "^29.7.0", 39 | "ts-jest": "^29.3.2", 40 | "typescript": "^5.8.3" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | dequal: 12 | specifier: ^2.0.3 13 | version: 2.0.3 14 | devDependencies: 15 | '@types/jest': 16 | specifier: ^29.5.14 17 | version: 29.5.14 18 | jest: 19 | specifier: ^29.7.0 20 | version: 29.7.0(@types/node@22.14.1) 21 | ts-jest: 22 | specifier: ^29.3.2 23 | version: 29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.1))(typescript@5.8.3) 24 | typescript: 25 | specifier: ^5.8.3 26 | version: 5.8.3 27 | 28 | packages: 29 | 30 | '@ampproject/remapping@2.3.0': 31 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 32 | engines: {node: '>=6.0.0'} 33 | 34 | '@babel/code-frame@7.26.2': 35 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 36 | engines: {node: '>=6.9.0'} 37 | 38 | '@babel/compat-data@7.26.8': 39 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 40 | engines: {node: '>=6.9.0'} 41 | 42 | '@babel/core@7.26.10': 43 | resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} 44 | engines: {node: '>=6.9.0'} 45 | 46 | '@babel/generator@7.27.0': 47 | resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} 48 | engines: {node: '>=6.9.0'} 49 | 50 | '@babel/helper-compilation-targets@7.27.0': 51 | resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} 52 | engines: {node: '>=6.9.0'} 53 | 54 | '@babel/helper-module-imports@7.25.9': 55 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 56 | engines: {node: '>=6.9.0'} 57 | 58 | '@babel/helper-module-transforms@7.26.0': 59 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 60 | engines: {node: '>=6.9.0'} 61 | peerDependencies: 62 | '@babel/core': ^7.0.0 63 | 64 | '@babel/helper-plugin-utils@7.26.5': 65 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 66 | engines: {node: '>=6.9.0'} 67 | 68 | '@babel/helper-string-parser@7.25.9': 69 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 70 | engines: {node: '>=6.9.0'} 71 | 72 | '@babel/helper-validator-identifier@7.25.9': 73 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/helper-validator-option@7.25.9': 77 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@babel/helpers@7.27.0': 81 | resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} 82 | engines: {node: '>=6.9.0'} 83 | 84 | '@babel/parser@7.27.0': 85 | resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} 86 | engines: {node: '>=6.0.0'} 87 | hasBin: true 88 | 89 | '@babel/plugin-syntax-async-generators@7.8.4': 90 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 91 | peerDependencies: 92 | '@babel/core': ^7.0.0-0 93 | 94 | '@babel/plugin-syntax-bigint@7.8.3': 95 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 96 | peerDependencies: 97 | '@babel/core': ^7.0.0-0 98 | 99 | '@babel/plugin-syntax-class-properties@7.12.13': 100 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 101 | peerDependencies: 102 | '@babel/core': ^7.0.0-0 103 | 104 | '@babel/plugin-syntax-class-static-block@7.14.5': 105 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 106 | engines: {node: '>=6.9.0'} 107 | peerDependencies: 108 | '@babel/core': ^7.0.0-0 109 | 110 | '@babel/plugin-syntax-import-attributes@7.26.0': 111 | resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 112 | engines: {node: '>=6.9.0'} 113 | peerDependencies: 114 | '@babel/core': ^7.0.0-0 115 | 116 | '@babel/plugin-syntax-import-meta@7.10.4': 117 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 118 | peerDependencies: 119 | '@babel/core': ^7.0.0-0 120 | 121 | '@babel/plugin-syntax-json-strings@7.8.3': 122 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 123 | peerDependencies: 124 | '@babel/core': ^7.0.0-0 125 | 126 | '@babel/plugin-syntax-jsx@7.25.9': 127 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 128 | engines: {node: '>=6.9.0'} 129 | peerDependencies: 130 | '@babel/core': ^7.0.0-0 131 | 132 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 133 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 134 | peerDependencies: 135 | '@babel/core': ^7.0.0-0 136 | 137 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 138 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 139 | peerDependencies: 140 | '@babel/core': ^7.0.0-0 141 | 142 | '@babel/plugin-syntax-numeric-separator@7.10.4': 143 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 144 | peerDependencies: 145 | '@babel/core': ^7.0.0-0 146 | 147 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 148 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 149 | peerDependencies: 150 | '@babel/core': ^7.0.0-0 151 | 152 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 153 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 154 | peerDependencies: 155 | '@babel/core': ^7.0.0-0 156 | 157 | '@babel/plugin-syntax-optional-chaining@7.8.3': 158 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 159 | peerDependencies: 160 | '@babel/core': ^7.0.0-0 161 | 162 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 163 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 164 | engines: {node: '>=6.9.0'} 165 | peerDependencies: 166 | '@babel/core': ^7.0.0-0 167 | 168 | '@babel/plugin-syntax-top-level-await@7.14.5': 169 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 170 | engines: {node: '>=6.9.0'} 171 | peerDependencies: 172 | '@babel/core': ^7.0.0-0 173 | 174 | '@babel/plugin-syntax-typescript@7.25.9': 175 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 176 | engines: {node: '>=6.9.0'} 177 | peerDependencies: 178 | '@babel/core': ^7.0.0-0 179 | 180 | '@babel/template@7.27.0': 181 | resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} 182 | engines: {node: '>=6.9.0'} 183 | 184 | '@babel/traverse@7.27.0': 185 | resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} 186 | engines: {node: '>=6.9.0'} 187 | 188 | '@babel/types@7.27.0': 189 | resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} 190 | engines: {node: '>=6.9.0'} 191 | 192 | '@bcoe/v8-coverage@0.2.3': 193 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 194 | 195 | '@istanbuljs/load-nyc-config@1.1.0': 196 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 197 | engines: {node: '>=8'} 198 | 199 | '@istanbuljs/schema@0.1.3': 200 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 201 | engines: {node: '>=8'} 202 | 203 | '@jest/console@29.7.0': 204 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 205 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 206 | 207 | '@jest/core@29.7.0': 208 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 209 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 210 | peerDependencies: 211 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 212 | peerDependenciesMeta: 213 | node-notifier: 214 | optional: true 215 | 216 | '@jest/environment@29.7.0': 217 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 218 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 219 | 220 | '@jest/expect-utils@29.7.0': 221 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 222 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 223 | 224 | '@jest/expect@29.7.0': 225 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 226 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 227 | 228 | '@jest/fake-timers@29.7.0': 229 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 230 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 231 | 232 | '@jest/globals@29.7.0': 233 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 234 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 235 | 236 | '@jest/reporters@29.7.0': 237 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 238 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 239 | peerDependencies: 240 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 241 | peerDependenciesMeta: 242 | node-notifier: 243 | optional: true 244 | 245 | '@jest/schemas@29.6.3': 246 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 247 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 248 | 249 | '@jest/source-map@29.6.3': 250 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 251 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 252 | 253 | '@jest/test-result@29.7.0': 254 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 255 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 256 | 257 | '@jest/test-sequencer@29.7.0': 258 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 259 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 260 | 261 | '@jest/transform@29.7.0': 262 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 263 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 264 | 265 | '@jest/types@29.6.3': 266 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 267 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 268 | 269 | '@jridgewell/gen-mapping@0.3.8': 270 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 271 | engines: {node: '>=6.0.0'} 272 | 273 | '@jridgewell/resolve-uri@3.1.2': 274 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 275 | engines: {node: '>=6.0.0'} 276 | 277 | '@jridgewell/set-array@1.2.1': 278 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 279 | engines: {node: '>=6.0.0'} 280 | 281 | '@jridgewell/sourcemap-codec@1.5.0': 282 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 283 | 284 | '@jridgewell/trace-mapping@0.3.25': 285 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 286 | 287 | '@sinclair/typebox@0.27.8': 288 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 289 | 290 | '@sinonjs/commons@3.0.1': 291 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 292 | 293 | '@sinonjs/fake-timers@10.3.0': 294 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 295 | 296 | '@types/babel__core@7.20.5': 297 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 298 | 299 | '@types/babel__generator@7.27.0': 300 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 301 | 302 | '@types/babel__template@7.4.4': 303 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 304 | 305 | '@types/babel__traverse@7.20.7': 306 | resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 307 | 308 | '@types/graceful-fs@4.1.9': 309 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 310 | 311 | '@types/istanbul-lib-coverage@2.0.6': 312 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 313 | 314 | '@types/istanbul-lib-report@3.0.3': 315 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 316 | 317 | '@types/istanbul-reports@3.0.4': 318 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 319 | 320 | '@types/jest@29.5.14': 321 | resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} 322 | 323 | '@types/node@22.14.1': 324 | resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} 325 | 326 | '@types/stack-utils@2.0.3': 327 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 328 | 329 | '@types/yargs-parser@21.0.3': 330 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 331 | 332 | '@types/yargs@17.0.33': 333 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 334 | 335 | ansi-escapes@4.3.2: 336 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 337 | engines: {node: '>=8'} 338 | 339 | ansi-regex@5.0.1: 340 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 341 | engines: {node: '>=8'} 342 | 343 | ansi-styles@4.3.0: 344 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 345 | engines: {node: '>=8'} 346 | 347 | ansi-styles@5.2.0: 348 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 349 | engines: {node: '>=10'} 350 | 351 | anymatch@3.1.3: 352 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 353 | engines: {node: '>= 8'} 354 | 355 | argparse@1.0.10: 356 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 357 | 358 | async@3.2.6: 359 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 360 | 361 | babel-jest@29.7.0: 362 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 363 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 364 | peerDependencies: 365 | '@babel/core': ^7.8.0 366 | 367 | babel-plugin-istanbul@6.1.1: 368 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 369 | engines: {node: '>=8'} 370 | 371 | babel-plugin-jest-hoist@29.6.3: 372 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 373 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 374 | 375 | babel-preset-current-node-syntax@1.1.0: 376 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 377 | peerDependencies: 378 | '@babel/core': ^7.0.0 379 | 380 | babel-preset-jest@29.6.3: 381 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 382 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 383 | peerDependencies: 384 | '@babel/core': ^7.0.0 385 | 386 | balanced-match@1.0.2: 387 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 388 | 389 | brace-expansion@1.1.11: 390 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 391 | 392 | brace-expansion@2.0.1: 393 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 394 | 395 | braces@3.0.3: 396 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 397 | engines: {node: '>=8'} 398 | 399 | browserslist@4.24.4: 400 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 401 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 402 | hasBin: true 403 | 404 | bs-logger@0.2.6: 405 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 406 | engines: {node: '>= 6'} 407 | 408 | bser@2.1.1: 409 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 410 | 411 | buffer-from@1.1.2: 412 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 413 | 414 | callsites@3.1.0: 415 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 416 | engines: {node: '>=6'} 417 | 418 | camelcase@5.3.1: 419 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 420 | engines: {node: '>=6'} 421 | 422 | camelcase@6.3.0: 423 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 424 | engines: {node: '>=10'} 425 | 426 | caniuse-lite@1.0.30001715: 427 | resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} 428 | 429 | chalk@4.1.2: 430 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 431 | engines: {node: '>=10'} 432 | 433 | char-regex@1.0.2: 434 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 435 | engines: {node: '>=10'} 436 | 437 | ci-info@3.9.0: 438 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 439 | engines: {node: '>=8'} 440 | 441 | cjs-module-lexer@1.4.3: 442 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 443 | 444 | cliui@8.0.1: 445 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 446 | engines: {node: '>=12'} 447 | 448 | co@4.6.0: 449 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 450 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 451 | 452 | collect-v8-coverage@1.0.2: 453 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 454 | 455 | color-convert@2.0.1: 456 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 457 | engines: {node: '>=7.0.0'} 458 | 459 | color-name@1.1.4: 460 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 461 | 462 | concat-map@0.0.1: 463 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 464 | 465 | convert-source-map@2.0.0: 466 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 467 | 468 | create-jest@29.7.0: 469 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 470 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 471 | hasBin: true 472 | 473 | cross-spawn@7.0.6: 474 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 475 | engines: {node: '>= 8'} 476 | 477 | debug@4.4.0: 478 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 479 | engines: {node: '>=6.0'} 480 | peerDependencies: 481 | supports-color: '*' 482 | peerDependenciesMeta: 483 | supports-color: 484 | optional: true 485 | 486 | dedent@1.5.3: 487 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 488 | peerDependencies: 489 | babel-plugin-macros: ^3.1.0 490 | peerDependenciesMeta: 491 | babel-plugin-macros: 492 | optional: true 493 | 494 | deepmerge@4.3.1: 495 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 496 | engines: {node: '>=0.10.0'} 497 | 498 | dequal@2.0.3: 499 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 500 | engines: {node: '>=6'} 501 | 502 | detect-newline@3.1.0: 503 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 504 | engines: {node: '>=8'} 505 | 506 | diff-sequences@29.6.3: 507 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 508 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 509 | 510 | ejs@3.1.10: 511 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 512 | engines: {node: '>=0.10.0'} 513 | hasBin: true 514 | 515 | electron-to-chromium@1.5.140: 516 | resolution: {integrity: sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==} 517 | 518 | emittery@0.13.1: 519 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 520 | engines: {node: '>=12'} 521 | 522 | emoji-regex@8.0.0: 523 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 524 | 525 | error-ex@1.3.2: 526 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 527 | 528 | escalade@3.2.0: 529 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 530 | engines: {node: '>=6'} 531 | 532 | escape-string-regexp@2.0.0: 533 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 534 | engines: {node: '>=8'} 535 | 536 | esprima@4.0.1: 537 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 538 | engines: {node: '>=4'} 539 | hasBin: true 540 | 541 | execa@5.1.1: 542 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 543 | engines: {node: '>=10'} 544 | 545 | exit@0.1.2: 546 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 547 | engines: {node: '>= 0.8.0'} 548 | 549 | expect@29.7.0: 550 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 551 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 552 | 553 | fast-json-stable-stringify@2.1.0: 554 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 555 | 556 | fb-watchman@2.0.2: 557 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 558 | 559 | filelist@1.0.4: 560 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 561 | 562 | fill-range@7.1.1: 563 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 564 | engines: {node: '>=8'} 565 | 566 | find-up@4.1.0: 567 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 568 | engines: {node: '>=8'} 569 | 570 | fs.realpath@1.0.0: 571 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 572 | 573 | fsevents@2.3.3: 574 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 575 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 576 | os: [darwin] 577 | 578 | function-bind@1.1.2: 579 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 580 | 581 | gensync@1.0.0-beta.2: 582 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 583 | engines: {node: '>=6.9.0'} 584 | 585 | get-caller-file@2.0.5: 586 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 587 | engines: {node: 6.* || 8.* || >= 10.*} 588 | 589 | get-package-type@0.1.0: 590 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 591 | engines: {node: '>=8.0.0'} 592 | 593 | get-stream@6.0.1: 594 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 595 | engines: {node: '>=10'} 596 | 597 | glob@7.2.3: 598 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 599 | deprecated: Glob versions prior to v9 are no longer supported 600 | 601 | globals@11.12.0: 602 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 603 | engines: {node: '>=4'} 604 | 605 | graceful-fs@4.2.11: 606 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 607 | 608 | has-flag@4.0.0: 609 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 610 | engines: {node: '>=8'} 611 | 612 | hasown@2.0.2: 613 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 614 | engines: {node: '>= 0.4'} 615 | 616 | html-escaper@2.0.2: 617 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 618 | 619 | human-signals@2.1.0: 620 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 621 | engines: {node: '>=10.17.0'} 622 | 623 | import-local@3.2.0: 624 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 625 | engines: {node: '>=8'} 626 | hasBin: true 627 | 628 | imurmurhash@0.1.4: 629 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 630 | engines: {node: '>=0.8.19'} 631 | 632 | inflight@1.0.6: 633 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 634 | 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. 635 | 636 | inherits@2.0.4: 637 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 638 | 639 | is-arrayish@0.2.1: 640 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 641 | 642 | is-core-module@2.16.1: 643 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 644 | engines: {node: '>= 0.4'} 645 | 646 | is-fullwidth-code-point@3.0.0: 647 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 648 | engines: {node: '>=8'} 649 | 650 | is-generator-fn@2.1.0: 651 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 652 | engines: {node: '>=6'} 653 | 654 | is-number@7.0.0: 655 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 656 | engines: {node: '>=0.12.0'} 657 | 658 | is-stream@2.0.1: 659 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 660 | engines: {node: '>=8'} 661 | 662 | isexe@2.0.0: 663 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 664 | 665 | istanbul-lib-coverage@3.2.2: 666 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 667 | engines: {node: '>=8'} 668 | 669 | istanbul-lib-instrument@5.2.1: 670 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 671 | engines: {node: '>=8'} 672 | 673 | istanbul-lib-instrument@6.0.3: 674 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 675 | engines: {node: '>=10'} 676 | 677 | istanbul-lib-report@3.0.1: 678 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 679 | engines: {node: '>=10'} 680 | 681 | istanbul-lib-source-maps@4.0.1: 682 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 683 | engines: {node: '>=10'} 684 | 685 | istanbul-reports@3.1.7: 686 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 687 | engines: {node: '>=8'} 688 | 689 | jake@10.9.2: 690 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 691 | engines: {node: '>=10'} 692 | hasBin: true 693 | 694 | jest-changed-files@29.7.0: 695 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 696 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 697 | 698 | jest-circus@29.7.0: 699 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 700 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 701 | 702 | jest-cli@29.7.0: 703 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 704 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 705 | hasBin: true 706 | peerDependencies: 707 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 708 | peerDependenciesMeta: 709 | node-notifier: 710 | optional: true 711 | 712 | jest-config@29.7.0: 713 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 714 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 715 | peerDependencies: 716 | '@types/node': '*' 717 | ts-node: '>=9.0.0' 718 | peerDependenciesMeta: 719 | '@types/node': 720 | optional: true 721 | ts-node: 722 | optional: true 723 | 724 | jest-diff@29.7.0: 725 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 726 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 727 | 728 | jest-docblock@29.7.0: 729 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 730 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 731 | 732 | jest-each@29.7.0: 733 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 734 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 735 | 736 | jest-environment-node@29.7.0: 737 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 738 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 739 | 740 | jest-get-type@29.6.3: 741 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 742 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 743 | 744 | jest-haste-map@29.7.0: 745 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 746 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 747 | 748 | jest-leak-detector@29.7.0: 749 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 750 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 751 | 752 | jest-matcher-utils@29.7.0: 753 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 754 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 755 | 756 | jest-message-util@29.7.0: 757 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 758 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 759 | 760 | jest-mock@29.7.0: 761 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 762 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 763 | 764 | jest-pnp-resolver@1.2.3: 765 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 766 | engines: {node: '>=6'} 767 | peerDependencies: 768 | jest-resolve: '*' 769 | peerDependenciesMeta: 770 | jest-resolve: 771 | optional: true 772 | 773 | jest-regex-util@29.6.3: 774 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 775 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 776 | 777 | jest-resolve-dependencies@29.7.0: 778 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 779 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 780 | 781 | jest-resolve@29.7.0: 782 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 783 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 784 | 785 | jest-runner@29.7.0: 786 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 787 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 788 | 789 | jest-runtime@29.7.0: 790 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 791 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 792 | 793 | jest-snapshot@29.7.0: 794 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 795 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 796 | 797 | jest-util@29.7.0: 798 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 799 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 800 | 801 | jest-validate@29.7.0: 802 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 803 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 804 | 805 | jest-watcher@29.7.0: 806 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 807 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 808 | 809 | jest-worker@29.7.0: 810 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 811 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 812 | 813 | jest@29.7.0: 814 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 815 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 816 | hasBin: true 817 | peerDependencies: 818 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 819 | peerDependenciesMeta: 820 | node-notifier: 821 | optional: true 822 | 823 | js-tokens@4.0.0: 824 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 825 | 826 | js-yaml@3.14.1: 827 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 828 | hasBin: true 829 | 830 | jsesc@3.1.0: 831 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 832 | engines: {node: '>=6'} 833 | hasBin: true 834 | 835 | json-parse-even-better-errors@2.3.1: 836 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 837 | 838 | json5@2.2.3: 839 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 840 | engines: {node: '>=6'} 841 | hasBin: true 842 | 843 | kleur@3.0.3: 844 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 845 | engines: {node: '>=6'} 846 | 847 | leven@3.1.0: 848 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 849 | engines: {node: '>=6'} 850 | 851 | lines-and-columns@1.2.4: 852 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 853 | 854 | locate-path@5.0.0: 855 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 856 | engines: {node: '>=8'} 857 | 858 | lodash.memoize@4.1.2: 859 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 860 | 861 | lru-cache@5.1.1: 862 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 863 | 864 | make-dir@4.0.0: 865 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 866 | engines: {node: '>=10'} 867 | 868 | make-error@1.3.6: 869 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 870 | 871 | makeerror@1.0.12: 872 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 873 | 874 | merge-stream@2.0.0: 875 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 876 | 877 | micromatch@4.0.8: 878 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 879 | engines: {node: '>=8.6'} 880 | 881 | mimic-fn@2.1.0: 882 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 883 | engines: {node: '>=6'} 884 | 885 | minimatch@3.1.2: 886 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 887 | 888 | minimatch@5.1.6: 889 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 890 | engines: {node: '>=10'} 891 | 892 | ms@2.1.3: 893 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 894 | 895 | natural-compare@1.4.0: 896 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 897 | 898 | node-int64@0.4.0: 899 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 900 | 901 | node-releases@2.0.19: 902 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 903 | 904 | normalize-path@3.0.0: 905 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 906 | engines: {node: '>=0.10.0'} 907 | 908 | npm-run-path@4.0.1: 909 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 910 | engines: {node: '>=8'} 911 | 912 | once@1.4.0: 913 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 914 | 915 | onetime@5.1.2: 916 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 917 | engines: {node: '>=6'} 918 | 919 | p-limit@2.3.0: 920 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 921 | engines: {node: '>=6'} 922 | 923 | p-limit@3.1.0: 924 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 925 | engines: {node: '>=10'} 926 | 927 | p-locate@4.1.0: 928 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 929 | engines: {node: '>=8'} 930 | 931 | p-try@2.2.0: 932 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 933 | engines: {node: '>=6'} 934 | 935 | parse-json@5.2.0: 936 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 937 | engines: {node: '>=8'} 938 | 939 | path-exists@4.0.0: 940 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 941 | engines: {node: '>=8'} 942 | 943 | path-is-absolute@1.0.1: 944 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 945 | engines: {node: '>=0.10.0'} 946 | 947 | path-key@3.1.1: 948 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 949 | engines: {node: '>=8'} 950 | 951 | path-parse@1.0.7: 952 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 953 | 954 | picocolors@1.1.1: 955 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 956 | 957 | picomatch@2.3.1: 958 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 959 | engines: {node: '>=8.6'} 960 | 961 | pirates@4.0.7: 962 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 963 | engines: {node: '>= 6'} 964 | 965 | pkg-dir@4.2.0: 966 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 967 | engines: {node: '>=8'} 968 | 969 | pretty-format@29.7.0: 970 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 971 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 972 | 973 | prompts@2.4.2: 974 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 975 | engines: {node: '>= 6'} 976 | 977 | pure-rand@6.1.0: 978 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 979 | 980 | react-is@18.3.1: 981 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 982 | 983 | require-directory@2.1.1: 984 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 985 | engines: {node: '>=0.10.0'} 986 | 987 | resolve-cwd@3.0.0: 988 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 989 | engines: {node: '>=8'} 990 | 991 | resolve-from@5.0.0: 992 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 993 | engines: {node: '>=8'} 994 | 995 | resolve.exports@2.0.3: 996 | resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} 997 | engines: {node: '>=10'} 998 | 999 | resolve@1.22.10: 1000 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1001 | engines: {node: '>= 0.4'} 1002 | hasBin: true 1003 | 1004 | semver@6.3.1: 1005 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1006 | hasBin: true 1007 | 1008 | semver@7.7.1: 1009 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1010 | engines: {node: '>=10'} 1011 | hasBin: true 1012 | 1013 | shebang-command@2.0.0: 1014 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1015 | engines: {node: '>=8'} 1016 | 1017 | shebang-regex@3.0.0: 1018 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1019 | engines: {node: '>=8'} 1020 | 1021 | signal-exit@3.0.7: 1022 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1023 | 1024 | sisteransi@1.0.5: 1025 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1026 | 1027 | slash@3.0.0: 1028 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1029 | engines: {node: '>=8'} 1030 | 1031 | source-map-support@0.5.13: 1032 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1033 | 1034 | source-map@0.6.1: 1035 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1036 | engines: {node: '>=0.10.0'} 1037 | 1038 | sprintf-js@1.0.3: 1039 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1040 | 1041 | stack-utils@2.0.6: 1042 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1043 | engines: {node: '>=10'} 1044 | 1045 | string-length@4.0.2: 1046 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1047 | engines: {node: '>=10'} 1048 | 1049 | string-width@4.2.3: 1050 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1051 | engines: {node: '>=8'} 1052 | 1053 | strip-ansi@6.0.1: 1054 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1055 | engines: {node: '>=8'} 1056 | 1057 | strip-bom@4.0.0: 1058 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1059 | engines: {node: '>=8'} 1060 | 1061 | strip-final-newline@2.0.0: 1062 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1063 | engines: {node: '>=6'} 1064 | 1065 | strip-json-comments@3.1.1: 1066 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1067 | engines: {node: '>=8'} 1068 | 1069 | supports-color@7.2.0: 1070 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1071 | engines: {node: '>=8'} 1072 | 1073 | supports-color@8.1.1: 1074 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1075 | engines: {node: '>=10'} 1076 | 1077 | supports-preserve-symlinks-flag@1.0.0: 1078 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1079 | engines: {node: '>= 0.4'} 1080 | 1081 | test-exclude@6.0.0: 1082 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1083 | engines: {node: '>=8'} 1084 | 1085 | tmpl@1.0.5: 1086 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1087 | 1088 | to-regex-range@5.0.1: 1089 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1090 | engines: {node: '>=8.0'} 1091 | 1092 | ts-jest@29.3.2: 1093 | resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} 1094 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 1095 | hasBin: true 1096 | peerDependencies: 1097 | '@babel/core': '>=7.0.0-beta.0 <8' 1098 | '@jest/transform': ^29.0.0 1099 | '@jest/types': ^29.0.0 1100 | babel-jest: ^29.0.0 1101 | esbuild: '*' 1102 | jest: ^29.0.0 1103 | typescript: '>=4.3 <6' 1104 | peerDependenciesMeta: 1105 | '@babel/core': 1106 | optional: true 1107 | '@jest/transform': 1108 | optional: true 1109 | '@jest/types': 1110 | optional: true 1111 | babel-jest: 1112 | optional: true 1113 | esbuild: 1114 | optional: true 1115 | 1116 | type-detect@4.0.8: 1117 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1118 | engines: {node: '>=4'} 1119 | 1120 | type-fest@0.21.3: 1121 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1122 | engines: {node: '>=10'} 1123 | 1124 | type-fest@4.40.0: 1125 | resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} 1126 | engines: {node: '>=16'} 1127 | 1128 | typescript@5.8.3: 1129 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1130 | engines: {node: '>=14.17'} 1131 | hasBin: true 1132 | 1133 | undici-types@6.21.0: 1134 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1135 | 1136 | update-browserslist-db@1.1.3: 1137 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1138 | hasBin: true 1139 | peerDependencies: 1140 | browserslist: '>= 4.21.0' 1141 | 1142 | v8-to-istanbul@9.3.0: 1143 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1144 | engines: {node: '>=10.12.0'} 1145 | 1146 | walker@1.0.8: 1147 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1148 | 1149 | which@2.0.2: 1150 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1151 | engines: {node: '>= 8'} 1152 | hasBin: true 1153 | 1154 | wrap-ansi@7.0.0: 1155 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1156 | engines: {node: '>=10'} 1157 | 1158 | wrappy@1.0.2: 1159 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1160 | 1161 | write-file-atomic@4.0.2: 1162 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1163 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1164 | 1165 | y18n@5.0.8: 1166 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1167 | engines: {node: '>=10'} 1168 | 1169 | yallist@3.1.1: 1170 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1171 | 1172 | yargs-parser@21.1.1: 1173 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1174 | engines: {node: '>=12'} 1175 | 1176 | yargs@17.7.2: 1177 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1178 | engines: {node: '>=12'} 1179 | 1180 | yocto-queue@0.1.0: 1181 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1182 | engines: {node: '>=10'} 1183 | 1184 | snapshots: 1185 | 1186 | '@ampproject/remapping@2.3.0': 1187 | dependencies: 1188 | '@jridgewell/gen-mapping': 0.3.8 1189 | '@jridgewell/trace-mapping': 0.3.25 1190 | 1191 | '@babel/code-frame@7.26.2': 1192 | dependencies: 1193 | '@babel/helper-validator-identifier': 7.25.9 1194 | js-tokens: 4.0.0 1195 | picocolors: 1.1.1 1196 | 1197 | '@babel/compat-data@7.26.8': {} 1198 | 1199 | '@babel/core@7.26.10': 1200 | dependencies: 1201 | '@ampproject/remapping': 2.3.0 1202 | '@babel/code-frame': 7.26.2 1203 | '@babel/generator': 7.27.0 1204 | '@babel/helper-compilation-targets': 7.27.0 1205 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 1206 | '@babel/helpers': 7.27.0 1207 | '@babel/parser': 7.27.0 1208 | '@babel/template': 7.27.0 1209 | '@babel/traverse': 7.27.0 1210 | '@babel/types': 7.27.0 1211 | convert-source-map: 2.0.0 1212 | debug: 4.4.0 1213 | gensync: 1.0.0-beta.2 1214 | json5: 2.2.3 1215 | semver: 6.3.1 1216 | transitivePeerDependencies: 1217 | - supports-color 1218 | 1219 | '@babel/generator@7.27.0': 1220 | dependencies: 1221 | '@babel/parser': 7.27.0 1222 | '@babel/types': 7.27.0 1223 | '@jridgewell/gen-mapping': 0.3.8 1224 | '@jridgewell/trace-mapping': 0.3.25 1225 | jsesc: 3.1.0 1226 | 1227 | '@babel/helper-compilation-targets@7.27.0': 1228 | dependencies: 1229 | '@babel/compat-data': 7.26.8 1230 | '@babel/helper-validator-option': 7.25.9 1231 | browserslist: 4.24.4 1232 | lru-cache: 5.1.1 1233 | semver: 6.3.1 1234 | 1235 | '@babel/helper-module-imports@7.25.9': 1236 | dependencies: 1237 | '@babel/traverse': 7.27.0 1238 | '@babel/types': 7.27.0 1239 | transitivePeerDependencies: 1240 | - supports-color 1241 | 1242 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': 1243 | dependencies: 1244 | '@babel/core': 7.26.10 1245 | '@babel/helper-module-imports': 7.25.9 1246 | '@babel/helper-validator-identifier': 7.25.9 1247 | '@babel/traverse': 7.27.0 1248 | transitivePeerDependencies: 1249 | - supports-color 1250 | 1251 | '@babel/helper-plugin-utils@7.26.5': {} 1252 | 1253 | '@babel/helper-string-parser@7.25.9': {} 1254 | 1255 | '@babel/helper-validator-identifier@7.25.9': {} 1256 | 1257 | '@babel/helper-validator-option@7.25.9': {} 1258 | 1259 | '@babel/helpers@7.27.0': 1260 | dependencies: 1261 | '@babel/template': 7.27.0 1262 | '@babel/types': 7.27.0 1263 | 1264 | '@babel/parser@7.27.0': 1265 | dependencies: 1266 | '@babel/types': 7.27.0 1267 | 1268 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': 1269 | dependencies: 1270 | '@babel/core': 7.26.10 1271 | '@babel/helper-plugin-utils': 7.26.5 1272 | 1273 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': 1274 | dependencies: 1275 | '@babel/core': 7.26.10 1276 | '@babel/helper-plugin-utils': 7.26.5 1277 | 1278 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': 1279 | dependencies: 1280 | '@babel/core': 7.26.10 1281 | '@babel/helper-plugin-utils': 7.26.5 1282 | 1283 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': 1284 | dependencies: 1285 | '@babel/core': 7.26.10 1286 | '@babel/helper-plugin-utils': 7.26.5 1287 | 1288 | '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': 1289 | dependencies: 1290 | '@babel/core': 7.26.10 1291 | '@babel/helper-plugin-utils': 7.26.5 1292 | 1293 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': 1294 | dependencies: 1295 | '@babel/core': 7.26.10 1296 | '@babel/helper-plugin-utils': 7.26.5 1297 | 1298 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': 1299 | dependencies: 1300 | '@babel/core': 7.26.10 1301 | '@babel/helper-plugin-utils': 7.26.5 1302 | 1303 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': 1304 | dependencies: 1305 | '@babel/core': 7.26.10 1306 | '@babel/helper-plugin-utils': 7.26.5 1307 | 1308 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': 1309 | dependencies: 1310 | '@babel/core': 7.26.10 1311 | '@babel/helper-plugin-utils': 7.26.5 1312 | 1313 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': 1314 | dependencies: 1315 | '@babel/core': 7.26.10 1316 | '@babel/helper-plugin-utils': 7.26.5 1317 | 1318 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': 1319 | dependencies: 1320 | '@babel/core': 7.26.10 1321 | '@babel/helper-plugin-utils': 7.26.5 1322 | 1323 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': 1324 | dependencies: 1325 | '@babel/core': 7.26.10 1326 | '@babel/helper-plugin-utils': 7.26.5 1327 | 1328 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': 1329 | dependencies: 1330 | '@babel/core': 7.26.10 1331 | '@babel/helper-plugin-utils': 7.26.5 1332 | 1333 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': 1334 | dependencies: 1335 | '@babel/core': 7.26.10 1336 | '@babel/helper-plugin-utils': 7.26.5 1337 | 1338 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': 1339 | dependencies: 1340 | '@babel/core': 7.26.10 1341 | '@babel/helper-plugin-utils': 7.26.5 1342 | 1343 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': 1344 | dependencies: 1345 | '@babel/core': 7.26.10 1346 | '@babel/helper-plugin-utils': 7.26.5 1347 | 1348 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': 1349 | dependencies: 1350 | '@babel/core': 7.26.10 1351 | '@babel/helper-plugin-utils': 7.26.5 1352 | 1353 | '@babel/template@7.27.0': 1354 | dependencies: 1355 | '@babel/code-frame': 7.26.2 1356 | '@babel/parser': 7.27.0 1357 | '@babel/types': 7.27.0 1358 | 1359 | '@babel/traverse@7.27.0': 1360 | dependencies: 1361 | '@babel/code-frame': 7.26.2 1362 | '@babel/generator': 7.27.0 1363 | '@babel/parser': 7.27.0 1364 | '@babel/template': 7.27.0 1365 | '@babel/types': 7.27.0 1366 | debug: 4.4.0 1367 | globals: 11.12.0 1368 | transitivePeerDependencies: 1369 | - supports-color 1370 | 1371 | '@babel/types@7.27.0': 1372 | dependencies: 1373 | '@babel/helper-string-parser': 7.25.9 1374 | '@babel/helper-validator-identifier': 7.25.9 1375 | 1376 | '@bcoe/v8-coverage@0.2.3': {} 1377 | 1378 | '@istanbuljs/load-nyc-config@1.1.0': 1379 | dependencies: 1380 | camelcase: 5.3.1 1381 | find-up: 4.1.0 1382 | get-package-type: 0.1.0 1383 | js-yaml: 3.14.1 1384 | resolve-from: 5.0.0 1385 | 1386 | '@istanbuljs/schema@0.1.3': {} 1387 | 1388 | '@jest/console@29.7.0': 1389 | dependencies: 1390 | '@jest/types': 29.6.3 1391 | '@types/node': 22.14.1 1392 | chalk: 4.1.2 1393 | jest-message-util: 29.7.0 1394 | jest-util: 29.7.0 1395 | slash: 3.0.0 1396 | 1397 | '@jest/core@29.7.0': 1398 | dependencies: 1399 | '@jest/console': 29.7.0 1400 | '@jest/reporters': 29.7.0 1401 | '@jest/test-result': 29.7.0 1402 | '@jest/transform': 29.7.0 1403 | '@jest/types': 29.6.3 1404 | '@types/node': 22.14.1 1405 | ansi-escapes: 4.3.2 1406 | chalk: 4.1.2 1407 | ci-info: 3.9.0 1408 | exit: 0.1.2 1409 | graceful-fs: 4.2.11 1410 | jest-changed-files: 29.7.0 1411 | jest-config: 29.7.0(@types/node@22.14.1) 1412 | jest-haste-map: 29.7.0 1413 | jest-message-util: 29.7.0 1414 | jest-regex-util: 29.6.3 1415 | jest-resolve: 29.7.0 1416 | jest-resolve-dependencies: 29.7.0 1417 | jest-runner: 29.7.0 1418 | jest-runtime: 29.7.0 1419 | jest-snapshot: 29.7.0 1420 | jest-util: 29.7.0 1421 | jest-validate: 29.7.0 1422 | jest-watcher: 29.7.0 1423 | micromatch: 4.0.8 1424 | pretty-format: 29.7.0 1425 | slash: 3.0.0 1426 | strip-ansi: 6.0.1 1427 | transitivePeerDependencies: 1428 | - babel-plugin-macros 1429 | - supports-color 1430 | - ts-node 1431 | 1432 | '@jest/environment@29.7.0': 1433 | dependencies: 1434 | '@jest/fake-timers': 29.7.0 1435 | '@jest/types': 29.6.3 1436 | '@types/node': 22.14.1 1437 | jest-mock: 29.7.0 1438 | 1439 | '@jest/expect-utils@29.7.0': 1440 | dependencies: 1441 | jest-get-type: 29.6.3 1442 | 1443 | '@jest/expect@29.7.0': 1444 | dependencies: 1445 | expect: 29.7.0 1446 | jest-snapshot: 29.7.0 1447 | transitivePeerDependencies: 1448 | - supports-color 1449 | 1450 | '@jest/fake-timers@29.7.0': 1451 | dependencies: 1452 | '@jest/types': 29.6.3 1453 | '@sinonjs/fake-timers': 10.3.0 1454 | '@types/node': 22.14.1 1455 | jest-message-util: 29.7.0 1456 | jest-mock: 29.7.0 1457 | jest-util: 29.7.0 1458 | 1459 | '@jest/globals@29.7.0': 1460 | dependencies: 1461 | '@jest/environment': 29.7.0 1462 | '@jest/expect': 29.7.0 1463 | '@jest/types': 29.6.3 1464 | jest-mock: 29.7.0 1465 | transitivePeerDependencies: 1466 | - supports-color 1467 | 1468 | '@jest/reporters@29.7.0': 1469 | dependencies: 1470 | '@bcoe/v8-coverage': 0.2.3 1471 | '@jest/console': 29.7.0 1472 | '@jest/test-result': 29.7.0 1473 | '@jest/transform': 29.7.0 1474 | '@jest/types': 29.6.3 1475 | '@jridgewell/trace-mapping': 0.3.25 1476 | '@types/node': 22.14.1 1477 | chalk: 4.1.2 1478 | collect-v8-coverage: 1.0.2 1479 | exit: 0.1.2 1480 | glob: 7.2.3 1481 | graceful-fs: 4.2.11 1482 | istanbul-lib-coverage: 3.2.2 1483 | istanbul-lib-instrument: 6.0.3 1484 | istanbul-lib-report: 3.0.1 1485 | istanbul-lib-source-maps: 4.0.1 1486 | istanbul-reports: 3.1.7 1487 | jest-message-util: 29.7.0 1488 | jest-util: 29.7.0 1489 | jest-worker: 29.7.0 1490 | slash: 3.0.0 1491 | string-length: 4.0.2 1492 | strip-ansi: 6.0.1 1493 | v8-to-istanbul: 9.3.0 1494 | transitivePeerDependencies: 1495 | - supports-color 1496 | 1497 | '@jest/schemas@29.6.3': 1498 | dependencies: 1499 | '@sinclair/typebox': 0.27.8 1500 | 1501 | '@jest/source-map@29.6.3': 1502 | dependencies: 1503 | '@jridgewell/trace-mapping': 0.3.25 1504 | callsites: 3.1.0 1505 | graceful-fs: 4.2.11 1506 | 1507 | '@jest/test-result@29.7.0': 1508 | dependencies: 1509 | '@jest/console': 29.7.0 1510 | '@jest/types': 29.6.3 1511 | '@types/istanbul-lib-coverage': 2.0.6 1512 | collect-v8-coverage: 1.0.2 1513 | 1514 | '@jest/test-sequencer@29.7.0': 1515 | dependencies: 1516 | '@jest/test-result': 29.7.0 1517 | graceful-fs: 4.2.11 1518 | jest-haste-map: 29.7.0 1519 | slash: 3.0.0 1520 | 1521 | '@jest/transform@29.7.0': 1522 | dependencies: 1523 | '@babel/core': 7.26.10 1524 | '@jest/types': 29.6.3 1525 | '@jridgewell/trace-mapping': 0.3.25 1526 | babel-plugin-istanbul: 6.1.1 1527 | chalk: 4.1.2 1528 | convert-source-map: 2.0.0 1529 | fast-json-stable-stringify: 2.1.0 1530 | graceful-fs: 4.2.11 1531 | jest-haste-map: 29.7.0 1532 | jest-regex-util: 29.6.3 1533 | jest-util: 29.7.0 1534 | micromatch: 4.0.8 1535 | pirates: 4.0.7 1536 | slash: 3.0.0 1537 | write-file-atomic: 4.0.2 1538 | transitivePeerDependencies: 1539 | - supports-color 1540 | 1541 | '@jest/types@29.6.3': 1542 | dependencies: 1543 | '@jest/schemas': 29.6.3 1544 | '@types/istanbul-lib-coverage': 2.0.6 1545 | '@types/istanbul-reports': 3.0.4 1546 | '@types/node': 22.14.1 1547 | '@types/yargs': 17.0.33 1548 | chalk: 4.1.2 1549 | 1550 | '@jridgewell/gen-mapping@0.3.8': 1551 | dependencies: 1552 | '@jridgewell/set-array': 1.2.1 1553 | '@jridgewell/sourcemap-codec': 1.5.0 1554 | '@jridgewell/trace-mapping': 0.3.25 1555 | 1556 | '@jridgewell/resolve-uri@3.1.2': {} 1557 | 1558 | '@jridgewell/set-array@1.2.1': {} 1559 | 1560 | '@jridgewell/sourcemap-codec@1.5.0': {} 1561 | 1562 | '@jridgewell/trace-mapping@0.3.25': 1563 | dependencies: 1564 | '@jridgewell/resolve-uri': 3.1.2 1565 | '@jridgewell/sourcemap-codec': 1.5.0 1566 | 1567 | '@sinclair/typebox@0.27.8': {} 1568 | 1569 | '@sinonjs/commons@3.0.1': 1570 | dependencies: 1571 | type-detect: 4.0.8 1572 | 1573 | '@sinonjs/fake-timers@10.3.0': 1574 | dependencies: 1575 | '@sinonjs/commons': 3.0.1 1576 | 1577 | '@types/babel__core@7.20.5': 1578 | dependencies: 1579 | '@babel/parser': 7.27.0 1580 | '@babel/types': 7.27.0 1581 | '@types/babel__generator': 7.27.0 1582 | '@types/babel__template': 7.4.4 1583 | '@types/babel__traverse': 7.20.7 1584 | 1585 | '@types/babel__generator@7.27.0': 1586 | dependencies: 1587 | '@babel/types': 7.27.0 1588 | 1589 | '@types/babel__template@7.4.4': 1590 | dependencies: 1591 | '@babel/parser': 7.27.0 1592 | '@babel/types': 7.27.0 1593 | 1594 | '@types/babel__traverse@7.20.7': 1595 | dependencies: 1596 | '@babel/types': 7.27.0 1597 | 1598 | '@types/graceful-fs@4.1.9': 1599 | dependencies: 1600 | '@types/node': 22.14.1 1601 | 1602 | '@types/istanbul-lib-coverage@2.0.6': {} 1603 | 1604 | '@types/istanbul-lib-report@3.0.3': 1605 | dependencies: 1606 | '@types/istanbul-lib-coverage': 2.0.6 1607 | 1608 | '@types/istanbul-reports@3.0.4': 1609 | dependencies: 1610 | '@types/istanbul-lib-report': 3.0.3 1611 | 1612 | '@types/jest@29.5.14': 1613 | dependencies: 1614 | expect: 29.7.0 1615 | pretty-format: 29.7.0 1616 | 1617 | '@types/node@22.14.1': 1618 | dependencies: 1619 | undici-types: 6.21.0 1620 | 1621 | '@types/stack-utils@2.0.3': {} 1622 | 1623 | '@types/yargs-parser@21.0.3': {} 1624 | 1625 | '@types/yargs@17.0.33': 1626 | dependencies: 1627 | '@types/yargs-parser': 21.0.3 1628 | 1629 | ansi-escapes@4.3.2: 1630 | dependencies: 1631 | type-fest: 0.21.3 1632 | 1633 | ansi-regex@5.0.1: {} 1634 | 1635 | ansi-styles@4.3.0: 1636 | dependencies: 1637 | color-convert: 2.0.1 1638 | 1639 | ansi-styles@5.2.0: {} 1640 | 1641 | anymatch@3.1.3: 1642 | dependencies: 1643 | normalize-path: 3.0.0 1644 | picomatch: 2.3.1 1645 | 1646 | argparse@1.0.10: 1647 | dependencies: 1648 | sprintf-js: 1.0.3 1649 | 1650 | async@3.2.6: {} 1651 | 1652 | babel-jest@29.7.0(@babel/core@7.26.10): 1653 | dependencies: 1654 | '@babel/core': 7.26.10 1655 | '@jest/transform': 29.7.0 1656 | '@types/babel__core': 7.20.5 1657 | babel-plugin-istanbul: 6.1.1 1658 | babel-preset-jest: 29.6.3(@babel/core@7.26.10) 1659 | chalk: 4.1.2 1660 | graceful-fs: 4.2.11 1661 | slash: 3.0.0 1662 | transitivePeerDependencies: 1663 | - supports-color 1664 | 1665 | babel-plugin-istanbul@6.1.1: 1666 | dependencies: 1667 | '@babel/helper-plugin-utils': 7.26.5 1668 | '@istanbuljs/load-nyc-config': 1.1.0 1669 | '@istanbuljs/schema': 0.1.3 1670 | istanbul-lib-instrument: 5.2.1 1671 | test-exclude: 6.0.0 1672 | transitivePeerDependencies: 1673 | - supports-color 1674 | 1675 | babel-plugin-jest-hoist@29.6.3: 1676 | dependencies: 1677 | '@babel/template': 7.27.0 1678 | '@babel/types': 7.27.0 1679 | '@types/babel__core': 7.20.5 1680 | '@types/babel__traverse': 7.20.7 1681 | 1682 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): 1683 | dependencies: 1684 | '@babel/core': 7.26.10 1685 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) 1686 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) 1687 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) 1688 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) 1689 | '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) 1690 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) 1691 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) 1692 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) 1693 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) 1694 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) 1695 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) 1696 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) 1697 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) 1698 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) 1699 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) 1700 | 1701 | babel-preset-jest@29.6.3(@babel/core@7.26.10): 1702 | dependencies: 1703 | '@babel/core': 7.26.10 1704 | babel-plugin-jest-hoist: 29.6.3 1705 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) 1706 | 1707 | balanced-match@1.0.2: {} 1708 | 1709 | brace-expansion@1.1.11: 1710 | dependencies: 1711 | balanced-match: 1.0.2 1712 | concat-map: 0.0.1 1713 | 1714 | brace-expansion@2.0.1: 1715 | dependencies: 1716 | balanced-match: 1.0.2 1717 | 1718 | braces@3.0.3: 1719 | dependencies: 1720 | fill-range: 7.1.1 1721 | 1722 | browserslist@4.24.4: 1723 | dependencies: 1724 | caniuse-lite: 1.0.30001715 1725 | electron-to-chromium: 1.5.140 1726 | node-releases: 2.0.19 1727 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 1728 | 1729 | bs-logger@0.2.6: 1730 | dependencies: 1731 | fast-json-stable-stringify: 2.1.0 1732 | 1733 | bser@2.1.1: 1734 | dependencies: 1735 | node-int64: 0.4.0 1736 | 1737 | buffer-from@1.1.2: {} 1738 | 1739 | callsites@3.1.0: {} 1740 | 1741 | camelcase@5.3.1: {} 1742 | 1743 | camelcase@6.3.0: {} 1744 | 1745 | caniuse-lite@1.0.30001715: {} 1746 | 1747 | chalk@4.1.2: 1748 | dependencies: 1749 | ansi-styles: 4.3.0 1750 | supports-color: 7.2.0 1751 | 1752 | char-regex@1.0.2: {} 1753 | 1754 | ci-info@3.9.0: {} 1755 | 1756 | cjs-module-lexer@1.4.3: {} 1757 | 1758 | cliui@8.0.1: 1759 | dependencies: 1760 | string-width: 4.2.3 1761 | strip-ansi: 6.0.1 1762 | wrap-ansi: 7.0.0 1763 | 1764 | co@4.6.0: {} 1765 | 1766 | collect-v8-coverage@1.0.2: {} 1767 | 1768 | color-convert@2.0.1: 1769 | dependencies: 1770 | color-name: 1.1.4 1771 | 1772 | color-name@1.1.4: {} 1773 | 1774 | concat-map@0.0.1: {} 1775 | 1776 | convert-source-map@2.0.0: {} 1777 | 1778 | create-jest@29.7.0(@types/node@22.14.1): 1779 | dependencies: 1780 | '@jest/types': 29.6.3 1781 | chalk: 4.1.2 1782 | exit: 0.1.2 1783 | graceful-fs: 4.2.11 1784 | jest-config: 29.7.0(@types/node@22.14.1) 1785 | jest-util: 29.7.0 1786 | prompts: 2.4.2 1787 | transitivePeerDependencies: 1788 | - '@types/node' 1789 | - babel-plugin-macros 1790 | - supports-color 1791 | - ts-node 1792 | 1793 | cross-spawn@7.0.6: 1794 | dependencies: 1795 | path-key: 3.1.1 1796 | shebang-command: 2.0.0 1797 | which: 2.0.2 1798 | 1799 | debug@4.4.0: 1800 | dependencies: 1801 | ms: 2.1.3 1802 | 1803 | dedent@1.5.3: {} 1804 | 1805 | deepmerge@4.3.1: {} 1806 | 1807 | dequal@2.0.3: {} 1808 | 1809 | detect-newline@3.1.0: {} 1810 | 1811 | diff-sequences@29.6.3: {} 1812 | 1813 | ejs@3.1.10: 1814 | dependencies: 1815 | jake: 10.9.2 1816 | 1817 | electron-to-chromium@1.5.140: {} 1818 | 1819 | emittery@0.13.1: {} 1820 | 1821 | emoji-regex@8.0.0: {} 1822 | 1823 | error-ex@1.3.2: 1824 | dependencies: 1825 | is-arrayish: 0.2.1 1826 | 1827 | escalade@3.2.0: {} 1828 | 1829 | escape-string-regexp@2.0.0: {} 1830 | 1831 | esprima@4.0.1: {} 1832 | 1833 | execa@5.1.1: 1834 | dependencies: 1835 | cross-spawn: 7.0.6 1836 | get-stream: 6.0.1 1837 | human-signals: 2.1.0 1838 | is-stream: 2.0.1 1839 | merge-stream: 2.0.0 1840 | npm-run-path: 4.0.1 1841 | onetime: 5.1.2 1842 | signal-exit: 3.0.7 1843 | strip-final-newline: 2.0.0 1844 | 1845 | exit@0.1.2: {} 1846 | 1847 | expect@29.7.0: 1848 | dependencies: 1849 | '@jest/expect-utils': 29.7.0 1850 | jest-get-type: 29.6.3 1851 | jest-matcher-utils: 29.7.0 1852 | jest-message-util: 29.7.0 1853 | jest-util: 29.7.0 1854 | 1855 | fast-json-stable-stringify@2.1.0: {} 1856 | 1857 | fb-watchman@2.0.2: 1858 | dependencies: 1859 | bser: 2.1.1 1860 | 1861 | filelist@1.0.4: 1862 | dependencies: 1863 | minimatch: 5.1.6 1864 | 1865 | fill-range@7.1.1: 1866 | dependencies: 1867 | to-regex-range: 5.0.1 1868 | 1869 | find-up@4.1.0: 1870 | dependencies: 1871 | locate-path: 5.0.0 1872 | path-exists: 4.0.0 1873 | 1874 | fs.realpath@1.0.0: {} 1875 | 1876 | fsevents@2.3.3: 1877 | optional: true 1878 | 1879 | function-bind@1.1.2: {} 1880 | 1881 | gensync@1.0.0-beta.2: {} 1882 | 1883 | get-caller-file@2.0.5: {} 1884 | 1885 | get-package-type@0.1.0: {} 1886 | 1887 | get-stream@6.0.1: {} 1888 | 1889 | glob@7.2.3: 1890 | dependencies: 1891 | fs.realpath: 1.0.0 1892 | inflight: 1.0.6 1893 | inherits: 2.0.4 1894 | minimatch: 3.1.2 1895 | once: 1.4.0 1896 | path-is-absolute: 1.0.1 1897 | 1898 | globals@11.12.0: {} 1899 | 1900 | graceful-fs@4.2.11: {} 1901 | 1902 | has-flag@4.0.0: {} 1903 | 1904 | hasown@2.0.2: 1905 | dependencies: 1906 | function-bind: 1.1.2 1907 | 1908 | html-escaper@2.0.2: {} 1909 | 1910 | human-signals@2.1.0: {} 1911 | 1912 | import-local@3.2.0: 1913 | dependencies: 1914 | pkg-dir: 4.2.0 1915 | resolve-cwd: 3.0.0 1916 | 1917 | imurmurhash@0.1.4: {} 1918 | 1919 | inflight@1.0.6: 1920 | dependencies: 1921 | once: 1.4.0 1922 | wrappy: 1.0.2 1923 | 1924 | inherits@2.0.4: {} 1925 | 1926 | is-arrayish@0.2.1: {} 1927 | 1928 | is-core-module@2.16.1: 1929 | dependencies: 1930 | hasown: 2.0.2 1931 | 1932 | is-fullwidth-code-point@3.0.0: {} 1933 | 1934 | is-generator-fn@2.1.0: {} 1935 | 1936 | is-number@7.0.0: {} 1937 | 1938 | is-stream@2.0.1: {} 1939 | 1940 | isexe@2.0.0: {} 1941 | 1942 | istanbul-lib-coverage@3.2.2: {} 1943 | 1944 | istanbul-lib-instrument@5.2.1: 1945 | dependencies: 1946 | '@babel/core': 7.26.10 1947 | '@babel/parser': 7.27.0 1948 | '@istanbuljs/schema': 0.1.3 1949 | istanbul-lib-coverage: 3.2.2 1950 | semver: 6.3.1 1951 | transitivePeerDependencies: 1952 | - supports-color 1953 | 1954 | istanbul-lib-instrument@6.0.3: 1955 | dependencies: 1956 | '@babel/core': 7.26.10 1957 | '@babel/parser': 7.27.0 1958 | '@istanbuljs/schema': 0.1.3 1959 | istanbul-lib-coverage: 3.2.2 1960 | semver: 7.7.1 1961 | transitivePeerDependencies: 1962 | - supports-color 1963 | 1964 | istanbul-lib-report@3.0.1: 1965 | dependencies: 1966 | istanbul-lib-coverage: 3.2.2 1967 | make-dir: 4.0.0 1968 | supports-color: 7.2.0 1969 | 1970 | istanbul-lib-source-maps@4.0.1: 1971 | dependencies: 1972 | debug: 4.4.0 1973 | istanbul-lib-coverage: 3.2.2 1974 | source-map: 0.6.1 1975 | transitivePeerDependencies: 1976 | - supports-color 1977 | 1978 | istanbul-reports@3.1.7: 1979 | dependencies: 1980 | html-escaper: 2.0.2 1981 | istanbul-lib-report: 3.0.1 1982 | 1983 | jake@10.9.2: 1984 | dependencies: 1985 | async: 3.2.6 1986 | chalk: 4.1.2 1987 | filelist: 1.0.4 1988 | minimatch: 3.1.2 1989 | 1990 | jest-changed-files@29.7.0: 1991 | dependencies: 1992 | execa: 5.1.1 1993 | jest-util: 29.7.0 1994 | p-limit: 3.1.0 1995 | 1996 | jest-circus@29.7.0: 1997 | dependencies: 1998 | '@jest/environment': 29.7.0 1999 | '@jest/expect': 29.7.0 2000 | '@jest/test-result': 29.7.0 2001 | '@jest/types': 29.6.3 2002 | '@types/node': 22.14.1 2003 | chalk: 4.1.2 2004 | co: 4.6.0 2005 | dedent: 1.5.3 2006 | is-generator-fn: 2.1.0 2007 | jest-each: 29.7.0 2008 | jest-matcher-utils: 29.7.0 2009 | jest-message-util: 29.7.0 2010 | jest-runtime: 29.7.0 2011 | jest-snapshot: 29.7.0 2012 | jest-util: 29.7.0 2013 | p-limit: 3.1.0 2014 | pretty-format: 29.7.0 2015 | pure-rand: 6.1.0 2016 | slash: 3.0.0 2017 | stack-utils: 2.0.6 2018 | transitivePeerDependencies: 2019 | - babel-plugin-macros 2020 | - supports-color 2021 | 2022 | jest-cli@29.7.0(@types/node@22.14.1): 2023 | dependencies: 2024 | '@jest/core': 29.7.0 2025 | '@jest/test-result': 29.7.0 2026 | '@jest/types': 29.6.3 2027 | chalk: 4.1.2 2028 | create-jest: 29.7.0(@types/node@22.14.1) 2029 | exit: 0.1.2 2030 | import-local: 3.2.0 2031 | jest-config: 29.7.0(@types/node@22.14.1) 2032 | jest-util: 29.7.0 2033 | jest-validate: 29.7.0 2034 | yargs: 17.7.2 2035 | transitivePeerDependencies: 2036 | - '@types/node' 2037 | - babel-plugin-macros 2038 | - supports-color 2039 | - ts-node 2040 | 2041 | jest-config@29.7.0(@types/node@22.14.1): 2042 | dependencies: 2043 | '@babel/core': 7.26.10 2044 | '@jest/test-sequencer': 29.7.0 2045 | '@jest/types': 29.6.3 2046 | babel-jest: 29.7.0(@babel/core@7.26.10) 2047 | chalk: 4.1.2 2048 | ci-info: 3.9.0 2049 | deepmerge: 4.3.1 2050 | glob: 7.2.3 2051 | graceful-fs: 4.2.11 2052 | jest-circus: 29.7.0 2053 | jest-environment-node: 29.7.0 2054 | jest-get-type: 29.6.3 2055 | jest-regex-util: 29.6.3 2056 | jest-resolve: 29.7.0 2057 | jest-runner: 29.7.0 2058 | jest-util: 29.7.0 2059 | jest-validate: 29.7.0 2060 | micromatch: 4.0.8 2061 | parse-json: 5.2.0 2062 | pretty-format: 29.7.0 2063 | slash: 3.0.0 2064 | strip-json-comments: 3.1.1 2065 | optionalDependencies: 2066 | '@types/node': 22.14.1 2067 | transitivePeerDependencies: 2068 | - babel-plugin-macros 2069 | - supports-color 2070 | 2071 | jest-diff@29.7.0: 2072 | dependencies: 2073 | chalk: 4.1.2 2074 | diff-sequences: 29.6.3 2075 | jest-get-type: 29.6.3 2076 | pretty-format: 29.7.0 2077 | 2078 | jest-docblock@29.7.0: 2079 | dependencies: 2080 | detect-newline: 3.1.0 2081 | 2082 | jest-each@29.7.0: 2083 | dependencies: 2084 | '@jest/types': 29.6.3 2085 | chalk: 4.1.2 2086 | jest-get-type: 29.6.3 2087 | jest-util: 29.7.0 2088 | pretty-format: 29.7.0 2089 | 2090 | jest-environment-node@29.7.0: 2091 | dependencies: 2092 | '@jest/environment': 29.7.0 2093 | '@jest/fake-timers': 29.7.0 2094 | '@jest/types': 29.6.3 2095 | '@types/node': 22.14.1 2096 | jest-mock: 29.7.0 2097 | jest-util: 29.7.0 2098 | 2099 | jest-get-type@29.6.3: {} 2100 | 2101 | jest-haste-map@29.7.0: 2102 | dependencies: 2103 | '@jest/types': 29.6.3 2104 | '@types/graceful-fs': 4.1.9 2105 | '@types/node': 22.14.1 2106 | anymatch: 3.1.3 2107 | fb-watchman: 2.0.2 2108 | graceful-fs: 4.2.11 2109 | jest-regex-util: 29.6.3 2110 | jest-util: 29.7.0 2111 | jest-worker: 29.7.0 2112 | micromatch: 4.0.8 2113 | walker: 1.0.8 2114 | optionalDependencies: 2115 | fsevents: 2.3.3 2116 | 2117 | jest-leak-detector@29.7.0: 2118 | dependencies: 2119 | jest-get-type: 29.6.3 2120 | pretty-format: 29.7.0 2121 | 2122 | jest-matcher-utils@29.7.0: 2123 | dependencies: 2124 | chalk: 4.1.2 2125 | jest-diff: 29.7.0 2126 | jest-get-type: 29.6.3 2127 | pretty-format: 29.7.0 2128 | 2129 | jest-message-util@29.7.0: 2130 | dependencies: 2131 | '@babel/code-frame': 7.26.2 2132 | '@jest/types': 29.6.3 2133 | '@types/stack-utils': 2.0.3 2134 | chalk: 4.1.2 2135 | graceful-fs: 4.2.11 2136 | micromatch: 4.0.8 2137 | pretty-format: 29.7.0 2138 | slash: 3.0.0 2139 | stack-utils: 2.0.6 2140 | 2141 | jest-mock@29.7.0: 2142 | dependencies: 2143 | '@jest/types': 29.6.3 2144 | '@types/node': 22.14.1 2145 | jest-util: 29.7.0 2146 | 2147 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2148 | optionalDependencies: 2149 | jest-resolve: 29.7.0 2150 | 2151 | jest-regex-util@29.6.3: {} 2152 | 2153 | jest-resolve-dependencies@29.7.0: 2154 | dependencies: 2155 | jest-regex-util: 29.6.3 2156 | jest-snapshot: 29.7.0 2157 | transitivePeerDependencies: 2158 | - supports-color 2159 | 2160 | jest-resolve@29.7.0: 2161 | dependencies: 2162 | chalk: 4.1.2 2163 | graceful-fs: 4.2.11 2164 | jest-haste-map: 29.7.0 2165 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2166 | jest-util: 29.7.0 2167 | jest-validate: 29.7.0 2168 | resolve: 1.22.10 2169 | resolve.exports: 2.0.3 2170 | slash: 3.0.0 2171 | 2172 | jest-runner@29.7.0: 2173 | dependencies: 2174 | '@jest/console': 29.7.0 2175 | '@jest/environment': 29.7.0 2176 | '@jest/test-result': 29.7.0 2177 | '@jest/transform': 29.7.0 2178 | '@jest/types': 29.6.3 2179 | '@types/node': 22.14.1 2180 | chalk: 4.1.2 2181 | emittery: 0.13.1 2182 | graceful-fs: 4.2.11 2183 | jest-docblock: 29.7.0 2184 | jest-environment-node: 29.7.0 2185 | jest-haste-map: 29.7.0 2186 | jest-leak-detector: 29.7.0 2187 | jest-message-util: 29.7.0 2188 | jest-resolve: 29.7.0 2189 | jest-runtime: 29.7.0 2190 | jest-util: 29.7.0 2191 | jest-watcher: 29.7.0 2192 | jest-worker: 29.7.0 2193 | p-limit: 3.1.0 2194 | source-map-support: 0.5.13 2195 | transitivePeerDependencies: 2196 | - supports-color 2197 | 2198 | jest-runtime@29.7.0: 2199 | dependencies: 2200 | '@jest/environment': 29.7.0 2201 | '@jest/fake-timers': 29.7.0 2202 | '@jest/globals': 29.7.0 2203 | '@jest/source-map': 29.6.3 2204 | '@jest/test-result': 29.7.0 2205 | '@jest/transform': 29.7.0 2206 | '@jest/types': 29.6.3 2207 | '@types/node': 22.14.1 2208 | chalk: 4.1.2 2209 | cjs-module-lexer: 1.4.3 2210 | collect-v8-coverage: 1.0.2 2211 | glob: 7.2.3 2212 | graceful-fs: 4.2.11 2213 | jest-haste-map: 29.7.0 2214 | jest-message-util: 29.7.0 2215 | jest-mock: 29.7.0 2216 | jest-regex-util: 29.6.3 2217 | jest-resolve: 29.7.0 2218 | jest-snapshot: 29.7.0 2219 | jest-util: 29.7.0 2220 | slash: 3.0.0 2221 | strip-bom: 4.0.0 2222 | transitivePeerDependencies: 2223 | - supports-color 2224 | 2225 | jest-snapshot@29.7.0: 2226 | dependencies: 2227 | '@babel/core': 7.26.10 2228 | '@babel/generator': 7.27.0 2229 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) 2230 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) 2231 | '@babel/types': 7.27.0 2232 | '@jest/expect-utils': 29.7.0 2233 | '@jest/transform': 29.7.0 2234 | '@jest/types': 29.6.3 2235 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) 2236 | chalk: 4.1.2 2237 | expect: 29.7.0 2238 | graceful-fs: 4.2.11 2239 | jest-diff: 29.7.0 2240 | jest-get-type: 29.6.3 2241 | jest-matcher-utils: 29.7.0 2242 | jest-message-util: 29.7.0 2243 | jest-util: 29.7.0 2244 | natural-compare: 1.4.0 2245 | pretty-format: 29.7.0 2246 | semver: 7.7.1 2247 | transitivePeerDependencies: 2248 | - supports-color 2249 | 2250 | jest-util@29.7.0: 2251 | dependencies: 2252 | '@jest/types': 29.6.3 2253 | '@types/node': 22.14.1 2254 | chalk: 4.1.2 2255 | ci-info: 3.9.0 2256 | graceful-fs: 4.2.11 2257 | picomatch: 2.3.1 2258 | 2259 | jest-validate@29.7.0: 2260 | dependencies: 2261 | '@jest/types': 29.6.3 2262 | camelcase: 6.3.0 2263 | chalk: 4.1.2 2264 | jest-get-type: 29.6.3 2265 | leven: 3.1.0 2266 | pretty-format: 29.7.0 2267 | 2268 | jest-watcher@29.7.0: 2269 | dependencies: 2270 | '@jest/test-result': 29.7.0 2271 | '@jest/types': 29.6.3 2272 | '@types/node': 22.14.1 2273 | ansi-escapes: 4.3.2 2274 | chalk: 4.1.2 2275 | emittery: 0.13.1 2276 | jest-util: 29.7.0 2277 | string-length: 4.0.2 2278 | 2279 | jest-worker@29.7.0: 2280 | dependencies: 2281 | '@types/node': 22.14.1 2282 | jest-util: 29.7.0 2283 | merge-stream: 2.0.0 2284 | supports-color: 8.1.1 2285 | 2286 | jest@29.7.0(@types/node@22.14.1): 2287 | dependencies: 2288 | '@jest/core': 29.7.0 2289 | '@jest/types': 29.6.3 2290 | import-local: 3.2.0 2291 | jest-cli: 29.7.0(@types/node@22.14.1) 2292 | transitivePeerDependencies: 2293 | - '@types/node' 2294 | - babel-plugin-macros 2295 | - supports-color 2296 | - ts-node 2297 | 2298 | js-tokens@4.0.0: {} 2299 | 2300 | js-yaml@3.14.1: 2301 | dependencies: 2302 | argparse: 1.0.10 2303 | esprima: 4.0.1 2304 | 2305 | jsesc@3.1.0: {} 2306 | 2307 | json-parse-even-better-errors@2.3.1: {} 2308 | 2309 | json5@2.2.3: {} 2310 | 2311 | kleur@3.0.3: {} 2312 | 2313 | leven@3.1.0: {} 2314 | 2315 | lines-and-columns@1.2.4: {} 2316 | 2317 | locate-path@5.0.0: 2318 | dependencies: 2319 | p-locate: 4.1.0 2320 | 2321 | lodash.memoize@4.1.2: {} 2322 | 2323 | lru-cache@5.1.1: 2324 | dependencies: 2325 | yallist: 3.1.1 2326 | 2327 | make-dir@4.0.0: 2328 | dependencies: 2329 | semver: 7.7.1 2330 | 2331 | make-error@1.3.6: {} 2332 | 2333 | makeerror@1.0.12: 2334 | dependencies: 2335 | tmpl: 1.0.5 2336 | 2337 | merge-stream@2.0.0: {} 2338 | 2339 | micromatch@4.0.8: 2340 | dependencies: 2341 | braces: 3.0.3 2342 | picomatch: 2.3.1 2343 | 2344 | mimic-fn@2.1.0: {} 2345 | 2346 | minimatch@3.1.2: 2347 | dependencies: 2348 | brace-expansion: 1.1.11 2349 | 2350 | minimatch@5.1.6: 2351 | dependencies: 2352 | brace-expansion: 2.0.1 2353 | 2354 | ms@2.1.3: {} 2355 | 2356 | natural-compare@1.4.0: {} 2357 | 2358 | node-int64@0.4.0: {} 2359 | 2360 | node-releases@2.0.19: {} 2361 | 2362 | normalize-path@3.0.0: {} 2363 | 2364 | npm-run-path@4.0.1: 2365 | dependencies: 2366 | path-key: 3.1.1 2367 | 2368 | once@1.4.0: 2369 | dependencies: 2370 | wrappy: 1.0.2 2371 | 2372 | onetime@5.1.2: 2373 | dependencies: 2374 | mimic-fn: 2.1.0 2375 | 2376 | p-limit@2.3.0: 2377 | dependencies: 2378 | p-try: 2.2.0 2379 | 2380 | p-limit@3.1.0: 2381 | dependencies: 2382 | yocto-queue: 0.1.0 2383 | 2384 | p-locate@4.1.0: 2385 | dependencies: 2386 | p-limit: 2.3.0 2387 | 2388 | p-try@2.2.0: {} 2389 | 2390 | parse-json@5.2.0: 2391 | dependencies: 2392 | '@babel/code-frame': 7.26.2 2393 | error-ex: 1.3.2 2394 | json-parse-even-better-errors: 2.3.1 2395 | lines-and-columns: 1.2.4 2396 | 2397 | path-exists@4.0.0: {} 2398 | 2399 | path-is-absolute@1.0.1: {} 2400 | 2401 | path-key@3.1.1: {} 2402 | 2403 | path-parse@1.0.7: {} 2404 | 2405 | picocolors@1.1.1: {} 2406 | 2407 | picomatch@2.3.1: {} 2408 | 2409 | pirates@4.0.7: {} 2410 | 2411 | pkg-dir@4.2.0: 2412 | dependencies: 2413 | find-up: 4.1.0 2414 | 2415 | pretty-format@29.7.0: 2416 | dependencies: 2417 | '@jest/schemas': 29.6.3 2418 | ansi-styles: 5.2.0 2419 | react-is: 18.3.1 2420 | 2421 | prompts@2.4.2: 2422 | dependencies: 2423 | kleur: 3.0.3 2424 | sisteransi: 1.0.5 2425 | 2426 | pure-rand@6.1.0: {} 2427 | 2428 | react-is@18.3.1: {} 2429 | 2430 | require-directory@2.1.1: {} 2431 | 2432 | resolve-cwd@3.0.0: 2433 | dependencies: 2434 | resolve-from: 5.0.0 2435 | 2436 | resolve-from@5.0.0: {} 2437 | 2438 | resolve.exports@2.0.3: {} 2439 | 2440 | resolve@1.22.10: 2441 | dependencies: 2442 | is-core-module: 2.16.1 2443 | path-parse: 1.0.7 2444 | supports-preserve-symlinks-flag: 1.0.0 2445 | 2446 | semver@6.3.1: {} 2447 | 2448 | semver@7.7.1: {} 2449 | 2450 | shebang-command@2.0.0: 2451 | dependencies: 2452 | shebang-regex: 3.0.0 2453 | 2454 | shebang-regex@3.0.0: {} 2455 | 2456 | signal-exit@3.0.7: {} 2457 | 2458 | sisteransi@1.0.5: {} 2459 | 2460 | slash@3.0.0: {} 2461 | 2462 | source-map-support@0.5.13: 2463 | dependencies: 2464 | buffer-from: 1.1.2 2465 | source-map: 0.6.1 2466 | 2467 | source-map@0.6.1: {} 2468 | 2469 | sprintf-js@1.0.3: {} 2470 | 2471 | stack-utils@2.0.6: 2472 | dependencies: 2473 | escape-string-regexp: 2.0.0 2474 | 2475 | string-length@4.0.2: 2476 | dependencies: 2477 | char-regex: 1.0.2 2478 | strip-ansi: 6.0.1 2479 | 2480 | string-width@4.2.3: 2481 | dependencies: 2482 | emoji-regex: 8.0.0 2483 | is-fullwidth-code-point: 3.0.0 2484 | strip-ansi: 6.0.1 2485 | 2486 | strip-ansi@6.0.1: 2487 | dependencies: 2488 | ansi-regex: 5.0.1 2489 | 2490 | strip-bom@4.0.0: {} 2491 | 2492 | strip-final-newline@2.0.0: {} 2493 | 2494 | strip-json-comments@3.1.1: {} 2495 | 2496 | supports-color@7.2.0: 2497 | dependencies: 2498 | has-flag: 4.0.0 2499 | 2500 | supports-color@8.1.1: 2501 | dependencies: 2502 | has-flag: 4.0.0 2503 | 2504 | supports-preserve-symlinks-flag@1.0.0: {} 2505 | 2506 | test-exclude@6.0.0: 2507 | dependencies: 2508 | '@istanbuljs/schema': 0.1.3 2509 | glob: 7.2.3 2510 | minimatch: 3.1.2 2511 | 2512 | tmpl@1.0.5: {} 2513 | 2514 | to-regex-range@5.0.1: 2515 | dependencies: 2516 | is-number: 7.0.0 2517 | 2518 | ts-jest@29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.1))(typescript@5.8.3): 2519 | dependencies: 2520 | bs-logger: 0.2.6 2521 | ejs: 3.1.10 2522 | fast-json-stable-stringify: 2.1.0 2523 | jest: 29.7.0(@types/node@22.14.1) 2524 | jest-util: 29.7.0 2525 | json5: 2.2.3 2526 | lodash.memoize: 4.1.2 2527 | make-error: 1.3.6 2528 | semver: 7.7.1 2529 | type-fest: 4.40.0 2530 | typescript: 5.8.3 2531 | yargs-parser: 21.1.1 2532 | optionalDependencies: 2533 | '@babel/core': 7.26.10 2534 | '@jest/transform': 29.7.0 2535 | '@jest/types': 29.6.3 2536 | babel-jest: 29.7.0(@babel/core@7.26.10) 2537 | 2538 | type-detect@4.0.8: {} 2539 | 2540 | type-fest@0.21.3: {} 2541 | 2542 | type-fest@4.40.0: {} 2543 | 2544 | typescript@5.8.3: {} 2545 | 2546 | undici-types@6.21.0: {} 2547 | 2548 | update-browserslist-db@1.1.3(browserslist@4.24.4): 2549 | dependencies: 2550 | browserslist: 4.24.4 2551 | escalade: 3.2.0 2552 | picocolors: 1.1.1 2553 | 2554 | v8-to-istanbul@9.3.0: 2555 | dependencies: 2556 | '@jridgewell/trace-mapping': 0.3.25 2557 | '@types/istanbul-lib-coverage': 2.0.6 2558 | convert-source-map: 2.0.0 2559 | 2560 | walker@1.0.8: 2561 | dependencies: 2562 | makeerror: 1.0.12 2563 | 2564 | which@2.0.2: 2565 | dependencies: 2566 | isexe: 2.0.0 2567 | 2568 | wrap-ansi@7.0.0: 2569 | dependencies: 2570 | ansi-styles: 4.3.0 2571 | string-width: 4.2.3 2572 | strip-ansi: 6.0.1 2573 | 2574 | wrappy@1.0.2: {} 2575 | 2576 | write-file-atomic@4.0.2: 2577 | dependencies: 2578 | imurmurhash: 0.1.4 2579 | signal-exit: 3.0.7 2580 | 2581 | y18n@5.0.8: {} 2582 | 2583 | yallist@3.1.1: {} 2584 | 2585 | yargs-parser@21.1.1: {} 2586 | 2587 | yargs@17.7.2: 2588 | dependencies: 2589 | cliui: 8.0.1 2590 | escalade: 3.2.0 2591 | get-caller-file: 2.0.5 2592 | require-directory: 2.1.1 2593 | string-width: 4.2.3 2594 | y18n: 5.0.8 2595 | yargs-parser: 21.1.1 2596 | 2597 | yocto-queue@0.1.0: {} 2598 | -------------------------------------------------------------------------------- /src/_utils/createEffectWithTarget.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | DependencyList, 3 | EffectCallback, 4 | useEffect, 5 | useLayoutEffect 6 | } from "react" 7 | import { useRef } from "react" 8 | import { useUnmount } from "common-hook" 9 | import depsAreSame from "./depsAreSame" 10 | import { getTargetElement } from "./domTarget" 11 | 12 | const createEffectWithTarget = ( 13 | useEffectType: typeof useEffect | typeof useLayoutEffect 14 | ) => { 15 | /** 16 | * 17 | * @param effect 18 | * @param deps 19 | * @param target target should compare ref.current vs ref.current, dom vs dom, ()=>dom vs ()=>dom 20 | */ 21 | const useEffectWithTarget = ( 22 | // @ts-ignore 23 | effect: EffectCallback, 24 | // @ts-ignore 25 | deps: DependencyList, 26 | target: any 27 | ) => { 28 | const hasInitRef = useRef(false) 29 | // @ts-ignore 30 | const lastElementRef = useRef<(Element | null)[]>([]) 31 | // @ts-ignore 32 | const lastDepsRef = useRef([]) 33 | // @ts-ignore 34 | const unLoadRef = useRef() 35 | 36 | useEffectType(() => { 37 | const targets = Array.isArray(target) ? target : [target] 38 | const els = targets.map((item) => getTargetElement(item)) 39 | 40 | // init run 41 | if (!hasInitRef.current) { 42 | hasInitRef.current = true 43 | lastElementRef.current = els 44 | lastDepsRef.current = deps 45 | 46 | unLoadRef.current = effect() 47 | return 48 | } 49 | 50 | if ( 51 | els.length !== lastElementRef.current.length || 52 | !depsAreSame(els, lastElementRef.current) || 53 | !depsAreSame(deps, lastDepsRef.current) 54 | ) { 55 | unLoadRef.current?.() 56 | 57 | lastElementRef.current = els 58 | lastDepsRef.current = deps 59 | unLoadRef.current = effect() 60 | } 61 | }) 62 | 63 | useUnmount(() => { 64 | unLoadRef.current?.() 65 | // for react-refresh 66 | hasInitRef.current = false 67 | }) 68 | } 69 | 70 | return useEffectWithTarget 71 | } 72 | 73 | export default createEffectWithTarget 74 | -------------------------------------------------------------------------------- /src/_utils/depsAreSame.ts: -------------------------------------------------------------------------------- 1 | export default function depsAreSame(oldDeps: any, deps: any): boolean { 2 | if (oldDeps === deps) return true 3 | for (let i = 0; i < oldDeps.length; i++) { 4 | if (!Object.is(oldDeps[i], deps[i])) return false 5 | } 6 | return true 7 | } 8 | -------------------------------------------------------------------------------- /src/_utils/domTarget.ts: -------------------------------------------------------------------------------- 1 | import { isFunction, isBrowser } from "common-screw" 2 | 3 | type TargetValue = T | undefined | null 4 | 5 | type TargetType = HTMLElement | Element | Window | Document 6 | 7 | export function getTargetElement( 8 | target: any, 9 | defaultElement?: T 10 | ) { 11 | if (!isBrowser()) { 12 | return undefined 13 | } 14 | 15 | if (!target) { 16 | return defaultElement 17 | } 18 | 19 | let targetElement: TargetValue 20 | 21 | if (isFunction(target)) { 22 | targetElement = target() 23 | } else if ("current" in target) { 24 | targetElement = target.current 25 | } else { 26 | targetElement = target 27 | } 28 | 29 | return targetElement 30 | } 31 | -------------------------------------------------------------------------------- /src/_utils/useDeepCompareMemoize.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Jaina Xiong 3 | * @Email: 17761608@qq.com 4 | * @Date: 2025-08-05 19:29:25 5 | * @LastEditors: Jaina Xiong 6 | * @LastEditTime: 2025-08-05 19:52:16 7 | */ 8 | import { useRef, useMemo } from 'react' 9 | import { isEqual } from 'common-screw' 10 | 11 | export function useDeepCompareMemoize(dependencies: any) { 12 | const dependenciesRef = useRef(dependencies) 13 | const signalRef = useRef(0) 14 | 15 | if (!isEqual(dependencies, dependenciesRef.current)) { 16 | dependenciesRef.current = dependencies 17 | signalRef.current += 1 18 | } 19 | 20 | return useMemo(() => dependenciesRef.current, [signalRef.current]) 21 | } 22 | -------------------------------------------------------------------------------- /src/_utils/useEffectWithTarget.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react" 2 | import createEffectWithTarget from "./createEffectWithTarget" 3 | 4 | const useEffectWithTarget = createEffectWithTarget(useEffect) 5 | 6 | export default useEffectWithTarget 7 | -------------------------------------------------------------------------------- /src/_utils/useLayoutEffectWithTarget.ts: -------------------------------------------------------------------------------- 1 | import { useLayoutEffect } from "react" 2 | import createEffectWithTarget from "./createEffectWithTarget" 3 | 4 | const useEffectWithTarget = createEffectWithTarget(useLayoutEffect) 5 | 6 | export default useEffectWithTarget 7 | -------------------------------------------------------------------------------- /src/advanced/index.ts: -------------------------------------------------------------------------------- 1 | import { useLatest } from "./useLatest" 2 | 3 | export * from "./useLatest" 4 | 5 | /** 6 | * @name 辅助 Hooks 7 | * @example 8 | * useLatest // 返回的永远是最新值 9 | */ 10 | export const Advanced = { 11 | useLatest 12 | } 13 | -------------------------------------------------------------------------------- /src/advanced/useLatest.ts: -------------------------------------------------------------------------------- 1 | import { useRef } from "react" 2 | 3 | /** 4 | * @name 返回的永远是最新值 5 | * @description 返回当前最新值的 Hook,可以避免闭包问题 6 | * @example 7 | * useLatest(fn) 8 | */ 9 | export const useLatest = (value: any) => { 10 | const ref = useRef(value) 11 | ref.current = value 12 | 13 | return ref 14 | } 15 | -------------------------------------------------------------------------------- /src/dom/index.ts: -------------------------------------------------------------------------------- 1 | import { useEventListener } from "./useEventListener" 2 | import { useFavicon } from "./useFavicon" 3 | import { useHover } from "./useHover" 4 | import { useMouse } from "./useMouse" 5 | import { useTitle } from "./useTitle" 6 | 7 | export * from "./useEventListener" 8 | export * from "./useFavicon" 9 | export * from "./useHover" 10 | export * from "./useMouse" 11 | export * from "./useTitle" 12 | 13 | /** 14 | * @name 浏览器 Hooks 15 | * @example 16 | * useEventListener // 事件监听 17 | * useTitle // 设置页面标题 18 | * useFavicon // 设置页面favicon 19 | * useHover // 监听DOM元素是否鼠标悬停 20 | * useMouse // 监听鼠标位置 21 | */ 22 | export const Dom = { 23 | useEventListener, 24 | useFavicon, 25 | useHover, 26 | useMouse, 27 | useTitle 28 | } 29 | -------------------------------------------------------------------------------- /src/dom/useEventListener.ts: -------------------------------------------------------------------------------- 1 | import { useLatest } from "common-hook" 2 | import { getTargetElement } from "../_utils/domTarget" 3 | import useEffectWithTarget from "../_utils/useEffectWithTarget" 4 | 5 | type noop = (...p: any) => void 6 | 7 | /** 8 | * @name 事件监听 9 | * @description 优雅的使用 addEventListener 10 | * @example 11 | * useEventListener('click', 12 | * () => {setValue(value + 1)} 13 | * ,{ target: ref }); 14 | */ 15 | export const useEventListener = ( 16 | eventName: string, 17 | handler: noop, 18 | options: any = {} 19 | ) => { 20 | const handlerRef = useLatest(handler) 21 | 22 | useEffectWithTarget( 23 | () => { 24 | const targetElement = getTargetElement(options.target, window) 25 | if (!targetElement?.addEventListener) { 26 | return 27 | } 28 | 29 | const eventListener = (event: Event) => { 30 | return handlerRef.current(event) 31 | } 32 | 33 | targetElement.addEventListener(eventName, eventListener, { 34 | capture: options.capture, 35 | once: options.once, 36 | passive: options.passive 37 | }) 38 | 39 | return () => { 40 | targetElement.removeEventListener(eventName, eventListener, { 41 | capture: options.capture 42 | }) 43 | } 44 | }, 45 | [eventName, options.capture, options.once, options.passive], 46 | options.target 47 | ) 48 | } 49 | -------------------------------------------------------------------------------- /src/dom/useFavicon.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react" 2 | 3 | const ImgTypeMap = { 4 | SVG: "image/svg+xml", 5 | ICO: "image/x-icon", 6 | GIF: "image/gif", 7 | PNG: "image/png" 8 | } 9 | 10 | type ImgTypes = keyof typeof ImgTypeMap 11 | 12 | /** 13 | * @name 设置页面favicon 14 | * @example 15 | * useFavicon(url) 16 | */ 17 | export const useFavicon = (href: string) => { 18 | useEffect(() => { 19 | if (!href) return 20 | 21 | const cutUrl = href.split(".") 22 | const imgSuffix = cutUrl[cutUrl.length - 1].toLocaleUpperCase() as ImgTypes 23 | 24 | const link: HTMLLinkElement = 25 | document.querySelector("link[rel*='icon']") || 26 | document.createElement("link") 27 | 28 | link.type = ImgTypeMap[imgSuffix] 29 | link.href = href 30 | link.rel = "shortcut icon" 31 | 32 | document.getElementsByTagName("head")[0].appendChild(link) 33 | }, [href]) 34 | } 35 | -------------------------------------------------------------------------------- /src/dom/useHover.ts: -------------------------------------------------------------------------------- 1 | import { useBoolean, useEventListener } from "common-hook" 2 | 3 | export interface Options { 4 | onEnter?: () => void 5 | onLeave?: () => void 6 | onChange?: (isHovering: boolean) => void 7 | } 8 | 9 | /** 10 | * @name 监听DOM元素是否鼠标悬停 11 | * @example 12 | * const isHovering = useHover(ref) 13 | */ 14 | export const useHover = (target: any, options?: Options): boolean => { 15 | const { onEnter, onLeave, onChange } = options || {} 16 | 17 | const [state, { setTrue, setFalse }] = useBoolean(false) 18 | 19 | useEventListener( 20 | "mouseenter", 21 | () => { 22 | onEnter?.() 23 | setTrue() 24 | onChange?.(true) 25 | }, 26 | { 27 | target 28 | } 29 | ) 30 | 31 | useEventListener( 32 | "mouseleave", 33 | () => { 34 | onLeave?.() 35 | setFalse() 36 | onChange?.(false) 37 | }, 38 | { 39 | target 40 | } 41 | ) 42 | 43 | return state 44 | } 45 | -------------------------------------------------------------------------------- /src/dom/useMouse.ts: -------------------------------------------------------------------------------- 1 | import { useRafState, useEventListener } from "common-hook" 2 | import { getTargetElement } from "../_utils/domTarget" 3 | 4 | /** 5 | * @name 监听鼠标位置 6 | * @example 7 | * const mouse = useMouse() 8 | */ 9 | 10 | export interface CursorState { 11 | screenX: number 12 | screenY: number 13 | clientX: number 14 | clientY: number 15 | pageX: number 16 | pageY: number 17 | elementX: number 18 | elementY: number 19 | elementH: number 20 | elementW: number 21 | elementPosX: number 22 | elementPosY: number 23 | } 24 | 25 | const initState: CursorState = { 26 | screenX: NaN, 27 | screenY: NaN, 28 | clientX: NaN, 29 | clientY: NaN, 30 | pageX: NaN, 31 | pageY: NaN, 32 | elementX: NaN, 33 | elementY: NaN, 34 | elementH: NaN, 35 | elementW: NaN, 36 | elementPosX: NaN, 37 | elementPosY: NaN 38 | } 39 | 40 | export const useMouse = (target?: any) => { 41 | const [state, setState] = useRafState(initState) 42 | 43 | useEventListener( 44 | "mousemove", 45 | (event: MouseEvent) => { 46 | const { screenX, screenY, clientX, clientY, pageX, pageY } = event 47 | const newState = { 48 | screenX, 49 | screenY, 50 | clientX, 51 | clientY, 52 | pageX, 53 | pageY, 54 | elementX: NaN, 55 | elementY: NaN, 56 | elementH: NaN, 57 | elementW: NaN, 58 | elementPosX: NaN, 59 | elementPosY: NaN 60 | } 61 | const targetElement: any = getTargetElement(target) 62 | if (targetElement) { 63 | const { left, top, width, height } = 64 | targetElement.getBoundingClientRect() 65 | newState.elementPosX = left + window.pageXOffset 66 | newState.elementPosY = top + window.pageYOffset 67 | newState.elementX = pageX - newState.elementPosX 68 | newState.elementY = pageY - newState.elementPosY 69 | newState.elementW = width 70 | newState.elementH = height 71 | } 72 | setState(newState) 73 | }, 74 | { 75 | target: () => document 76 | } 77 | ) 78 | 79 | return state 80 | } 81 | -------------------------------------------------------------------------------- /src/dom/useTitle.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react" 2 | 3 | /** 4 | * @name 设置页面标题 5 | * @example 6 | * useTitle('Page Title') 7 | */ 8 | export const useTitle = (title: string) => { 9 | useEffect(() => { 10 | document.title = title 11 | }, [title]) 12 | } 13 | -------------------------------------------------------------------------------- /src/effect/index.ts: -------------------------------------------------------------------------------- 1 | import { useAsyncEffect } from "./useAsyncEffect" 2 | import { useDebounceEffect } from "./useDebounceEffect" 3 | import { useDebounceFn } from "./useDebounceFn" 4 | import { useDeepCompareEffect } from "./useDeepCompareEffect" 5 | import { useInterval } from "./useInterval" 6 | import { useLockFn } from "./useLockFn" 7 | import { useThrottleEffect } from "./useThrottleEffect" 8 | import { useThrottleFn } from "./useThrottleFn" 9 | import { useTimeout } from "./useTimeout" 10 | import { useUpdateEffect } from "./useUpdateEffect" 11 | 12 | export * from "./useAsyncEffect" 13 | export * from "./useDebounceEffect" 14 | export * from "./useDebounceFn" 15 | export * from "./useDeepCompareEffect" 16 | export * from "./useInterval" 17 | export * from "./useLockFn" 18 | export * from "./useThrottleEffect" 19 | export * from "./useThrottleFn" 20 | export * from "./useTimeout" 21 | export * from "./useUpdateEffect" 22 | 23 | /** 24 | * @name Effect Hooks 25 | * @example 26 | * useUpdateEffect // 首次不执行,只在依赖项更新时执行 27 | * useDeepCompareEffect // 依赖项更新时,深度比较 28 | * useAsyncEffect // 支持异步函数 29 | * useLockFn // 给一个异步函数增加竞态锁,防止并发执行 30 | * useDebounceEffect // useEffect+防抖 31 | * useDebounceFn // 处理防抖函数的Hook 32 | * useThrottleEffect // useEffect+节流 33 | * useThrottleFn // 处理函数节流的Hook 34 | * useInterval // 处理setInterval的Hook 35 | * useTimeout // 处理setTimeout的Hook 36 | */ 37 | export const Effect = { 38 | useAsyncEffect, 39 | useDebounceEffect, 40 | useDebounceFn, 41 | useDeepCompareEffect, 42 | useInterval, 43 | useLockFn, 44 | useThrottleEffect, 45 | useThrottleFn, 46 | useTimeout, 47 | useUpdateEffect 48 | } 49 | -------------------------------------------------------------------------------- /src/effect/useAsyncEffect.ts: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | 3 | import { useEffect } from "react" 4 | import { isFunction } from "common-screw" 5 | 6 | /** 7 | * @name 支持异步函数 8 | * @description 例如:组件加载时进行异步的检查 9 | * @example 10 | * useAsyncEffect(async () => {setPass(await mockCheck())}, []); 11 | */ 12 | export const useAsyncEffect = ( 13 | effect: () => AsyncGenerator | Promise, 14 | deps?: any 15 | ) => { 16 | const isAsyncGenerator = ( 17 | val: any 18 | ): val is AsyncGenerator => { 19 | return isFunction(val[Symbol.asyncIterator]) 20 | } 21 | useEffect(() => { 22 | const e = effect() 23 | let cancelled = false 24 | async function execute() { 25 | if (isAsyncGenerator(e)) { 26 | while (true) { 27 | const result = await e.next() 28 | if (result.done || cancelled) { 29 | break 30 | } 31 | } 32 | } else { 33 | await e 34 | } 35 | } 36 | execute() 37 | return () => { 38 | cancelled = true 39 | } 40 | }, deps) 41 | } 42 | -------------------------------------------------------------------------------- /src/effect/useDebounceEffect.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react" 2 | import { useDebounceFn, useUpdateEffect } from "common-hook" 3 | 4 | /** 5 | * @name useEffect+防抖 6 | * @description 7 | * 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 8 | * @example 9 | * useDebounceEffect( 10 | () => { 11 | setRecords((val) => [...val, value]) 12 | }, 13 | [value], 14 | { wait: 1000 } 15 | ) 16 | */ 17 | export const useDebounceEffect = (effect: any, deps?: any, options?: any) => { 18 | const [flag, setFlag] = useState({}) 19 | 20 | const { run } = useDebounceFn(() => { 21 | setFlag({}) 22 | }, options) 23 | 24 | useEffect(() => { 25 | return run() 26 | }, deps) 27 | useUpdateEffect(effect, [flag]) 28 | } 29 | -------------------------------------------------------------------------------- /src/effect/useDebounceFn.ts: -------------------------------------------------------------------------------- 1 | import { useMemo } from "react" 2 | import { useLatest, useUnmount } from "common-hook" 3 | import { debounce } from "common-screw" 4 | 5 | type noop = (...args: any) => any 6 | 7 | /** 8 | * @name 处理防抖函数的Hook 9 | * @description 10 | * 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 11 | * @example 12 | * const { run } = useDebounceFn( 13 | () => { 14 | setValue(value + 1) 15 | }, 16 | { 17 | wait: 500 18 | } 19 | ) 20 | */ 21 | export const useDebounceFn = (fn: T, options?: any) => { 22 | const fnRef = useLatest(fn) 23 | 24 | const wait = options?.wait ?? 1000 25 | 26 | const debounced = useMemo( 27 | () => 28 | debounce( 29 | (...args: Parameters): ReturnType => { 30 | // @ts-ignore 31 | return fnRef.current(...args) 32 | }, 33 | wait, 34 | options 35 | ), 36 | [] 37 | ) 38 | 39 | useUnmount(() => { 40 | debounced.cancel() 41 | }) 42 | 43 | return { 44 | run: debounced, 45 | cancel: debounced.cancel, 46 | flush: debounced.flush 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/effect/useDeepCompareEffect.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Jaina Xiong 3 | * @Email: 17761608@qq.com 4 | * @Date: 2025-07-09 12:43:07 5 | * @LastEditors: Jaina Xiong 6 | * @LastEditTime: 2025-08-05 19:36:14 7 | */ 8 | import { useEffect } from 'react' 9 | import { useDeepCompareMemoize } from '../_utils/useDeepCompareMemoize' 10 | 11 | /** 12 | * @name 依赖项更新时,深度比较 13 | * @description 14 | * 依赖项更新时,对输入进行深度比较,而不是引用相等 15 | * @example 16 | * useDeepCompareEffect( 17 | () => { 18 | // make an HTTP request or whatever with the query and variables 19 | // optionally return a cleanup function if necessary 20 | },[query, variables],) 21 | */ 22 | export const useDeepCompareEffect = (effect: any, dependencies: any) => { 23 | useEffect(effect, useDeepCompareMemoize(dependencies)) 24 | } 25 | -------------------------------------------------------------------------------- /src/effect/useInterval.ts: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | 3 | import { useCallback, useEffect, useRef } from "react" 4 | import { useLatest } from "common-hook" 5 | import { isNumber } from "common-screw" 6 | 7 | /** 8 | * @name 处理setInterval的Hook 9 | * @description 例如:每1000ms,执行一次 10 | * @example 11 | * useInterval(() => { 12 | setCount(count + 1); 13 | }, 1000); 14 | */ 15 | export const useInterval = ( 16 | fn: () => void, 17 | delay: number | undefined, 18 | options?: { 19 | immediate?: boolean 20 | } 21 | ) => { 22 | const immediate = options?.immediate 23 | 24 | const fnRef = useLatest(fn) 25 | const timerRef = useRef() 26 | 27 | useEffect(() => { 28 | //@ts-ignore 29 | if (!isNumber(delay) || delay < 0) return 30 | 31 | if (immediate) { 32 | fnRef.current() 33 | } 34 | timerRef.current = setInterval(() => { 35 | fnRef.current() 36 | }, delay) 37 | return () => { 38 | if (timerRef.current) { 39 | clearInterval(timerRef.current as NodeJS.Timer) 40 | } 41 | } 42 | }, [delay]) 43 | 44 | const clear = useCallback(() => { 45 | if (timerRef.current) { 46 | clearInterval(timerRef.current as NodeJS.Timer) 47 | } 48 | }, []) 49 | 50 | return clear 51 | } 52 | -------------------------------------------------------------------------------- /src/effect/useLockFn.ts: -------------------------------------------------------------------------------- 1 | import { useRef, useCallback } from "react" 2 | 3 | /** 4 | * @name 给一个异步函数增加竞态锁,防止并发执行 5 | * @description 在 submit 函数执行完成前,其余的点击动作都会被忽略。 6 | * @example 7 | * const submit = useLockFn(async () => { 8 | await mockApiRequest(); 9 | setCount((val) => val + 1); 10 | }); 11 | */ 12 | export const useLockFn =

( 13 | fn: (...args: P) => Promise 14 | ) => { 15 | const lockRef = useRef(false) 16 | 17 | return useCallback( 18 | async (...args: P) => { 19 | if (lockRef.current) return 20 | lockRef.current = true 21 | try { 22 | const ret = await fn(...args) 23 | lockRef.current = false 24 | return ret 25 | } catch (e) { 26 | lockRef.current = false 27 | throw e 28 | } 29 | }, 30 | [fn] 31 | ) 32 | } 33 | -------------------------------------------------------------------------------- /src/effect/useThrottleEffect.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react" 2 | import { useThrottleFn, useUpdateEffect } from "common-hook" 3 | 4 | /** 5 | * @name useEffect+节流 6 | * @description 7 | * 规定在时间内,只能触发一次函数。如果这个时间内触发多次函数,只有一次生效 8 | * @example 9 | * useThrottleEffect( 10 | () => { 11 | setRecords((val) => [...val, value]) 12 | }, 13 | [value], 14 | { 15 | wait: 1000 16 | } 17 | ) 18 | */ 19 | export const useThrottleEffect = (effect: any, deps?: any, options?: any) => { 20 | const [flag, setFlag] = useState({}) 21 | 22 | const { run } = useThrottleFn(() => { 23 | setFlag({}) 24 | }, options) 25 | 26 | useEffect(() => { 27 | return run() 28 | }, deps) 29 | 30 | useUpdateEffect(effect, [flag]) 31 | } 32 | -------------------------------------------------------------------------------- /src/effect/useThrottleFn.ts: -------------------------------------------------------------------------------- 1 | import { useMemo } from "react" 2 | import { useUnmount, useLatest } from "common-hook" 3 | import { throttle } from "common-screw" 4 | 5 | type noop = (...args: any) => any 6 | 7 | /** 8 | * @name 处理函数节流的Hook 9 | * @description 10 | * 规定在时间内,只能触发一次函数。如果这个时间内触发多次函数,只有一次生效 11 | * @example 12 | * const { run } = useThrottleFn( 13 | () => { 14 | setValue(value + 1); 15 | }, 16 | { wait: 500 }, 17 | ); 18 | */ 19 | export const useThrottleFn = (fn: T, options?: any) => { 20 | const fnRef = useLatest(fn) 21 | 22 | const wait = options?.wait ?? 1000 23 | 24 | const throttled = useMemo( 25 | () => 26 | throttle( 27 | (...args: Parameters): ReturnType => { 28 | // @ts-ignore 29 | return fnRef.current(...args) 30 | }, 31 | wait, 32 | options 33 | ), 34 | [] 35 | ) 36 | 37 | useUnmount(() => { 38 | throttled.cancel() 39 | }) 40 | 41 | return { 42 | run: throttled, 43 | cancel: throttled.cancel, 44 | flush: throttled.flush 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/effect/useTimeout.ts: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | import { useCallback, useEffect, useRef } from "react" 3 | import { useLatest } from "common-hook" 4 | import { isNumber } from "common-screw" 5 | 6 | /** 7 | * @name 处理setTimeout的Hook 8 | * @description 例如:3000ms 后执行一次 9 | * @example 10 | * useTimeout(() => {setState(state + 1)}, 3000) 11 | */ 12 | export const useTimeout = (fn: () => void, delay: number | undefined) => { 13 | const fnRef = useLatest(fn) 14 | const timerRef = useRef() 15 | 16 | useEffect(() => { 17 | //@ts-ignore 18 | if (!isNumber(delay) || delay < 0) return 19 | 20 | timerRef.current = setTimeout(() => { 21 | fnRef.current() 22 | }, delay) 23 | return () => { 24 | if (timerRef.current) { 25 | clearTimeout(timerRef.current as NodeJS.Timer) 26 | } 27 | } 28 | }, [delay]) 29 | 30 | const clear = useCallback(() => { 31 | if (timerRef.current) { 32 | clearTimeout(timerRef.current as NodeJS.Timer) 33 | } 34 | }, []) 35 | 36 | return clear 37 | } 38 | -------------------------------------------------------------------------------- /src/effect/useUpdateEffect.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react" 2 | import type { useEffect as useEffectType, useLayoutEffect } from "react" 3 | 4 | type EffectHookType = typeof useEffectType | typeof useLayoutEffect 5 | 6 | const createUpdateEffect: (hook: EffectHookType) => EffectHookType = 7 | (hook) => (effect: any, deps: any) => { 8 | const isMounted = useRef(false) 9 | hook(() => { 10 | return () => { 11 | isMounted.current = false 12 | } 13 | }, []) 14 | 15 | hook(() => { 16 | if (!isMounted.current) { 17 | isMounted.current = true 18 | } else { 19 | return effect() 20 | } 21 | }, deps) 22 | } 23 | 24 | /** 25 | * @name 首次不执行,只在依赖项更新时执行 26 | * @description 使用上与useEffect完全相同,只是它忽略了首次执行,只在依赖项更新时执行 27 | * @example 28 | * useUpdateEffect(() => { 29 | setUpdateEffectCount((c) => c + 1); 30 | }, [count]); 31 | */ 32 | export const useUpdateEffect = createUpdateEffect(useEffect) 33 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./advanced" // 辅助 Hooks 2 | export * from "./dom" // 浏览器 Hooks 3 | export * from "./effect" // Effect Hooks 4 | export * from "./lifeCycle" // 生命周期 Hooks 5 | export * from "./state" // 状态 Hooks 6 | -------------------------------------------------------------------------------- /src/lifeCycle/index.ts: -------------------------------------------------------------------------------- 1 | import { useMount } from "./useMount" 2 | import { useUnmount } from "./useUnmount" 3 | 4 | export * from "./useMount" 5 | export * from "./useUnmount" 6 | 7 | /** 8 | * @name 生命周期 Hooks 9 | * @example 10 | * useMount // 在组件首次渲染时,执行方法 11 | * useUnmount // 在组件卸载时,执行函数 12 | */ 13 | export const LifeCycle = { 14 | useMount, 15 | useUnmount 16 | } 17 | -------------------------------------------------------------------------------- /src/lifeCycle/useMount.ts: -------------------------------------------------------------------------------- 1 | //@ts-ignore 2 | import { useEffect } from "react" 3 | 4 | /** 5 | * @name 在组件首次渲染时,执行方法 6 | * @description 只在组件初始化时执行的 Hook 7 | * @example 8 | * useMount(fn) 9 | */ 10 | export const useMount = (fn: () => void) => { 11 | useEffect(() => { 12 | fn?.() 13 | }, []) 14 | } 15 | -------------------------------------------------------------------------------- /src/lifeCycle/useUnmount.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react" 2 | import { useLatest } from "common-hook" 3 | 4 | /** 5 | * @name 在组件卸载时,执行函数 6 | * @description 在组件卸载(unmount)时执行的 Hook 7 | * @example 8 | * useUnmount(fn) 9 | */ 10 | export const useUnmount = (fn: () => void) => { 11 | const fnRef = useLatest(fn) 12 | 13 | useEffect( 14 | () => () => { 15 | fnRef.current() 16 | }, 17 | [] 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /src/state/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Jaina Xiong 3 | * @Email: 17761608@qq.com 4 | * @Date: 2025-07-09 12:43:07 5 | * @LastEditors: Jaina Xiong 6 | * @LastEditTime: 2025-08-13 20:31:14 7 | */ 8 | import { useBoolean } from './useBoolean' 9 | import { useDebounce } from './useDebounce' 10 | import { useRafState } from './useRafState' 11 | import { useSetState } from './useSetState' 12 | import { useThrottle } from './useThrottle' 13 | import { useToggle } from './useToggle' 14 | 15 | export * from './useBoolean' 16 | export * from './useDebounce' 17 | export * from './useRafState' 18 | export * from './useSetState' 19 | export * from './useThrottle' 20 | export * from './useToggle' 21 | 22 | /** 23 | * @name 状态 Hooks 24 | * @example 25 | * useSetState // 管理 object 类型 state 的 Hooks 26 | * useBoolean // 切换boolean,可以接收默认值 27 | * useToggle // 用于在两个状态值间切换Hook 28 | * useDebounce // 处理防抖值Hook 29 | * useThrottle // 处理节流值Hook 30 | * useRafState // 只在 requestAnimationFrame callback 时更新 state 31 | */ 32 | export const State = { 33 | useBoolean, 34 | useDebounce, 35 | useRafState, 36 | useSetState, 37 | useThrottle, 38 | useToggle 39 | } 40 | 41 | //写一个hook的计数器 有加减的分别按钮的点击事件,不要ts 42 | -------------------------------------------------------------------------------- /src/state/useBoolean.ts: -------------------------------------------------------------------------------- 1 | import { useMemo } from "react" 2 | import { useToggle } from "common-hook" 3 | 4 | /** 5 | * @name 切换boolean,可以接收默认值 6 | * @example 7 | * const [state, { toggle, setTrue, setFalse }] = useBoolean(true) 8 | */ 9 | export const useBoolean = (defaultValue = false) => { 10 | const [state, { toggle, set }] = useToggle(defaultValue) 11 | 12 | const actions = useMemo(() => { 13 | const setTrue = () => set(true) 14 | const setFalse = () => set(false) 15 | return { 16 | toggle, 17 | set: (v: any) => set(!!v), 18 | setTrue, 19 | setFalse 20 | } 21 | }, []) 22 | 23 | return [state, actions] 24 | } 25 | -------------------------------------------------------------------------------- /src/state/useDebounce.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react" 2 | import { useDebounceFn } from "common-hook" 3 | 4 | /** 5 | * @name 处理防抖值Hook 6 | * @description 7 | * 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时 8 | * @example 9 | * const debouncedValue = useDebounce(value, { wait: 500 }) 10 | */ 11 | export const useDebounce = (value: any, options?: any) => { 12 | const [debounced, setDebounced] = useState(value) 13 | 14 | const { run } = useDebounceFn(() => { 15 | setDebounced(value) 16 | }, options) 17 | 18 | useEffect(() => { 19 | run() 20 | }, [value]) 21 | 22 | return debounced 23 | } 24 | -------------------------------------------------------------------------------- /src/state/useRafState.ts: -------------------------------------------------------------------------------- 1 | import { useCallback, useRef, useState } from "react" 2 | import type { Dispatch, SetStateAction } from "react" 3 | import { useUnmount } from "common-hook" 4 | 5 | /** 6 | * @name 只在 requestAnimationFrame callback 时更新 state 7 | * @description 一般用于性能优化 8 | * @example 9 | * const [state, setState] = useRafState({ width: 0,height: 0}) 10 | */ 11 | export const useRafState = (initialState?: S | (() => S)) => { 12 | const ref = useRef(0) 13 | const [state, setState] = useState(initialState) 14 | 15 | const setRafState = useCallback((value: S | ((prevState: S) => S)) => { 16 | cancelAnimationFrame(ref.current) 17 | 18 | ref.current = requestAnimationFrame(() => { 19 | setState(value) 20 | }) 21 | }, []) 22 | 23 | useUnmount(() => { 24 | cancelAnimationFrame(ref.current) 25 | }) 26 | 27 | return [state, setRafState] as const 28 | } 29 | -------------------------------------------------------------------------------- /src/state/useSetState.ts: -------------------------------------------------------------------------------- 1 | import { useCallback, useState } from "react" 2 | import { isFunction } from "common-screw" 3 | 4 | type SetState> = ( 5 | state: Pick | null | ((prevState: Readonly) => Pick | S | null) 6 | ) => void 7 | 8 | /** 9 | * @name 管理 object 类型 state 的 Hooks 10 | * @description 用法与 class 组件的 this.setState 基本一致 11 | * @example 12 | * const [state, setState] = useSetState({hello: '',count: 0}) 13 | */ 14 | export const useSetState = >( 15 | initialState: S | (() => S) 16 | ): [S, SetState] => { 17 | const [state, setState] = useState(initialState) 18 | 19 | const setMergeState = useCallback((patch: any) => { 20 | setState((prevState: any) => { 21 | const newState = isFunction(patch) ? patch(prevState) : patch 22 | return newState ? { ...prevState, ...newState } : prevState 23 | }) 24 | }, []) 25 | 26 | return [state, setMergeState] 27 | } 28 | -------------------------------------------------------------------------------- /src/state/useThrottle.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react" 2 | import { useThrottleFn } from "common-hook" 3 | 4 | /** 5 | * @name 处理节流值Hook 6 | * @description 7 | * 规定在时间内,只能触发一次函数。如果这个时间内触发多次函数,只有一次生效 8 | * @example 9 | * const throttledValue = useThrottle(value, { wait: 500 }) 10 | */ 11 | export const useThrottle = (value: T, options?: any) => { 12 | const [throttled, setThrottled] = useState(value) 13 | 14 | const { run } = useThrottleFn(() => { 15 | setThrottled(value) 16 | }, options) 17 | 18 | useEffect(() => { 19 | run() 20 | }, [value]) 21 | 22 | return throttled 23 | } 24 | -------------------------------------------------------------------------------- /src/state/useToggle.ts: -------------------------------------------------------------------------------- 1 | import { useMemo, useState } from "react" 2 | 3 | /** 4 | * @name 用于在两个状态值间切换Hook 5 | * @description 默认为 boolean 切换,基础用法与 useBoolean 一致 6 | * @example 7 | * const [state, { toggle, setLeft, setRight }] = useToggle() 8 | */ 9 | export const useToggle = ( 10 | defaultValue: D = false as unknown as D, 11 | reverseValue?: R 12 | ) => { 13 | const [state, setState] = useState(defaultValue) 14 | 15 | const actions = useMemo(() => { 16 | const reverseValueOrigin = ( 17 | reverseValue === undefined ? !defaultValue : reverseValue 18 | ) as D | R 19 | 20 | const toggle = () => 21 | setState((s: any) => 22 | s === defaultValue ? reverseValueOrigin : defaultValue 23 | ) 24 | const set = (value: D | R) => setState(value) 25 | const setLeft = () => setState(defaultValue) 26 | const setRight = () => setState(reverseValueOrigin) 27 | 28 | return { 29 | toggle, 30 | set, 31 | setLeft, 32 | setRight 33 | } 34 | }, []) 35 | 36 | return [state, actions] 37 | } 38 | -------------------------------------------------------------------------------- /src/typings/index.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Jaina Xiong 3 | * @Email: 17761608@qq.com 4 | * @Date: 2025-07-09 12:43:07 5 | * @LastEditors: Jaina Xiong 6 | * @LastEditTime: 2025-08-05 19:52:27 7 | */ 8 | declare module 'react' 9 | declare module 'common-hook' 10 | declare module 'common-screw' 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 8 | "module": "es2015" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | "declaration": true /* Generates corresponding '.d.ts' file. */, 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./es" /* Redirect output structure to the directory. */, 18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | /* Strict Type-Checking Options */ 27 | "strict": true /* Enable all strict type-checking options. */, 28 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 29 | // "strictNullChecks": true, /* Enable strict null checks. */ 30 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 31 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 32 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 33 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 34 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 35 | 36 | /* Additional Checks */ 37 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 38 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 39 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 40 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 41 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 42 | 43 | /* Module Resolution Options */ 44 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | 65 | /* Advanced Options */ 66 | "skipLibCheck": true /* Skip type checking of declaration files. */, 67 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 68 | }, 69 | "include": ["./src"], 70 | "exclude": ["node_modules", "es", "**/test", "src/_testComponent"] 71 | } 72 | --------------------------------------------------------------------------------